簡體   English   中英

如何打印 ld(linker) 搜索路徑

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM