我想用clang
编译我的C文件,然后使用ndisasm
进行反编译(出于教育目的)。但是,ndisasm
在其手册中说它只适用于二进制而不是可执行文件:
ndisasm only disassembles binary files: it has
no understanding of the header information
present in object or executable files. If you
want to disassemble an object file, you should
probably be using objdump(1).
究竟有什么区别?当我使用简单的C文件,可执行文件或二进制文件运行时,clang
会输出什么?
答案 0 :(得分:2)
目标文件包含机器语言代码,和各种其他信息。听起来ndisasm
只需要机器代码,而不是其他东西。因此,消息告诉您使用objdump
实用程序从目标文件中仅提取机器代码段。然后你可以在那上运行ndisasm
。
答案 1 :(得分:1)
当我使用简单的C文件,可执行文件或二进制文件运行它时,clang会输出什么?
C编译器通常能够创建一个' raw'二元,即Just The Code,持有番茄,因为对某些(罕见!)目的而言可能是有用的。例如,考虑一下引导扇区(它们不能以常规方式加载可执行文件,因为加载它们的操作系统尚未启动)和可编程RAM芯片。操作系统本身通常不喜欢执行原始二进制代码' - 几乎是出于同样的原因。一个例外是MS Windows,它仍然可以运行旧格式.com
二进制文件。
默认情况下,clang会创建可执行文件。在可执行文件链接(与库函数和适当的可执行文件头粘合在一起)之后,通常会删除名为目标文件的中间文件。要获取.o
目标文件,请使用-c
开关。
请注意,Object文件也包含标头。毕竟,链接器需要知道文件包含的内容才能将其链接到其他部分。
出于教育目的,您可能希望检查目标文件格式。有了这些知识,应该可以编写一个程序,它可以告诉你在实际代码开始的文件中的偏移量。然后,您可以将该信息提供给ndisasm
。
除了标题之外,文件可能在指令后包含更多数据。同样,ndisasm
不知道也不关心。如果你的测试程序在最后的某个地方包含一个字符串Hello world!
,它也会很乐意尝试反汇编它。您可以自行识别这种垃圾,并忽略ndisasm
对它的影响。