[英]How to print the ld(linker) search path
打印ld按搜索順序查找的搜索路徑的方法是什么。
您可以通過執行以下命令來執行此操作:
ld --verbose | grep SEARCH_DIR | tr -s ' ;' \\012
gcc將一些額外的 -L 路徑傳遞給鏈接器,您可以使用以下命令列出這些路徑:
gcc -print-search-dirs | sed '/^lib/b 1;d;:1;s,/[^/.][^/]*/\.\./,/,;t 1;s,:[^=]*=,:;,;s,;,; ,g' | tr \; \\012
建議使用 ld.so.conf 和 ldconfig 的答案不正確,因為它們引用運行時動態鏈接器搜索的路徑(即每當執行程序時),這與ld搜索的路徑不同(即每當程序已鏈接)。
在 Linux 上,您可以使用維護 ld.so 配置和緩存的ldconfig
來打印ld.so
搜索的目錄
ldconfig -v 2>/dev/null | grep -v ^$'\t'
ldconfig -v
打印出鏈接器搜索的目錄(不帶前導選項卡)和在這些目錄中找到的共享庫(帶前導選項卡); grep
獲取目錄。 在我的機器上,這條線打印出來
/usr/lib64/atlas:
/usr/lib/llvm:
/usr/lib64/llvm:
/usr/lib64/mysql:
/usr/lib64/nvidia:
/usr/lib64/tracker-0.12:
/usr/lib/wine:
/usr/lib64/wine:
/usr/lib64/xulrunner-2:
/lib:
/lib64:
/usr/lib:
/usr/lib64:
/usr/lib64/nvidia/tls: (hwcap: 0x8000000000000000)
/lib/i686: (hwcap: 0x0008000000000000)
/lib64/tls: (hwcap: 0x8000000000000000)
/usr/lib/sse2: (hwcap: 0x0000000004000000)
/usr/lib64/tls: (hwcap: 0x8000000000000000)
/usr/lib64/sse2: (hwcap: 0x0000000004000000)
第一個路徑,在該行中沒有hwcap
,要么是內置的,要么是從 /etc/ld.so.conf 讀取的。 然后,鏈接器可以在基本庫搜索路徑下搜索其他目錄,名稱如sse2
對應於其他 CPU 功能。 這些帶有hwcap
的路徑可以包含為這些 CPU 功能量身定制的其他庫。
最后一點:使用-p
而不是上面的-v
來搜索ld.so
緩存。
我不確定是否有任何選項可以簡單地打印完整的有效搜索路徑。
但是:搜索路徑由命令行上的-L
選項指定的目錄組成,然后是鏈接描述文件中的SEARCH_DIR("...")
指令添加到搜索路徑的目錄。 因此,如果您可以看到這兩個,您就可以解決問題,您可以執行以下操作:
如果您直接調用ld
:
-L
選項就是你所說的。--verbose
選項。 查找SEARCH_DIR("...")
指令,通常在輸出頂部附近。 (請注意,對於ld
的每次調用,這些都不一定相同——鏈接器有許多不同的內置默認鏈接器腳本,並根據各種其他鏈接器選項在它們之間進行選擇。) 如果您通過gcc
鏈接:
-v
選項傳遞給gcc
,以便它向您展示它是如何調用鏈接器的。 事實上,它通常不會直接調用ld
,而是通過一個名為collect2
的工具(位於其內部目錄之一)間接調用ld
。 這將向您顯示正在使用的-L
選項。gcc
選項中添加-Wl,--verbose
以使其將--verbose
傳遞給鏈接器,以查看如上所述的鏈接器腳本。我在 Linux 上為 gcc 和 clang 找到的最兼容的命令(感謝 armando.sano):
$ gcc -m64 -Xlinker --verbose 2>/dev/null | grep SEARCH | sed 's/SEARCH_DIR("=\?\([^"]\+\)"); */\1\n/g' | grep -vE '^$'
如果你給-m32
,它將輸出正確的庫目錄。
我機器上的例子:
對於g++ -m64
:
/usr/x86_64-linux-gnu/lib64
/usr/i686-linux-gnu/lib64
/usr/local/lib/x86_64-linux-gnu
/usr/local/lib64
/lib/x86_64-linux-gnu
/lib64
/usr/lib/x86_64-linux-gnu
/usr/lib64
/usr/local/lib
/lib
/usr/lib
對於g++ -m32
:
/usr/i686-linux-gnu/lib32
/usr/local/lib32
/lib32
/usr/lib32
/usr/local/lib/i386-linux-gnu
/usr/local/lib
/lib/i386-linux-gnu
/lib
/usr/lib/i386-linux-gnu
/usr/lib
這個問題被標記為 Linux,但也許這在 Linux 下也能正常工作?
gcc -Xlinker -v
在 Mac OS X 下,會打印:
@(#)PROGRAM:ld PROJECT:ld64-224.1
configured to support archs: armv6 armv7 armv7s arm64 i386 x86_64 armv6m armv7m armv7em
Library search paths:
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/usr/lib
Framework search paths:
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/System/Library/Frameworks/
[...]
上面gcc
的-Xlinker
選項只是將-v
傳遞給ld
。 然而:
ld -v
不打印搜索路徑。
Mac版:$ ld -v 2,不知道如何獲取詳細路徑。 輸出
Library search paths:
/usr/lib
/usr/local/lib
Framework search paths:
/Library/Frameworks/
/System/Library/Frameworks/
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.