user-0 提问: C函数运行时地址

回复:
user: user-1
content: 引用 6 楼 zxc024000 的回复:Ubuntun gcc5.4，尝试了一下上述程序。输出的main地址，以及objdump出的地址，都是统一的。  这类东西，应该跟编译器（g++/gcc)自身有关。比如clang和gcc/g++，对c++的优化就有很多差别。  建议看看gcc7列出的改动的地方吧。 https://gcc.gnu.org/gcc-7/changes.html 挺好的，不错可以看看。

user: user-0
content: 引用 6 楼 zxc024000 的回复:Ubuntun gcc5.4，尝试了一下上述程序。输出的main地址，以及objdump出的地址，都是统一的。  这类东西，应该跟编译器（g++/gcc)自身有关。比如clang和gcc/g++，对c++的优化就有很多差别。  建议看看gcc7列出的改动的地方吧。 https://gcc.gnu.org/gcc-7/changes.html附加的链接资源不错

user: user-2
content: 跟操作系统有关，较新的操作系统普遍使用一种安全技术，称之为 Address Space Layout Randomization (ASLR)，每次加载可执行文件（.exe、.dll之类的）都放在一个随机起始地址，甚至操作系统核心，每次启动时也加载到随机地址（都是一个范围，不是任意的），而不是固定地址。这样做是为了防止恶意程序针对缺陷代码进行攻击。

user: user-3
content: Ubuntun gcc5.4，尝试了一下上述程序。输出的main地址，以及objdump出的地址，都是统一的。  这类东西，应该跟编译器（g++/gcc)自身有关。比如clang和gcc/g++，对c++的优化就有很多差别。  建议看看gcc7列出的改动的地方吧。 https://gcc.gnu.org/gcc-7/changes.html

user: user-0
content: 引用 7 楼 DelphiGuy 的回复:跟操作系统有关，较新的操作系统普遍使用一种安全技术，称之为 Address Space Layout Randomization (ASLR)，每次加载可执行文件（.exe、.dll之类的）都放在一个随机起始地址，甚至操作系统核心，每次启动时也加载到随机地址（都是一个范围，不是任意的），而不是固定地址。这样做是为了防止恶意程序针对缺陷代码进行攻击。 addr2line版本没跟上？

user: user-4
content: 引用 7 楼 DelphiGuy 的回复:跟操作系统有关，较新的操作系统普遍使用一种安全技术，称之为 Address Space Layout Randomization (ASLR)，每次加载可执行文件（.exe、.dll之类的）都放在一个随机起始地址，甚至操作系统核心，每次启动时也加载到随机地址（都是一个范围，不是任意的），而不是固定地址。这样做是为了防止恶意程序针对缺陷代码进行攻击。 防君子防不了小人； 防菜鸟防不了大神。

user: user-5
content: 可以了解下虚拟地址

user: user-0
content: 引用 3 楼 misskissC 的回复:[quote=引用 2 楼 misskissC 的回复:] [quote=引用 1 楼 user-6 的回复:] 这种地址是随机的我的疑问： [1] 跟 附 中的内容还是有关系的哈。虚拟地址是随机的完全可以被理解，问题在于 跟其配套的addr2line没法使用该随机地址。 [2] 期待您给结论附个原因  另外，比如在centos上，就不存在这个问题。 /* gcc version 4.8.5 (Red Hat 4.8.5-28) */ #include <stdio.h>   int main(void) {     return printf("main=%p\n", main); }  gcc main.c -o main ./main 0x40051d  ./main 0x40051d  ./main 0x40051d  objdump -ds main  000000000040051d <main>:  ....  addr2line -e main 0x40051d -f main ??:?  [/quote]  Linux下查看 进程 虚拟地址空间：  #include <stdio.h>  int main(void) {     printf("main=%p\n", main);     while (1);     return 0; }   gcc vaddr.c -o vaddr ./vaddr & main=0x55be8d47264a [1] 1798  cat /proc/1798/maps 55be8d472000-55be8d473000 r-xp 00000000 08:01 264241                     /home/lgt/workspace/vaddr/vaddr 55be8d672000-55be8d673000 r--p 00000000 08:01 264241                     /home/lgt/workspace/vaddr/vaddr 55be8d673000-55be8d674000 rw-p 00001000 08:01 264241                     /home/lgt/workspace/vaddr/vaddr 55be8d963000-55be8d984000 rw-p 00000000 00:00 0                          [heap] 7f1c8e21e000-7f1c8e405000 r-xp 00000000 08:01 1185760                    /lib/x86_64-linux-gnu/libc-2.27.so 7f1c8e405000-7f1c8e605000 ---p 001e7000 08:01 1185760                    /lib/x86_64-linux-gnu/libc-2.27.so 7f1c8e605000-7f1c8e609000 r--p 001e7000 08:01 1185760                    /lib/x86_64-linux-gnu/libc-2.27.so 7f1c8e609000-7f1c8e60b000 rw-p 001eb000 08:01 1185760                    /lib/x86_64-linux-gnu/libc-2.27.so 7f1c8e60b000-7f1c8e60f000 rw-p 00000000 00:00 0 7f1c8e60f000-7f1c8e636000 r-xp 00000000 08:01 1185732                    /lib/x86_64-linux-gnu/ld-2.27.so 7f1c8e822000-7f1c8e824000 rw-p 00000000 00:00 0 7f1c8e836000-7f1c8e837000 r--p 00027000 08:01 1185732                    /lib/x86_64-linux-gnu/ld-2.27.so 7f1c8e837000-7f1c8e838000 rw-p 00028000 08:01 1185732                    /lib/x86_64-linux-gnu/ld-2.27.so 7f1c8e838000-7f1c8e839000 rw-p 00000000 00:00 0 7ffe47da3000-7ffe47dc4000 rw-p 00000000 00:00 0                          [stack] 7ffe47dd7000-7ffe47dda000 r--p 00000000 00:00 0                          [vvar] 7ffe47dda000-7ffe47ddc000 r-xp 00000000 00:00 0                          [vdso] ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]   killall -9 vaddr[/quote]  自己根据/proc/pid/maps写一个 根据虚拟地址 得到进程  在该地址上函数名吧

