私は動的にリンクされたビジボックスを含む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.conf
ldconfig
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