web-dev-qa-db-ja.com

ld(リンカー)検索パスを印刷する方法

ldで検索された検索パスを検索順に印刷する方法は何ですか?.

134
Talespin_Kit

Linuxでは、ldconfigを使用して、ld.soの構成とキャッシュを維持し、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から読み取られます。その後、リンカは、追加のCPU機能に対応するsse2などの名前で、基本ライブラリ検索パスの下にある追加ディレクトリを検索できます。行にhwcapが含まれるこれらのパスには、これらのCPU機能に合わせて調整された追加のライブラリを含めることができます。

最後の注意点:上記の-pの代わりに-vを使用すると、代わりにld.soキャッシュが検索されます。

76
telotortium

これを行うには、次のコマンドを実行します。

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(プログラムがリンクされている場合)。

72
faken

効果的な検索パス全体を単に印刷するためのオプションがあるかどうかはわかりません。

ただし、検索パスは、コマンドラインの-Lオプションで指定されたディレクトリと、それに続くリンカースクリプトのSEARCH_DIR("...")ディレクティブによって検索パスに追加されたディレクトリで構成されます。したがって、両方を見ることができれば解決できます。次のようにします。

ldを直接呼び出す場合:

  • -Lオプションは、あなたが言ったとおりのものです。
  • リンカースクリプトを表示するには、--verboseオプションを追加します。通常、出力の上部近くにあるSEARCH_DIR("...")ディレクティブを探します。 (これらはldの呼び出しごとに必ずしも同じではないことに注意してください-リンカには多くの異なる組み込みデフォルトリンカスクリプトがあり、他のさまざまなリンカオプションに基づいて選択します。)

gccを介してリンクしている場合:

  • -vオプションをgccに渡すと、リンカーを呼び出す方法が示されます。実際、通常はldを直接呼び出すのではなく、collect2(内部ディレクトリの1つにある)と呼ばれるツールを介して間接的に呼び出し、次にldを呼び出します。これにより、どの-Lオプションが使用されているかがわかります。
  • -Wl,--verbosegccオプションに追加して、--verboseをリ​​ンカーに渡し、上記のリンカースクリプトを表示できます。
64

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
24

質問は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オプションは、-vldに渡すだけです。しかしながら:

ld -v

検索パスを出力しません。

5
armando.sano

Macバージョン:$ ld -v 2、詳細なパスを取得する方法がわかりません。出力

Library search paths:
    /usr/lib
    /usr/local/lib
Framework search paths:
    /Library/Frameworks/
    /System/Library/Frameworks/
1
yfeleke