3

我用 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 可以忽略,但还有什么?)
4

1 回答 1

4

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

您可能还想阅读Assembly HowtoX86 调用约定这个问题X86-64 ABI这些关于 X86-64 编程的说明等

于 2012-12-22T13:28:17.167 回答