我如何列出从一个.so文件导出的符号?如果可能的话,我还想知道它们的来源(例如,如果它们是从静态库中提取的)。

我使用的是gcc 4.0.2,如果有区别的话。


当前回答

Nm -g列出了extern变量,这不是必要的导出符号。 任何非静态文件作用域变量(在C语言中)都是extern变量。

nm -D将在动态表中列出该符号,您可以通过dlsym找到它的地址。

nm -版本

GNU nm 2.17.50.0.6-12.el5 20061020

其他回答

您可以使用binutils工具链中的nm -g工具。然而,它们的来源并不总是现成的。我甚至不确定这些信息是否总能被检索到。也许objcopy揭示了更多的信息。

/EDIT:这个工具的名字当然是nm。标志-g只用于显示导出的符号。

objdump -TC /usr/lib/libexample.so

Nm -g列出了extern变量,这不是必要的导出符号。 任何非静态文件作用域变量(在C语言中)都是extern变量。

nm -D将在动态表中列出该符号,您可以通过dlsym找到它的地址。

nm -版本

GNU nm 2.17.50.0.6-12.el5 20061020

对于c++ .so文件,最终的nm命令是nm——demangle——dynamic——defined-only——extern-only <my.so>

# nm --demangle --dynamic --defined-only --extern-only /usr/lib64/libqpid-proton-cpp.so | grep work | grep add
0000000000049500 T proton::work_queue::add(proton::internal::v03::work)
0000000000049580 T proton::work_queue::add(proton::void_function0&)
000000000002e7b0 W proton::work_queue::impl::add_void(proton::internal::v03::work)
000000000002b1f0 T proton::container::impl::add_work_queue()
000000000002dc50 T proton::container::impl::container_work_queue::add(proton::internal::v03::work)
000000000002db60 T proton::container::impl::connection_work_queue::add(proton::internal::v03::work)

来源:https://stackoverflow.com/a/43257338

对于共享库libNAME。所以-D开关是必要的,以查看符号在我的Linux

nm -D libNAME.so

并为静态库如别人所报道

nm -g libNAME.a