可以读取目标文件吗?

时间:2011-12-22 05:15:19

标签: c++ windows compilation compiler-construction object-files

我对.obj文件感到好奇:我几乎不知道它们是什么(或它们包含什么),所以我用Vim文本编辑器打开它们,我发现里面的是Alien之类的语言...

有没有办法了解它们代表什么以及它们的内容是什么 另外,他们使用的是什么?

感谢。

3 个答案:

答案 0 :(得分:5)

不确定。

但是每个不同的平台都有不同的对象格式。在Windows上,您可以使用dumpbin之类的工具(dumpbin附带Visual Studio)。在Linux上,您可以使用“dumpobj”,或者反汇编程序。

这是Linux的一个很好的链接:

http://www.linuxjournal.com/article/1060

PS: objdump还允许你反汇编对象。就像你以前在DOS PC上使用“debug”一样......

答案 1 :(得分:4)

.obj使用的link.exe文件采用MS COFF格式。

您可以找到“Microsoft PE和COFF规范”here,并根据它解析.obj文件。

或者,您可以使用dumpbin等现有工具。

答案 2 :(得分:3)

readelf工具擅长向您显示有关数据的部分详细信息:

$ readelf -a /usr/bin/readelf
ELF Header:
  Magic:   7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 
  Class:                             ELF64
  Data:                              2's complement, little endian
  Version:                           1 (current)
  OS/ABI:                            UNIX - System V
  ABI Version:                       0
  Type:                              EXEC (Executable file)
  Machine:                           Advanced Micro Devices X86-64
...

它检查可执行文件特定部分的一些功能也可以派上用场:

$ readelf -p .rodata /usr/bin/readelf | more

String dump of section '.rodata':
  [     4]  R_IA64_IMM14
  [    11]  R_IA64_NONE
  ...
  [  1f58]    Personality routine: 
  [  1f70]  __gcc_personality_v0
  [  1f85]  __gxx_personality_v0
  [  1f9a]  __gcj_personality_v0
  [  1faf]  __gnu_objc_personality_v0
  ...

实际上拆解代码有点紧张;如果使用-g编译代码用于调试符号,则可以使用readelf --debug-dump来读取程序源,输入信息等。