ldで検索された検索パスを検索順に印刷する方法は何ですか?.
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
キャッシュが検索されます。
これを行うには、次のコマンドを実行します。
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(プログラムがリンクされている場合)。
効果的な検索パス全体を単に印刷するためのオプションがあるかどうかはわかりません。
ただし、検索パスは、コマンドラインの-L
オプションで指定されたディレクトリと、それに続くリンカースクリプトのSEARCH_DIR("...")
ディレクティブによって検索パスに追加されたディレクトリで構成されます。したがって、両方を見ることができれば解決できます。次のようにします。
ld
を直接呼び出す場合:
-L
オプションは、あなたが言ったとおりのものです。--verbose
オプションを追加します。通常、出力の上部近くにあるSEARCH_DIR("...")
ディレクティブを探します。 (これらはld
の呼び出しごとに必ずしも同じではないことに注意してください-リンカには多くの異なる組み込みデフォルトリンカスクリプトがあり、他のさまざまなリンカオプションに基づいて選択します。)gcc
を介してリンクしている場合:
-v
オプションをgcc
に渡すと、リンカーを呼び出す方法が示されます。実際、通常はld
を直接呼び出すのではなく、collect2
(内部ディレクトリの1つにある)と呼ばれるツールを介して間接的に呼び出し、次にld
を呼び出します。これにより、どの-L
オプションが使用されているかがわかります。-Wl,--verbose
をgcc
オプションに追加して、--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/