2012-12-22 51 views
3

我编译上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,因为没有可执行代码。

我在这里有问题。

  1. 我怎么知道起始地址的地址?
  2. 其代码是OK忽略?(也许很多为0x0000就OK忽略,但还有什么?)
+0

为什么不'objdump的-d foobar'?它只会反汇编elf文件的可执行(文本)部分。还可以尝试'readelf -e foobar'来获取关于部分的信息并找到入口地址。 – osgx

+0

是否可以通过手动获取起点? –

+0

检查精灵标题: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

回答

4

即使是像你这样的简单程序,gcc是连接一些库和一些目标文件(特别是crt0.o它调用您的main并包含_start,ELF的起点)。而你的二进制可能动态链接到一些libc.so.6,所以需要动态链接器(使用ldd foobar找出)。使用gcc -v来了解gcc正在做什么。而objdump有很多有趣的标志或选项。

您可能还需要阅读Assembly Howto,在X86 calling conventionsthis questionthe X86-64 ABIthese notes on X86-64 programming

相关问题