Linux

從給定的共享庫中找出程式碼中使用的函式/變數

  • January 25, 2022

我正在分析 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項目程式碼庫中使用了哪些符號。任何人都可以提出一些路線圖嗎?

nm -uD /path/to/your/binary

將列出二進製文件中所有未定義的動態符號。然後,您需要將其與輸出相匹配

nm -gD /path/to/a/library

對於您的命令列出的每個庫,readelf以確定哪個庫提供每個符號。

請注意,這不一定給出完整的圖片;libdl特別是,不會考慮通過訪問的庫和符號。如果您願意執行二進製文件,並且它使用 GNU C 庫的動態載入程序(ld.so或者更確切地說是在 Linux 上),您可以通過在其環境中執行帶有 setld-linux.so的二進製文件來詳細列出所有符號綁定。LD_DEBUG=bindings詳情請參閱man ld.so

引用自:https://unix.stackexchange.com/questions/687799