nm 只有在库中没有剥离其符号的情况下才能发挥作用。 然而,nm -D
可以显示一些信息:
nm -D /lib/libgcc_s.so.1
但是还有另一种工具可以帮助您:readelf
readelf - 显示关于 ELF 文件的信息。
如果您查看 man 页面,选项-s: 显示文件中符号表部分的条目(如果有)。
readelf -s /lib/libgcc_s.so.1
编辑:
如果您在使用nm检查对象时发现未实现的符号,它们将在前面带有U标志,但nm不会告诉您系统上哪个库实现了该符号。
因此,您可能需要结合使用ldd和nm来查找所需内容。ldd会告诉您应用程序链接的库,而nm会告诉您哪些符号未定义(U标志)或在本地实现(T标志)。
在列出目标应用程序上所有未定义的符号(使用nm)后,您应该遍历所有由ldd报告的库,以查找这些符号(再次使用nm)。如果您找到符号并且其前面带有T标志,则找到了该符号。
顺便说一下,我刚刚为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]
readelf
命令,同时加上-W
参数(允许输出宽度超过80个字符)。 - pevik