我写了一个小程序将两个整数相加,在使用readelf -a executable_name
时,它在elf报头中显示入口点地址为:
Entry point address: 0x8048330
我的可执行文件是如何在加载程序将其加载到内存之前就知道这个地址的呢?elf_format.pdf
说这个成员给出了系统首先将控制权转移到的虚拟地址,从而启动了进程。有人能解释一下这句话的意思吗?这里的虚拟地址是什么意思?
另外,让我知道可执行文件从哪里获得入口点地址的0x8048330
的值。为了进行交叉检查,我编写了另一个程序,因此,入口点地址保持为相同的值0x8048330
(两种情况下.text
部分的偏移量均为0x330
)。
发布于 2012-09-20 03:16:22
入口地址由链接编辑器在创建可执行文件时设置。在将控制转移到入口地址之前,加载器将程序文件映射到由ELF报头指定的地址。
要使用一个具体的示例,请考虑以下内容:
% file a.out
a.out: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), statically linked, \
for GNU/Linux 2.6.15, not stripped
% readelf -e a.out
... snip ...
Elf file type is EXEC (Executable file)
Entry point 0x8048170
There are 6 program headers, starting at offset 52
Program Headers:
Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
LOAD 0x000000 0x08048000 0x08048000 0x7cca6 0x7cca6 R E 0x1000
LOAD 0x07cf98 0x080c5f98 0x080c5f98 0x00788 0x022fc RW 0x1000
... snip ...
第一个程序头指定文件偏移量0处的文件内容应映射到虚拟地址0x08048000。此段的文件和内存大小为0x7cca6字节。这段代码将映射为可读和可执行,但不可写(它包含程序的代码)。
ELF报头中指定的入口点地址为0x8048170,它位于包含程序代码的区域内。
John Levine的"Linkers and Loaders“这本书是一个很好的参考资料,可以参考有关链接编辑器和加载器的问题。
https://stackoverflow.com/questions/12488010
复制相似问题