【问题标题】:How to print symbol list for .so file in OSX?如何在 OSX 中打印 .so 文件的符号列表?
【发布时间】:2015-03-11 17:19:51
【问题描述】:

我有一个 .SO 文件(注意,不是 .a,不是 .dylib,也不是 .o),我需要在 OSX 上从中获取符号信息。

我试过了

nm -gU lib.so

但是,什么都没有打印出来。

我不能使用 otool,因为它不是目标文件,而且 OSX 上不存在 readelf。如何获取符号信息?

请注意,我在另一个项目中使用这个 .so 文件,并且有符号信息。我能够加载库,并从中引用函数。但是,我还没有在 OSX 上找到可以让我从中打印符号信息的工具。

如被问及,

file lib.so

ELF 32-bit LSB shared object, ARM, version 1 (SYSV), dynamically linked, stripped

【问题讨论】:

  • 文件的实际类型是什么(不是它的文件扩展名,这不是决定性的)? file lib.so 输出什么?顺便说一句,MacPorts 支持各种与 ELF 相关的包。例如,看起来elftoolchain 包包含一个readelf 工具。 i386-elf-binutilsx86_64-elf-binutils 也可能有一些有用的东西。我确信其他包系统也有类似的包。
  • 这是一个 ARM 二进制文件。 x86/x64 工具能否理解它?
  • 因为 OSX 使用 Mach-O 二进制格式,而不是 ELF。因此,nm 等实用程序不处理 ELF 格式。他们也不会使用相同的命令行语法。我描述了如何在 Linux 上为 Mach-O 文件构建和安装 binutils。您可能想要编译 binutils 以在 OSX/Darwin 上运行(托管),但 --target 需要是 arm-elf 或一些变体。我不记得具体的 ARM 架构,但可能有构建选项可以处理从旧 ARM 版本到 AArch64 的所有内容。
  • 果然,如果你安装了 MacPorts 之类的东西,已经有为此构建的包:port list | grep -i binutils 列出了几个包,如:arm-elf-binutils

标签: c++ macos


【解决方案1】:

尝试使用来自nmc++filt

nm lib.so | c++filt -p -i

c++filt - Demangle C++ 和 Java 符号。

-p --无参数 拆解函数名称时,不要显示函数的类型 函数的参数。

-i ——不冗长 不要在 demangled 中包含实现细节(如果有) 输出。

编辑:根据问题中提供的新 (ARM) 信息,尝试改用 symbols

symbols lib.so -arch arm | awk '{print $4}'

我使用awk 来简化输出;删除以输出所有内容。

Manual page : Symbols

【讨论】:

  • 谢谢,不幸的是 nm 没有为我输出任何东西。
  • 如果这是一个非 OS X 库,OS X 工具可能不知道如何读取它。你能启动一个 Linux 虚拟机来处理这些问题吗? Vagrant 让这变得超级简单。如果您正在处理 ARM 二进制文件,则可能需要处理该架构的编译器工具。
  • 您使用c++filt 的第一个命令没有给我任何输出。您使用 symbols 的第二个命令只打印:file, do
【解决方案2】:

https://developer.apple.com/legacy/library/documentation/Darwin/Reference/ManPages/man1/nm.1.html Nm 显示参数列表中每个目标文件的名称列表(符号表)。如果一个论点是 存档,将生成存档中每个目标文件的列表。文件可以是以下形式 libx.a(x.o),在这种情况下,仅列出来自该目标文件成员的符号。 (父母- 这些必须被引用才能被 shell 获取。)如果没有给出文件,则列出 a.out 中的符号。

【讨论】:

    猜你喜欢
    • 2010-09-07
    • 2014-07-11
    • 2015-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-26
    • 2021-10-26
    • 1970-01-01
    相关资源
    最近更新 更多