链接器在 /lib 中找不到库

链接器在 /lib 中找不到库

我正在为 x86_64 目标构建一个小型嵌入式系统,带有 Linux 内核和 initramfs,其中包含动态链接的 busybox。

我尝试将所需的库(libm.so.6libc.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或者通过在和之间创建符号链接/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到 shell 环境变量,LD_LIBRARY_PATH

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib

进而,

source /home/user/.bashrc

相关内容