我正在为 x86_64 目标构建一个小型嵌入式系统,带有 Linux 内核和 initramfs,其中包含动态链接的 busybox。
我尝试将所需的库(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
或者通过在和之间创建符号链接/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
到 shell 环境变量,LD_LIBRARY_PATH
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib
进而,
source /home/user/.bashrc