如何找出程序或其他库使用共享库的哪些功能?
在这种特定情况下,我想看看/lib/libgcc1_s.so.1中的哪个函数被另一个动态库使用。
由于它们是动态链接的,因此objdump -d不会解析函数调用地址。
有没有办法在调试器中运行程序或进行静态重新链接?
谢谢,

路卡

编辑:

nm和readelf不会,我不需要查看共享对象中存在哪些符号,但是实际在链接到它的其他对象中使用了哪些符号。

最佳答案

nm 仅在没有剥离其符号的情况下才有效。但是,nm -D可以向您显示一些信息:

nm -D /lib/libgcc_s.so.1

但是还有另一种工具可以帮助您: readelf



如果您检查手册页,则可以选择 -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告诉 undefined symbol ( U 标志)或在本地实现的符号( T 标志)。

在目标应用程序上列出所有 undefined symbol (带有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]

关于c - 如何找出程序或其他库使用共享库的哪些功能?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5108079/

10-12 17:11