user: user-0
content: 引用 2 楼 misskissC 的回复:[quote=引用 1 楼 user-6 的回复:] 这种地址是随机的我的疑问： [1] 跟 附 中的内容还是有关系的哈。虚拟地址是随机的完全可以被理解，问题在于 跟其配套的addr2line没法使用该随机地址。 [2] 期待您给结论附个原因  另外，比如在centos上，就不存在这个问题。 /* gcc version 4.8.5 (Red Hat 4.8.5-28) */ #include <stdio.h>   int main(void) {     return printf("main=%p\n", main); }  gcc main.c -o main ./main 0x40051d  ./main 0x40051d  ./main 0x40051d  objdump -ds main  000000000040051d <main>:  ....  addr2line -e main 0x40051d -f main ??:?  [/quote]  Linux下查看 进程 虚拟地址空间：  #include <stdio.h>  int main(void) {     printf("main=%p\n", main);     while (1);     return 0; }   gcc vaddr.c -o vaddr ./vaddr & main=0x55be8d47264a [1] 1798  cat /proc/1798/maps 55be8d472000-55be8d473000 r-xp 00000000 08:01 264241                     /home/lgt/workspace/vaddr/vaddr 55be8d672000-55be8d673000 r--p 00000000 08:01 264241                     /home/lgt/workspace/vaddr/vaddr 55be8d673000-55be8d674000 rw-p 00001000 08:01 264241                     /home/lgt/workspace/vaddr/vaddr 55be8d963000-55be8d984000 rw-p 00000000 00:00 0                          [heap] 7f1c8e21e000-7f1c8e405000 r-xp 00000000 08:01 1185760                    /lib/x86_64-linux-gnu/libc-2.27.so 7f1c8e405000-7f1c8e605000 ---p 001e7000 08:01 1185760                    /lib/x86_64-linux-gnu/libc-2.27.so 7f1c8e605000-7f1c8e609000 r--p 001e7000 08:01 1185760                    /lib/x86_64-linux-gnu/libc-2.27.so 7f1c8e609000-7f1c8e60b000 rw-p 001eb000 08:01 1185760                    /lib/x86_64-linux-gnu/libc-2.27.so 7f1c8e60b000-7f1c8e60f000 rw-p 00000000 00:00 0 7f1c8e60f000-7f1c8e636000 r-xp 00000000 08:01 1185732                    /lib/x86_64-linux-gnu/ld-2.27.so 7f1c8e822000-7f1c8e824000 rw-p 00000000 00:00 0 7f1c8e836000-7f1c8e837000 r--p 00027000 08:01 1185732                    /lib/x86_64-linux-gnu/ld-2.27.so 7f1c8e837000-7f1c8e838000 rw-p 00028000 08:01 1185732                    /lib/x86_64-linux-gnu/ld-2.27.so 7f1c8e838000-7f1c8e839000 rw-p 00000000 00:00 0 7ffe47da3000-7ffe47dc4000 rw-p 00000000 00:00 0                          [stack] 7ffe47dd7000-7ffe47dda000 r--p 00000000 00:00 0                          [vvar] 7ffe47dda000-7ffe47ddc000 r-xp 00000000 00:00 0                          [vdso] ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]   killall -9 vaddr

user: user-0
content: 引用 1 楼 user-6 的回复:这种地址是随机的我的疑问： [1] 跟 附 中的内容还是有关系的哈。虚拟地址是随机的完全可以被理解，问题在于 跟其配套的addr2line没法使用该随机地址。 [2] 期待您给结论附个原因  另外，比如在centos上，就不存在这个问题。 /* gcc version 4.8.5 (Red Hat 4.8.5-28) */ #include <stdio.h>   int main(void) {     return printf("main=%p\n", main); }  gcc main.c -o main ./main 0x40051d  ./main 0x40051d  ./main 0x40051d  objdump -ds main  000000000040051d <main>:  ....  addr2line -e main 0x40051d -f main ??:?

user: user-6
content: 这种地址是随机的