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


回答:


95

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

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によって検索されるパスとは異なります(つまり、常にプログラムがリンクされています)。


2
あなたはその場に当たりました。リンク中に問題が発生しました。リンクプロセス中に、リンカーが手動でインストールされたライブラリを見つけ/usr/local/..、ライブラリが見つからないというエラーが発生し、リンクが失敗します。/usr/localその検索パスを除外するには、毎回名前を変更する必要があります。/usr/localパスを除外またはオーバーライドする簡単な方法はありますか?
ケン2009

1
GCCへの-Lオプションを使用して、ライブラリパスを手動で指定することができます。これは、システムライブラリパスをオーバーライドする(確信がない)と思います。コンパイルする前にLIBRARY_PATH
環境

1
コマンドラインコンパイルでリンクすることは知っています。ld検索パスを上書きするグローバルな方法を意味しました。たとえば、ソースコードをコンパイルしmakefileたり、configureスクリプトからメイクファイルを生成したり、CMakeLists.txtまたはやなどのさらに複雑なソースからメイクファイルを生成しvalaたりする必要がある場合がありsrtます。このldような場合、検索パスを変更するのは難しい
kenn

CMakeを使用する場合、構成フェーズで使用される正確なライブラリーを選択できます(これらのエントリーの一部は、拡張モードでのみ表示されます)。Autotoolsのconfigureスクリプトについては、この回答をご覧ください:stackoverflow.com/questions/7561509/…。これはあなたの質問に直接答えることはしませんが、あなたが望むことをするのを助けるかもしれません。
2014

81

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代わりにキャッシュが検索されます。


51
ローダー(ld.so)ではなく、リンカー(ld)について質問しています。
2013

3
を設定してもexport LD_LIBRARY_PATH=/some/other/dir、このコマンドの出力に影響が及ばないのはなぜですか?100%動作しないようです。
TMS

3
@fons Funnythingは私がこの答えを探してここに来たことです。:)リンク時または実行時のパス?それが問題だと思います。LIBRAY_PATH(リンク時)対LD_LIBRARY_PATH。
Daniel Santos

2
一部のプラットフォーム(Linaroツールチェーンを備えたアームなど)では、ldconfigが実際にはランタイムリンカーと同じディレクトリを検索しないことがわかりました。デバッグを有効にすることで、検索パスを出力し、そこからパスを含めることができますLD_LIBRARY_PATH。たとえば、LD_DEBUG=libs /lib/ld-linux.so --list cat(実行可能ファイルを使用catできます。私が最初に考えたものとして選びました)。" search path"にgreppingする価値があるかもしれません。/etc/ld.so.cache必要なすべてのライブラリと一致するがある場合、組み込みのシステム検索パスは表示されないことに注意してください。
ジョンO'M。

あるgcc検索パスは、これらと同じ?
nn0p 2016

67

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

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

ld直接呼び出す場合:

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

経由でリンクしている場合gcc

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

5
リンカの--verboseオプションがトリックを実行しました。非常に役立ちます!
Ari

リンカがどこを探しているのか一生懸命探していて、出力にSEARCH_DIRが見つかりませんでした。-T scriptスクリプトを使用していたため、ldのデフォルトスクリプトが完全に置き換えられ、指摘した場所のみが表示されたことがわかりました。
thomasa88 14

29

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

ありがとうございました!小さな拡張-1つまたは2つのgrepを取り除きます:sed -n 's / SEARCH_DIR( "= \?([^"] \ +) "); * / \ 1 \ n / gp'
Bruce K

2
なぜこれはそのようなあいまいな方法を必要とするのですか?
bmacnaughton

これは魅力のように働きました!このリストのディレクトリ、リンカー検索パスをどのように追加しますか?
パリ2018

6

質問は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単にに渡さ-vldます。しかしながら:

ld -v

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


Linuxでは、ディレクトリも出力しますが、の形式で出力し-Lpathます。したがって、@RaphaëlLondeixの回答の方が優れています。
pevik 2017年

2

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

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

3
「開けません2:そのようなファイルやディレクトリはありません」と表示されます。実行中ld -v 2
ジャック、

2
質問のタグはLinuxではなく、OS Xです。OSXでGNUを使用しているとは思いませんld。Binutilの人々はビルドスクリプトでそれを無効にしました。それは何年もの間無効にされてきました。
jww
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.