我用 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,因为没有可执行代码。
我在这里有疑问。
- 我如何知道起始地址的地址?
- 哪些代码可以忽略?(也许很多 0x0000 可以忽略,但还有什么?)
即使对于像你这样最简单的程序,gcc
正在链接一些库和一些目标文件(特别是crt0.o
这会调用你的main
并包含_start
,ELF 起点)。你的二进制文件可能动态链接到一些libc.so.6
所以需要动态链接器(使用ldd foobar
来找出答案)。使用gcc -v
了解什么gcc
是在做。和objdump http://linux.about.com/library/cmd/blcmdl1_objdump.htm有很多有趣的标志或选项。
您可能还想阅读装配指南 http://tldp.org/HOWTO/Assembly-HOWTO/, the X86 调用约定 http://en.wikipedia.org/wiki/X86_calling_conventions, 这个问题 https://stackoverflow.com/questions/12224188/x86-64-assembly-conventions-saving-argument-registers, X86-64 ABI http://www.x86-64.org/documentation/abi.pdf, 有关 X86-64 编程的这些说明 http://web.cecs.pdx.edu/~apt/cs322/x86-64.pdf, etc
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)