Linux
從給定的共享庫中找出程式碼中使用的函式/變數
我正在分析 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
。