【问题标题】:readelf-like tool for Mac OS X? [closed]Mac OS X 的类似 readelf 的工具? [关闭]
【发布时间】:2011-03-18 05:34:10
【问题描述】:

是否有用于读取 Mac OS X 二进制文件的工具,可以打印与 readelf 输出类似的重定位表和符号偏移信息?

readelf -r app

Relocation section '.rel.dyn' at offset 0x5ec contains 2 entries:
 Offset     Info    Type            Sym.Value  Sym. Name
08049d58  00001706 R_386_GLOB_DAT    00000000   __gmon_start__
08049d60  00000305 R_386_COPY        08049d60   _ZSt4cout

Relocation section '.rel.plt' at offset 0x5fc contains 13 entries:
 Offset     Info    Type            Sym.Value  Sym. Name
08049d24  00000107 R_386_JUMP_SLOT   0804868c   print
08049d28  00000207 R_386_JUMP_SLOT   0804869c   _ZNSt8ios_base4InitC1E
08049d2c  00000507 R_386_JUMP_SLOT   080486ac   _ZStlsISt11char_traits
08049d30  00000607 R_386_JUMP_SLOT   080486bc   _ZNSolsEPFRSoS_E
08049d34  00000707 R_386_JUMP_SLOT   08048664   _init
08049d38  00000807 R_386_JUMP_SLOT   080486dc   sleep
08049d3c  00000907 R_386_JUMP_SLOT   080486ec   _ZNKSsixEj
08049d40  00000b07 R_386_JUMP_SLOT   080486fc   _ZNKSs4sizeEv
08049d44  00000c07 R_386_JUMP_SLOT   0804870c   __libc_start_main
08049d48  00000d07 R_386_JUMP_SLOT   08048ae4   _fini
08049d4c  00001307 R_386_JUMP_SLOT   0804872c   _ZSt4endlIcSt11char_tr
08049d50  00001507 R_386_JUMP_SLOT   0804873c   __gxx_personality_v0
08049d54  00001607 R_386_JUMP_SLOT   0804874c   _ZNSt8ios_base4InitD1E

在此示例中,print 是在运行时从共享库(我编写的)加载的函数。 readelf 能够在 app 二进制文件中显示有关其位置的信息。

【问题讨论】:

  • nm 能解决问题吗?
  • 它没有打印足够的信息。

标签: c macos function symbols


【解决方案1】:

使用Macports

  1. Install macports
  2. 使用 macports port install binutils
  3. gobjdump -p /path/to/app

使用Homebrew

  1. Install Homebrew
  2. brew update && brew install binutils
  3. /usr/local/path/to/gobjdump -p /path/to/app # 或按照说明将其添加到您的 PATH 中

当然,还有许多其他命令行选项。请注意 binutils 端口警告安装它可能会导致其他端口无法构建。使用它进行端口安装/查看某些内容/端口卸载仍然很方便。

令人惊讶的是,还没有一些本地工具可以做到这一点。

【讨论】:

  • 如果你使用 Homebrew,那么你可以通过“brew install binutils”安装它。
  • 对于 Homebrew 用户,正如@louielouie 提到的,brew install binutils 那么所有工具都将以g 为前缀,即greadelf。见github.com/Homebrew/homebrew/blob/master/Library/Formula/…
  • 我收到一条消息:gobjdump: Matching formats: elf32-littlearm elf32-littlearm-symbian elf32-littlearm-vxworks
  • @IgorGanapolsky 你可以使用 greadelf -Ws /path/to/your/so/files
【解决方案2】:

你可以试试dwarfdump

⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣

【讨论】:

  • +1 感谢那些处理 dwarf 调试信息的人的好工具
  • +1 适用于 Apple 工具链。安装 Xcode 后可在/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/dwarfdump 获取。
  • 虽然您通常不需要完整路径:您可以使用xcrun dwarfdump。你可能有/usr/bin/dwarfdump 作为它的快捷方式,这意味着你只需输入dwarfdump 就可以了。
【解决方案3】:
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
brew install binutils
greadelf filepath
  1. 安装自制软件。
  2. 使用 homebrew 安装 binutils
  3. binutils 中的 readelf 称为greadelf

【讨论】:

  • greadelf 需要一个标志
  • 使用greadelf -a <binary>-a 标志代表转储所有内容的所有选项
【解决方案4】:

你试过 ObjConv 吗? http://agner.org/optimize/#objconv

此实用程序可用于在所有 32 位和 64 位 x86 平台的 COFF/PE、OMF、ELF 和 Mach-O(Mac OS 使用)格式之间转换目标文件。可以修改目标文件中的符号名称。可以跨平台构建、修改和转换函数库。可以转储目标文件和可执行文件。还包括一个非常好的反汇编程序,支持 SSE4、AVX、FMA 和 XOP 指令集。

Ps.:源代码已包含(GPL)。

【讨论】:

【解决方案5】:

otool -l test.o

【讨论】:

  • 不,它也不起作用。
  • 你可以用 otool 做到这一点,你只需要传递额外的选项。 man otool 了解详细信息。
  • otool -Sv libtest.a 更好,或者otool -STMRIHGv <path/to/library> 适用于任何类型的库(*.a*.so*.dylib)。安装 Xcode 后,otool/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/otool 可用。
  • 不幸的是,我需要对 .so 文件执行此操作。
猜你喜欢
  • 1970-01-01
  • 2011-11-21
  • 2011-05-27
  • 2013-04-04
  • 2012-11-09
  • 1970-01-01
  • 2012-03-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多