OSX和Linux之间的Dwarfdump差异(以及如何避免它们)

时间:2015-05-06 13:19:32

标签: linux macos gcc clang dwarf

我们正在为我们的项目解析dwarfdump的输出,但最近意识到dwarfdump的OSX输出与Linux输出非常不同。

  • 为什么这些彼此不同而且
  • 是否可以使OSX dwarfdump发出与Linux版本相同的格式?

我们已经找到了an older python script that supposedly translates the OSX output to the Linux format,但这似乎不再有用了。

提前致谢

1 个答案:

答案 0 :(得分:1)

主要区别在于dwarfdump读取ELF(可执行格式)并反汇编调试信息的会话。但是,在OSX上,其可执行格式为Mach-O,因此工具名称dwarfdump不是同一个程序,因此会产生不同的结果。

我使用的唯一类似工具是gobjdump,其用法和结果在Linux平台上接近readelf。使用macport来获取它

  • 安装macports。
  • port install binutils
  • gobjdump --dwarf = info path

例如,我运行gcc -gdwarf-2 a.c,获取a.outa.out.dSYM

然后我可以使用gobjdump --dwarf=info a.out.dSYM/Contents/Resources/DWARF/a.out并获得如下输出:

a.out.dSYM/Contents/Resources/DWARF/a.out:     file format mach-o-x86-64

Contents of the .debug_info section:

  Compilation Unit @ offset 0x0:
   Length:        0xb2 (32-bit)
   Version:       2
   Abbrev Offset: 0x0
   Pointer Size:  8
 : Abbrev Number: 1 (DW_TAG_compile_unit)
       DW_AT_producer    : (indirect string, offset: 0x1): 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.11.00)    
       DW_AT_language    : 1        (ANSI C)
       DW_AT_name        : (indirect string, offset: 0x40): a.c     
       DW_AT_entry_pc    : 0x100000ef0      
       DW_AT_stmt_list   : 0x0      
       DW_AT_comp_dir    : (indirect string, offset: 0x44): /tmp/       
 : Abbrev Number: 2 (DW_TAG_base_type)
       DW_AT_encoding    : 5        (signed)
       DW_AT_name        : (indirect string, offset: 0x56): int     
       DW_AT_byte_size   : 4        
 : Abbrev Number: 3 (DW_TAG_subprogram)
       DW_AT_sibling     :    
       DW_AT_name        : (indirect string, offset: 0x5a): main    
       DW_AT_MIPS_linkage_name: (indirect string, offset: 0x5a): main       
       DW_AT_decl_file   : 1        
       DW_AT_decl_line   : 3        
       DW_AT_prototyped  : 1        
       DW_AT_type        :    
       DW_AT_external    : 1        
       DW_AT_low_pc      : 0x100000ef0      
       DW_AT_high_pc     : 0x100000f45      
       DW_AT_frame_base  : 1 byte block: 56         (DW_OP_reg6 (rbp))
 : Abbrev Number: 4 (DW_TAG_formal_parameter)
 ...