我用anjuta在lubuntu 12.10上编译下面的C程序
int main() { return 0; }
文件名是foobar
然后我打开terminal并写命令
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
的指令jg 0x47(0x7F45) on 0x00000000 and dec esp(0x4C) on 0x00000002
似乎是ELF文件格式的签名。 (因为hex代码0x454c46是ascii中的'ELF')
Linux可能会将此代码加载到内存中,并且不会跳转到0x00000000,因为没有可执行代码。
我在这里有问题。
即使是像你这样最简单的程序, gcc
也会链接一些库和一些目标文件(特别是crt0.o
,它调用你的main
并包含_start
,ELF的起点)。 而你的二进制可能是动态链接到一些libc.so.6
所以需要动态链接器(使用ldd foobar
找出)。 使用gcc -v
来理解gcc
正在做什么。 而objdump有很多有趣的标志或选项。
您可能还想阅读大会Howto , X86调用约定 , 这个问题 , X86-64 ABI , X86-64编程的这些笔记等