我写了一个小程序来添加两个整数并使用 readelf -a executable_name
它在 elf header 中显示入口点地址为:
Entry point address: 0x8048330
我的可执行文件如何在加载程序将其加载到内存之前就预先知道该地址?
elf_format.pdf
表示该成员给出了系统首先将控制权转移到的虚拟地址,从而启动了该过程。谁能解释一下这个语句的含义以及这里虚拟地址的含义是什么?
另外让我知道,可执行文件从哪里获取 0x8048330
的值作为入口点地址。只是为了交叉检查,我编译了另一个程序,为此,入口点地址保持相同的值 0x8048330
(.text
部分的偏移量为 0x330
在这两种情况下)。
最佳答案
第一个问题:
您看到的入口点 0x8048330
是一个虚拟内存地址(相反,是物理内存)。
这意味着您的主管不必知道要映射的物理地址。 (用装载机装载后)
它甚至无法访问物理内存。
对于您的程序的进程,您的 .text 部分始终从 0x8048330
开始,然后您的系统(操作系统和硬件)将在运行时将其(虚拟地址)映射到物理内存。
映射和管理物理内存是很多东西,你可以在谷歌上查看更多信息。
对于第二个问题
我不确定哪一部分让您感到困惑,所以我会尽量涵盖所有内容:
- 是否可以有多个程序具有相同的入口点?
是的,可能有另一个程序具有相同的入口点 0x8048330
。因为这个地址是虚拟的,所以当您尝试同时运行这些程序时,它们将在运行时映射到不同的物理内存。
- 条目是否总是
0x8048330
?
嗯,Linux 执行是从0x8048000
开始的,但是.text 部分的偏移量与其他部分的长度有关。所以不,它可能是 0x8048034
或其他任何东西。
- 为什么它总是从
0x8048000
开始?
我认为这是一种历史事件,Linux 的设计者出于某种未知甚至随机的原因选择了这个。可以引用this thread看看那个区域下面是什么。
关于c - 为什么我的可执行文件中的入口点地址是0x8048330? (0x330 是 .text 部分的偏移量),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12488010/