Mac OS X 的类似 readelf 的工具? [关闭]

Posted

技术标签:

【中文标题】Mac OS X 的类似 readelf 的工具? [关闭]【英文标题】:readelf-like tool for Mac OS X? [closed] 【发布时间】: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 能解决问题吗? 它没有打印足够的信息。 【参考方案1】:

使用Macports:

    Install macports。 使用 macports port install binutils gobjdump -p /path/to/app

使用Homebrew:

    Install Homebrew 做brew update && brew install binutils /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
    安装自制软件。 使用 homebrew 安装 binutils 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)。

【讨论】:

很高兴认识你 carlfilips,谢谢。 很高兴认识你。另外,看看这个developer.apple.com/mac/library/documentation/DeveloperTools/…【参考方案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 文件执行此操作。

以上是关于Mac OS X 的类似 readelf 的工具? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

Mac OS X 包管理工具 Homebrew 安装与使用

如何制作一个类似于 Mac OS X 坞站堆栈的窗口?

Mac OS X 平台上都有哪些好用且免费的MySQL客户端工具

Mac Os X 中类似 Windows 的 Qt4 菜单栏

如何在Mac OS X上部署开发环境

如何在Mac OS X上安装 Ruby运行环境