ELF可执行文件的起点?

时间:2012-12-22 11:37:41

标签: linux disassembly entry-point

我使用anjuta

在lubuntu 12.10上编译了以下C程序
int main()
{
return 0;
}

文件名是foobar

然后我打开终端并编写命令

ndisasm foobar -b 32 1>asm.txt

(用32位指令选项拆解foobar并将反汇编结果保存到asm.txt)

我打开了asm.txt 有许多0x0000和错误可理解的代码。

指令jg 0x47(0x7F45) on 0x00000000 and dec esp(0x4C) on 0x00000002  似乎ELF文件格式签名。 (因为十六进制代码0x454c46在ascii中是'ELF')

Linux可能会将此代码加载到内存中,并且不会跳转到0x00000000,因为没有可执行代码。

我在这里有疑问。

  1. 我如何知道起始地址?
  2. 哪些代码可以忽略?(可能有很多0x0000可以忽略,但还有什么?)

1 个答案:

答案 0 :(得分:4)

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

您可能还想阅读Assembly HowtoX86 calling conventionsthis questionthe X86-64 ABIthese notes on X86-64 programming