リンカが/ libにライブラリを見つけることができません。

リンカが/ libにライブラリを見つけることができません。

私は動的にリンクされたビジボックスを含むinitramfsとLinuxカーネルを使ってx86_64ターゲット用のコンパクトな組み込みシステムを構築しています。

libm.so.6必要なライブラリ( 、libc.so.6/libとリンカをld-linux-x86-64.so.2インストールしてみました/lib64(ビジボックスバイナリがこの場所で要求するためです)。

lib
├── libc.so.6
└── libm.so.6
lib64
└── ld-linux-x86-64.so.2

ただし、接続に失敗します。

/sbin/init: error while loading shared libraries: libm.so.6: cannot open shared object file: No such file or directory

私はすべてを次に移動して機能させました/lib64

lib64
├── ld-linux-x86-64.so.2
├── libc.so.6
└── libm.so.6

/libまたはとの間にシンボリックリンクを作成する/lib64

lib
├── ld-linux-x86-64.so.2
├── libc.so.6
└── libm.so.6
lib64 -> lib

しかし、最初の構成が機能しない理由はまだ理解されていません。リンカーがライブラリを見つけることができないのはなぜですか/lib

編集する:うまくいくには(yaegashiに感謝します):

  • initramfs ルートディレクトリを入力します。
  • /etc/ld.so.conf必要なライブラリパスでファイルを作成します。

    echo /lib > etc/ld.so.conf

  • ファイルを作成してくださいld.so.cache

    ldconfig -r .

  • initramfsを再構築してください。終わる

答え1

読む手動ld.so(動的リンカー/ローダー)。実際の検索パスは、主に組み込み/etc/ld.so.cache(コンパイルから)パスまたはld.soバイナリによって決まります。したがって、プラットフォームの構成とglibcの構築方法を確認してください。/etc/ld.so.confldconfig

LD_DEBUG=libs環境変数でバイナリセットを実行して、ld.soの詳細なアクティビティを観察できます。

$ LD_DEBUG=libs ls
     17441: find library=libselinux.so.1 [0]; searching
     17441:  search cache=/etc/ld.so.cache
     17441:   trying file=/lib/x86_64-linux-gnu/libselinux.so.1
     17441: 
     17441: find library=libacl.so.1 [0]; searching
     17441:  search cache=/etc/ld.so.cache
     17441:   trying file=/lib/x86_64-linux-gnu/libacl.so.1
     17441: 
     17441: find library=libc.so.6 [0]; searching
     17441:  search cache=/etc/ld.so.cache
     17441:   trying file=/lib/x86_64-linux-gnu/libc.so.6
     ...

答え2

簡単な修正で.bashrcを介してlibシェル環境変数に追加します。LD_LIBRARY_PATH

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib

その後、

source /home/user/.bashrc

関連情報