【问题标题】:Dwarfdump differences between OSX and Linux (and how to avoid them)OSX 和 Linux 之间的 Dwarfdump 差异(以及如何避免它们)
【发布时间】:2015-05-06 13:19:31
【问题描述】:

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

  • 为什么它们彼此不同?
  • 是否可以让 OSX dwarfdump 发出与 Linux 版本相同的格式?

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

提前致谢

【问题讨论】:

  • 您应该直接处理 DWARF(例如使用 libdwarf),而不是解析程序的文本输出。我已经将一些执行后者的代码转换为前者,之后它变得更好/更强大。
  • 对我来说这很有效:dwarfdump --all ./executable.dwarf FWIW

标签: linux macos gcc clang dwarf


【解决方案1】:

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

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

  • 安装 macports。
  • 端口安装 binutils
  • gobjdump --dwarf=信息路径

例如我运行gcc -gdwarf-2 a.c,得到a.out和a.out.dSYM

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

a.out.dSYM/Contents/Resources/DWARF/a.out:文件格式 mach-o-x86-64 .debug_info 部分的内容: 编译单元@偏移量 0x0: 长度:0xb2(32 位) 版本:2 缩写偏移量:0x0 指针大小:8 : 缩写数字: 1 (DW_TAG_compile_unit) DW_AT_producer:(间接字符串,偏移量:0x1):4.2.1(基于 Apple Inc. build 5658)(LLVM build 2336.11.00) DW_AT_language : 1 (ANSI C) DW_AT_name :(间接字符串,偏移量:0x40):a.c DW_AT_entry_pc:0x100000ef0 DW_AT_stmt_list:0x0 DW_AT_comp_dir:(间接字符串,偏移量:0x44):/tmp/ : 缩写数字: 2 (DW_TAG_base_type) DW_AT_encoding:5(有符号) DW_AT_name :(间接字符串,偏移量:0x56):int DW_AT_byte_size : 4 : 缩写编号: 3 (DW_TAG_subprogram) DW_AT_sibling: DW_AT_name :(间接字符串,偏移量:0x5a):主要 DW_AT_MIPS_linkage_name:(间接字符串,偏移量:0x5a):main DW_AT_decl_file:1 DW_AT_decl_line : 3 DW_AT_prototyped:1 DW_AT_type : DW_AT_外部:1 DW_AT_low_pc:0x100000ef0 DW_AT_high_pc:0x100000f45 DW_AT_frame_base : 1 字节块: 56 (DW_OP_reg6 (rbp)) :缩写数字:4(DW_TAG_formal_parameter) ...

【讨论】:

    猜你喜欢
    • 2018-05-07
    • 1970-01-01
    • 1970-01-01
    • 2015-08-05
    • 2018-08-18
    • 2013-10-25
    • 2017-11-07
    • 2023-03-12
    • 1970-01-01
    相关资源
    最近更新 更多