我使用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,因为没有可执行代码。
我在这里有疑问。
答案 0 :(得分:4)
即使对于像您这样最简单的程序,gcc
也会链接一些库和一些目标文件(特别是crt0.o
,它会调用您的main
并包含_start
,ELF启动点)。并且您的二进制文件可能动态链接到某些libc.so.6
,因此需要动态链接器(使用ldd foobar
查找)。使用gcc -v
了解gcc
正在做什么。 objdump有很多有趣的标志或选项。
您可能还想阅读Assembly Howto,X86 calling conventions,this question,the X86-64 ABI,these notes on X86-64 programming等