我正在学习链接程序在Linux上的工作方式。有人告诉我链接程序将为可执行文件生成一些符号,例如__executable_start
,这是程序启动的地址。
此外,我也知道ELF文件中有一个“入口点地址”。
所以我不知道它们之间有什么区别。
我在下面写了一个简单的代码:
#include <stdio.h>
extern char __executable_start[];
int main()
{
printf("Executable Start %X\n", __executable_start);
return 0;
}
我使用GCC进行编译,并获得名为a.out
的可执行文件。
[执行时,它会给我Executable Start 4CEDA000
。
然后执行命令readelf -h a.out
,入口点的输出为Entry point address: 0x540
很明显,0x540
和4CEDA000
完全不同。
符号__executable_start
不是入口点,而是.text
部分的开头。符号_start_
确实是入口点。
在您的情况下,符号_start
在运行时位于4CEDA540
。这是因为由于安全原因(PIE)可以将二进制文件加载到某个随机位置,因此入口点仅相对于二进制文件中.text
节的偏移量进行存储。这就是为什么readelf仅显示540
的原因。