ndisasm手册中提到的二进制文件和可执行文件有什么区别?

时间:2015-06-29 21:43:57

标签: c clang disassembly

我想用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会输出什么?

2 个答案:

答案 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对它的影响。