ldが検索した順に検索パスを出力する方法は何ですか。
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によって検索されるパスとは異なります(つまり、常にプログラムがリンクされています)。
ld検索パスを上書きするグローバルな方法を意味しました。たとえば、ソースコードをコンパイルしmakefileたり、configureスクリプトからメイクファイルを生成したり、CMakeLists.txtまたはやなどのさらに複雑なソースからメイクファイルを生成しvalaたりする必要がある場合がありsrtます。この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から読み取られます。リンカは、sse2追加のCPU機能に対応するような名前で、基本ライブラリ検索パスの下で追加のディレクトリを検索できます。これらのパスにはhwcap、これらのCPU機能に合わせて調整された追加のライブラリを含めることができます。
最後-pに、-v上記の代わりにを使用すると、ld.so代わりにキャッシュが検索されます。
export LD_LIBRARY_PATH=/some/other/dir、このコマンドの出力に影響が及ばないのはなぜですか?100%動作しないようです。
LD_LIBRARY_PATH。たとえば、LD_DEBUG=libs /lib/ld-linux.so --list cat(実行可能ファイルを使用catできます。私が最初に考えたものとして選びました)。" search path"にgreppingする価値があるかもしれません。/etc/ld.so.cache必要なすべてのライブラリと一致するがある場合、組み込みのシステム検索パスは表示されないことに注意してください。
gcc検索パスは、これらと同じ?
有効な検索パス全体を単純に印刷するオプションがあるかどうかはわかりません。
ただし、検索パスは-L、コマンドラインのオプションで指定されたディレクトリで構成され、その後SEARCH_DIR("...")にリンカスクリプトのディレクティブによって検索パスに追加されたディレクトリが続きます。したがって、これらの両方を確認できれば、次のようにして解決できます。
ld直接呼び出す場合:
-Lオプションを使用すると、彼らは言ったものは何でもあります。--verboseオプションを追加します。SEARCH_DIR("...")通常は出力の上部近くにあるディレクティブを探します。(これらは必ずしもすべての呼び出しで同じではないことに注意してくださいld-リンカーには多数の異なる組み込みデフォルトリンカースクリプトがあり、他のさまざまなリンカーオプションに基づいてそれらから選択します。経由でリンクしている場合gcc:
-vオプションをに渡してgcc、リンカの呼び出し方法を示すことができます。実際、通常はld直接呼び出されませんが、collect2(内部ディレクトリの1つにある)というツールを介して間接的に呼び出されますld。-L使用されているオプションが表示されます。-Wl,--verboseして、リンカーにgcc渡すように--verboseして、上記のリンカースクリプトを表示できます。-T scriptスクリプトを使用していたため、ldのデフォルトスクリプトが完全に置き換えられ、指摘した場所のみが表示されたことがわかりました。
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/
[...]
上記の-Xlinkerオプションはgcc単にに渡さ-vれldます。しかしながら:
ld -v
検索パスを出力しません。
-Lpathます。したがって、@RaphaëlLondeixの回答の方が優れています。
Macバージョン:$ ld -v 2、詳細なパスを取得する方法がわかりません。出力
Library search paths:
/usr/lib
/usr/local/lib
Framework search paths:
/Library/Frameworks/
/System/Library/Frameworks/
ld -v 2
ld。Binutilの人々はビルドスクリプトでそれを無効にしました。それは何年もの間無効にされてきました。
/usr/local/..、ライブラリが見つからないというエラーが発生し、リンクが失敗します。/usr/localその検索パスを除外するには、毎回名前を変更する必要があります。/usr/localパスを除外またはオーバーライドする簡単な方法はありますか?