nm 仅在库未删除其符号时才有效。但是,nm -D 可以向您显示一些信息:
nm -D /lib/libgcc_s.so.1
但还有另一个工具可以帮助您:readelf
readelf - 显示有关信息
ELF 文件。
如果您查看手册页,选项 -s:Displays the entries in symbol table section of the file, if it has one.
readelf -s /lib/libgcc_s.so.1
编辑:
好吧,没有在您使用 nm 检查的对象内部实现的符号将在其前面显示一个 U 标志,但 nm 不会告诉您系统上的哪个库实现了该标志符号。
所以您正在寻找的可能可以通过 ldd 和 nm 的混合来实现。 ldd 告诉您的应用程序与哪些库链接,nm 告诉哪些符号未定义(U 标志)或本地实现(T 标志)。
在列出目标应用程序上的所有未定义符号(使用 nm)后,您应该遍历 ldd 报告的所有库以搜索这些符号(再次使用 nm)。如果您找到该符号并且它前面有 T 标志,那么您就找到了。
顺便说一句,我刚刚写了这个 one-liner for bash 来说明我的想法。它分析一个名为 win 的应用程序并尝试找到实现所有报告为未定义符号的库。
target="win"; for symbol in $(nm -D $target | grep "U " | cut -b12-); do for library in $(ldd $target | cut -d ' ' -f3- | cut -d' ' -f1); do for lib_symbol in $(nm -D $library | grep "T " | cut -b12-); do if [ $symbol == $lib_symbol ]; then echo "Found symbol: $symbol at [$library]"; fi ; done; done; done;
或者,如果您的终端支持颜色:
target="win"; for symbol in $(nm -D $target | grep "U " | cut -b12-); do for library in $(ldd $target | cut -d ' ' -f3- | cut -d' ' -f1); do for lib_symbol in $(nm -D $library | grep "T " | cut -b12-); do if [ $symbol == $lib_symbol ]; then echo -e "Found symbol: \e[1;36m$symbol\033[0m at \e[1;34m$library\033[0m"; fi ; done; done; done;
我相信有人会发现性能改进。
输出:
Found symbol: XCreateColormap at [/usr/lib/libX11.so.6]
Found symbol: XCreateWindow at [/usr/lib/libX11.so.6]
Found symbol: XIfEvent at [/usr/lib/libX11.so.6]
Found symbol: XMapWindow at [/usr/lib/libX11.so.6]
Found symbol: XOpenDisplay at [/usr/lib/libX11.so.6]
Found symbol: __libc_start_main at [/lib/tls/i686/cmov/libc.so.6]
Found symbol: __stack_chk_fail at [/lib/tls/i686/cmov/libc.so.6]
Found symbol: glClear at [/usr/lib/mesa/libGL.so.1]
Found symbol: glClearColor at [/usr/lib/mesa/libGL.so.1]
Found symbol: glFlush at [/usr/lib/mesa/libGL.so.1]
Found symbol: glXChooseFBConfig at [/usr/lib/mesa/libGL.so.1]
Found symbol: glXChooseVisual at [/usr/lib/mesa/libGL.so.1]
Found symbol: glXCreateContext at [/usr/lib/mesa/libGL.so.1]
Found symbol: glXCreateNewContext at [/usr/lib/mesa/libGL.so.1]
Found symbol: glXCreateWindow at [/usr/lib/mesa/libGL.so.1]
Found symbol: glXGetVisualFromFBConfig at [/usr/lib/mesa/libGL.so.1]
Found symbol: glXMakeContextCurrent at [/usr/lib/mesa/libGL.so.1]
Found symbol: glXMakeCurrent at [/usr/lib/mesa/libGL.so.1]
Found symbol: glXQueryVersion at [/usr/lib/mesa/libGL.so.1]