#include <stdio.h> void foo() {} int main(int argc, char **argv) { printf("%p\n", foo); return 0; }
保存为foo.c
并用gcc -g foo.c
编译
$ ./a.out 0x564e523896a0 $ addr2line 0x564e523896a0 -f -e a.out ?? ??:0
我发现地址不是从0x400000
开始的,倒了精灵:
$ readelf -h a.out ELF Header: Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 Class: ELF64 Data: 2's complement, little endian Version: 1 (current) OS/ABI: UNIX - System V ABI Version: 0 Type: DYN (Shared object file) Machine: Advanced Micro Devices X86-64 Version: 0x1 Entry point address: 0x570 Start of program headers: 64 (bytes into file) Start of section headers: 8808 (bytes into file) Flags: 0x0 Size of this header: 64 (bytes) Size of program headers: 56 (bytes) Number of program headers: 9 Size of section headers: 64 (bytes) Number of section headers: 34 Section header string table index: 31
入口点不在0x400000
处开始。 为什么? 但Ubuntu 16.04很好。
注意 :我发现了一个类似的问题: Ubuntu 16.10在运行时随机化函数地址
他们改变了GCC的默认值以发出位置独立可执行文件。 如果你想要老的行为,用-fno-pie
编译。