我写了一个小程序添加到整数,并使用“readelf -a executable_name”,它将elf标题中的入口点地址显示为:
Entry point address: 0x8048330
即使在装载程序加载到内存中之前,我的可执行程序也可以预先知道这个地址
elf_format.pdf说这个成员给出了系统首先传输控制的虚拟地址,从而启动了进程.任何人都可以解释这个语句的含义是什么,这里的虚拟地址的含义是什么?
也让我知道,可执行文件的值从0x8048330作为入口点地址.只是为了交叉检查,我编译了另一个程序,为此,入口点地址保持相同的值0x8048330(两种情况下的.text段的偏移量为0x330).
解决方法
输入地址由链接编辑器在创建时设置
可执行文件.加载器将程序文件映射到指定的地址
在将控制转移到入口地址之前,通过ELF头.
可执行文件.加载器将程序文件映射到指定的地址
在将控制转移到入口地址之前,通过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”是对链接编辑器和装载机相关事宜的一个很好的资源.