我正在分析 linux 平台(redhat)上的一个大型 C++ 项目,特别是其中使用的共享库。如何从特定的共享库中找到该项目中使用了哪些符号(函数/变量)?
首先,我在我的二进制文件上运行了以下命令:
readelf -d binaryName | grep -i "Shared library"
我得到了在我的项目中使用的共享库列表(ldd 显示更长的列表,因为这些共享库也有自己的依赖项)例如
0x0000000000000001 (NEEDED) Shared library: [librt.so.1]
0x0000000000000001 (NEEDED) Shared library: [libpthread.so.0]
0x0000000000000001 (NEEDED) Shared library: [libuv.so.1]
0x0000000000000001 (NEEDED) Shared library: [libssl.so.1.1]
0x0000000000000001 (NEEDED) Shared library: [libcrypto.so.1.1]
0x0000000000000001 (NEEDED) Shared library: [libz.so.1]
0x0000000000000001 (NEEDED) Shared library: [libstdc++.so.6]
0x0000000000000001 (NEEDED) Shared library: [libm.so.6]
0x0000000000000001 (NEEDED) Shared library: [libgcc_s.so.1]
0x0000000000000001 (NEEDED) Shared library: [libc.so.6]
现在有一种方法可以找出libuv.so.1
项目代码库中使用了哪些符号。任何人都可以提出一些路线图吗?
将列出二进制文件中所有未定义的动态符号。然后,您需要将其与输出相匹配
对于您的命令列出的每个库,
readelf
以确定哪个库提供每个符号。请注意,这不一定给出完整的图片;
libdl
特别是,不会考虑通过访问的库和符号。如果您愿意运行二进制文件,并且它使用 GNU C 库的动态加载程序(ld.so
或者更确切地说是在 Linux 上),您可以通过在其环境中运行带有 setld-linux.so
的二进制文件来详细列出所有符号绑定。LD_DEBUG=bindings
详情请参阅man ld.so
。使用接受的答案和此处提供的信息,我创建了以下脚本,用于查找当前在二进制文件中使用的所有符号(取自共享库)。该脚本采用 1 个参数,即二进制文件的名称(如果二进制文件位于与脚本不同的目录中,则需要路径)。
该脚本将显示输入中给出的二进制文件所需的共享库。所有的符号将被转储到一个输出文件(result.txt)