我编译上lubuntu 12.10以下的C程序用的anjutaELF可执行文件的起点?
int main()
{
return 0;
}
文件名是foobar的
然后我打开终端和写入命令
ndisasm foobar -b 32 1>asm.txt
(拆卸foobar的具有32位指令选项并保存反汇编结果为asm.txt)
我打开asm.txt 有很多0x0000和易理解的代码。
指令jg 0x47(0x7F45) on 0x00000000 and dec esp(0x4C) on 0x00000002
似乎是ELF文件格式签名。 (因为十六进制代码0x454c46是ascii中的'ELF')
Linux可能会将此代码加载到内存中,并且不会跳转到0x00000000,因为没有可执行代码。
我在这里有问题。
- 我怎么知道起始地址的地址?
- 其代码是OK忽略?(也许很多为0x0000就OK忽略,但还有什么?)
为什么不'objdump的-d foobar'?它只会反汇编elf文件的可执行(文本)部分。还可以尝试'readelf -e foobar'来获取关于部分的信息并找到入口地址。 – osgx
是否可以通过手动获取起点? –
检查精灵标题:http://www.sco.com/developers/gabi/1998-04-29/ch4.eheader.html - e_entry字段。但是您还需要解析程序头http://www.sco.com/developers/gabi/1998-04-29/ch5.pheader.html并查找所有PT_LOAD段以将虚拟地址转换为文件偏移量。这里简要介绍一下ELF和加载过程:http://wiki.osdev.org/ELF – osgx