1

我正在学习链接器如何在 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完全不同。

4

1 回答 1

1

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

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

于 2020-02-20T15:56:12.883 回答