【问题标题】:What is the difference between Entry point address and __executable_start入口点地址和__executable_start有什么区别
【发布时间】:2020-06-04 23:47:42
【问题描述】:

我正在学习链接器如何在 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

嗯,很明显,0x5404CEDA000 完全不同。

【问题讨论】:

标签: c linux elf objdump readelf


【解决方案1】:

符号__executable_start 不是入口点,而是.text 部分的开始。符号_start_ 确实是入口点。

在您的情况下,符号 _start 在运行时位于 4CEDA540。这是因为出于安全原因 (PIE) 可以在某个随机位置加载二进制文件,因此入口点仅存储相对于二进制文件中(在运行时由 ASLR 随机定位).text 部分的偏移量。这就是为什么readelf只显示540

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-06
    • 2016-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多