LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 980|回复: 6

CLFS based Gentoo ld.so 相关问题

[复制链接]
发表于 2006-5-9 10:56:01 | 显示全部楼层 |阅读模式
我们在 LFS 时, chroot 前, 构建 /tools 时, PATH= /tools:/bin:/usr/bin
chroot 后, 从 /tools 构建 /bin 和 /usr/bin 时 , PATH=/bin:/usr/bin:/tools
目的就是为了尽量使用新编译的程序.

但这对 LD_LIBRARY_PATH 没有规定, 特别是 chroot 后.

ldd 一个程序时, 我们可以看见, 除了 ld-linux.so 其他程序都没有决对路径, 可以通过 ld.so 的配置, LD_LIBRARY_PATH 和 /etc/ld.so.conf 改变.

adjust tool chain 实际就是改变编译程序时硬编码的 ld-linux.so 的路径, /tools 里全部是 /tools/lib/ld-linux.so , /usr 里全部是 /lib/ld-linux.so .

我现在遇到的问题就是, chroot 后, 构造到了 gcc ,
如果不设 LD_LIBRARY_PATH, 它似乎只从 /tools/lib 里找 *.so, 所以, /usr/bin 里几个程序无法执行.
LD_LIBRARY_PATH=/lib:/usr/lib:/tools/lib , 这时 /tools 里的程序就会链接到 /lib:/usr/lib 里, 但可能因为我的 /tools 和 /usr 中配置差距较大, 必然 core dump.
LD_LIBRARY_PATH=/tools/lib:/lib:/usr/lib , 这时 就换 /usr/bin 里的程序 core dump 了.

我认为的理想方式就是:
/tools/bin 里的只链接到 /tools/lib
/bin:/usr/bin 里的只链接到 /lib:/usr/lib

我想问大家, chroot 后, 在 /usr/ 里安装了比如 glibc 和 binutils, 这时, ldd 的情况如何, 会不会出现, 比如 /usr/bin/as -> /tools/lib/libc.so 或者 /tools/bin/make -> /lib/libc.so , 这种情况.

如果不是, 那么 ld.so 的相关设置如何?  LD_LIBRARY_PATH 和 /etc/ld.so.conf 等的设置.

考虑到这种 ld.so 的动态设置, 以前我的 checkpath 脚本, 应该只需要检查 ld-linux.so 的路径, 没有必要检查其他的 so , 这是我考虑不周的地方.
 楼主| 发表于 2006-5-9 11:01:00 | 显示全部楼层
也许是这样的, /tools/lib/ld-linux.so 和 /lib/ld-linux.so 的设置是分开的, 所以可以实现:
/tools/bin 里的只链接到 /tools/lib
/bin:/usr/bin 里的只链接到 /lib:/usr/lib

而这个设置肯定不是 LD_LIBRARY_PATH, 因为这会对两个 ld.so 都起作用.
是不是 /tools/etc/ld.so.conf 和 /etc/ld.so.conf ?

看来我要仔细的看一下 lfs book , 那位大侠知道具体的情况, 说一下吧.
回复 支持 反对

使用道具 举报

发表于 2006-5-9 11:56:34 | 显示全部楼层
在默认安装的 /tools/lib/ld-linux.so 和 /lib/ld-linux.so 中, 不需要 /tools/etc/ld.so.conf 和 /etc/ld.so.conf , 就是:
/tools/bin 里的只链接到 /tools/lib
/bin:/usr/bin 里的只链接到 /lib:/usr/lib

但因为, 我在 adjust tool chain 之前, 安装了 gettext 到 /usr ,导致, gettext 连接  /tools/lib/ld-linux.so  的同时, 连接了 /usr/lib/libgettext*, 于是出现cannot find  /usr/lib/libgettext*,  当时处理错误, 设置了 LD_LIBRARY_PATH . 于是出现问题.

解决, 强制 lib path ,不用默认,
echo /tools/lib >> /tools/etc/ld.so.conf
/tools/sbin/ldconfig

echo /lib >> /etc/ld.so.conf
echo /usr/lib >> /etc/ld.so.conf
/sbin/ldconfig

重新编译 adjust tool chain 前安装到 /usr 所有软件, 确保, 无连接错.

教训,  adjust tool chain 之前不要安装任何软件到 /usr.
回复 支持 反对

使用道具 举报

发表于 2006-5-9 11:59:14 | 显示全部楼层
很多时候, 只要能把问题描述出来, 就能解决一半.

这一次, 我把问题描述后, 就发现了解决方案.

感谢 Linuxsir 和 LFS 版 给我一个描述问题的机会.
回复 支持 反对

使用道具 举报

发表于 2006-5-9 13:01:19 | 显示全部楼层
我看着有点饶~~晕~!
回复 支持 反对

使用道具 举报

发表于 2006-5-9 13:55:30 | 显示全部楼层
你的过程我也看的头晕,大概明白是什么意思,就是工具链的调整,,弄明白了就好。:)。
回复 支持 反对

使用道具 举报

发表于 2006-5-9 13:59:04 | 显示全部楼层
1. 如果不设 LD_LIBRARY_PATH, 它似乎只从 /tools/lib 里找 *.so, 所以, /usr/bin 里几个程序无法执行.
ldd /usr/bin/msgfmt
libgettextsrc.so -> not found
/tools/lib/ld-linux.so

2. LD_LIBRARY_PATH=/lib:/usr/lib:/tools/lib , 这时 /tools 里的程序就会链接到 /lib:/usr/lib 里, 但可能因为我的 /tools 和 /usr 中配置差距较大, 必然 core dump.
ldd /tools/bin/bash
libc.so.6 -> /lib/libc.so.6
/tools/lib/ld-linux.so

/tools/bin/bash: core dump


3. LD_LIBRARY_PATH=/tools/lib:/lib:/usr/lib , 这时 就换 /usr/bin 里的程序 core dump 了.
ldd /usr/bin/ld
libc.so.6 -> /tools/lib/libc.so.6
/lib/ld-linux.so

/usr/bin/ld: core dump
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表