Directory-Structure

連結器在 /lib 中找不到庫

  • June 1, 2015

我正在為 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
    ...

引用自:https://unix.stackexchange.com/questions/206483