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
パスを除外またはオーバーライドする簡単な方法はありますか?