如何在OSX中打印.so文件的符号列表?

3

我有一个.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

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

0

尝试使用从nm管道传输的c++filt

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

c++filt - 用于还原C++和Java符号名称。
-p --no-params 在还原函数名称时,不显示函数参数的类型。
-i --no-verbose 不在还原输出中包含实现细节(如果有)。 编辑:根据问题中提供的新信息(ARM),请尝试使用symbols
symbols lib.so -arch arm | awk '{print $4}'

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

手册页面:符号


2
谢谢,不幸的是 nm 对我没有任何输出。 - stevebot
1
如果这是一个非OS X库,那么OS X工具可能不知道如何读取它。你可以启动一个Linux虚拟机来处理这些问题吗?Vagrant使这变得超级容易。如果你正在处理ARM二进制文件,你可能需要使用处理该架构的编译器工具。 - tadman
你的第一个使用 c++filt 的命令没有输出。你的第二个使用 symbols 的命令只是打印出:file, do - IgorGanapolsky

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接