入口点地址和__executable_start有什么区别

问题描述 投票:0回答: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

很明显,0x5404CEDA000完全不同。

c linux elf objdump readelf
1个回答
0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.