Directory-Structure
連結器在 /lib 中找不到庫
我正在為 x86_64 目標建構一個小型嵌入式系統,它帶有一個 Linux 核心和一個包含動態連結的busybox的initramfs。
我嘗試將所需的庫(
libm.so.6
,libc.so.6
)安裝到/lib
並將連結器安裝ld-linux-x86-64.so.2
到/lib64
(因為busybox二進製文件在這個地方請求它)。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
或通過在and之間創建符號連結/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。完成
閱讀ld.so(動態連結器/載入器)的手冊。實際的搜尋路徑主要由(由by
/etc/ld.so.cache
編譯)或 ld.so 二進製文件中的內置路徑確定。因此,請檢查您的平台配置以及您如何建構 glibc。/etc/ld.so.conf``ldconfig
LD_DEBUG=libs
您可以通過在環境變數中執行任何帶有 set 的二進製文件來查看 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 ...