LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
楼主: lofeng410

请教几个小问题

[复制链接]
发表于 2008-10-23 09:16:59 | 显示全部楼层
Post by lofeng410;1897678
在第一遍make install完binutils后,whereis -b ld 的输出是:
/usr/bin/ld
为什么结果中没有包含/tools/bin/ld?

虽然通过ld --verbose|grep SEARCH看到ld的库搜索路径已经由:
/usr/i486-pc-linux-gnu/lib
/usr/local/lib
/lib
/usr/lib
改变为:
/tools/i686-pc-linux-gnu/lib
/tools/lib
/usr/local/lib
/lib
/usr/lib

可以看出ld已经编译好了,而且在/tools/bin目录下已经有了ld,而且PATH中/tools/bin排在最前面。那为什么whereis ld 的结果是那样的呢?

第一遍编译ld的时候,你的/tools目录下是没有ld的,ld是“刚刚生成”的。但是,编译ld,本身就需要另一个“ld",这个ld就在/usr/bin目录下。

whereis 指令,会找到上一次使用的指令的位置。对于新增加而“没有执行”过的,它会有一个缓冲。所以你刚刚在/tools/bin中增加的ld,用whereis是找不到的。

你可以再输入一次ld命令。Bash将会按照PATH路径找到/tools/bin下的ld。这时whereis的缓冲就有了。
如果你这时再运行whereis ld,应该将显示

/tools/bin/ld;/usr/bin/ld

同理,你“刚刚”拷贝过去的ld-new,没有运行它的话,你直接whereis ld-new,也是找不到的。
回复 支持 反对

使用道具 举报

发表于 2008-10-23 09:20:22 | 显示全部楼层
Post by lofeng410;1897698
用which -a ld得出的结果是:
/tools/bin/ld
/usr/bin/ld
因为which是在PATH里面搜索,但是whereis没有限制范围,怎么还不能得出结果?
---------------------------------
既然shell中执行的指令没有给出路径时是在PATH里面搜索的,那用which是否就已经足够满足我第一帖中的第一点要求?


是的,which就满足要求,它直接搜索PATH,不像whereis有缓冲。只是我用whereis多一些,因为它可以找到lib,还能找到很多东西,只要这个东西在SHELL运行的过程中使用过就可以找到。这样就可以分析。而which功能就简单点。
回复 支持 反对

使用道具 举报

发表于 2008-10-23 09:25:42 | 显示全部楼层
我还找到了一个更简单的办法,可以发现你用make install的时候到底装了哪些东西:

那就是超级强大的find命令!
命令如下:

find /tools -mmin -2

解释:在/tools目录下查找之前2分钟内改变过的文件。

把2改成你想要的任何时间就可以了。
这个灵感得益于LFS手册中的“包管理”那一节。其中的一种包管理方法就是用时间戳。

你可以在上面的命令加管道,导入另一个文件作为查看。比如用>、或者用tee都可以。

我的包管理是用了第一种方式:全部记住!哈哈。
回复 支持 反对

使用道具 举报

发表于 2008-10-23 09:56:40 | 显示全部楼层
Post by lofeng410;1897766
-print-prog-name=<程序>
显示编译器组件 <程序> 的完整路径
这是我gcc --help是得到的,但是-print-prog-name=ld输出的结果只是ld,根本不是完整路径,这是为何呢?是我没有用对这个指令还是?



我看了man手册,用法是:

which `gcc -print-prog-name=ld`

我也搞不清楚和直接which ld有什么区别呵呵。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-10-23 13:00:32 | 显示全部楼层
Post by ti8er;1897869
[QUOTE]作者: lofeng410
手册中说的我基本上明白,现在正在具体的看看每一步都是怎么变化的,呵呵~~

对于那个动态链接器,还有个就是它连接的库的问题。/etc/ld.so.conf这个文件只是在5.6中Glibc的编译过程中为了解决一个无关紧要的warning而生成的,这个文件决定着编译时使用的动态链接库,为什么在这里没有重视?

在编译的时候,Warning是一闪而过的,所以你是根本看不到的。除非你设置把Warning也当成错误,那么就会在那里停住。这个设置可以用gcc的相关参数来完成。[/QUOTE]

我的意思不是说如何解决这个warning。根据手册中说的,
The install stage of Glibc will issue a harmless warning at the end about the absence of /tools/etc/ld.so.conf. Prevent this warning with:

mkdir -v /tools/etc
touch /tools/etc/ld.so.conf

ld.so.conf这个文件可要可不要,但是这个文件不是决定着动态链接器寻找库的路径么?怎么在这里却是可有可无的?

在手册里强调了一定要使用正确的动态连接器,但是动态链接器搜索库的路径同样重要的,但是这点好像一直都没有强调,所以有次疑惑。GCC在安装的过程中会生成一个叫做libgcc的库,这个库有什么用处的呢?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-10-23 13:10:41 | 显示全部楼层
Post by ti8er;1897886
我还找到了一个更简单的办法,可以发现你用make install的时候到底装了哪些东西:

那就是超级强大的find命令!
命令如下:

find /tools -mmin -2

解释:在/tools目录下查找之前2分钟内改变过的文件。

把2改成你想要的任何时间就可以了。
这个灵感得益于LFS手册中的“包管理”那一节。其中的一种包管理方法就是用时间戳。

你可以在上面的命令加管道,导入另一个文件作为查看。比如用>、或者用tee都可以。

我的包管理是用了第一种方式:全部记住!哈哈。


这个find确实很强大~~
你的包管理方式也很强大,我也是也这样的话最后肯定会乱套的。呵呵~~
回复 支持 反对

使用道具 举报

发表于 2008-10-23 14:46:33 | 显示全部楼层
Post by lofeng410;1898027
我的意思不是说如何解决这个warning。根据手册中说的,

ld.so.conf这个文件可要可不要,但是这个文件不是决定着动态链接器寻找库的路径么?怎么在这里却是可有可无的?

在手册里强调了一定要使用正确的动态连接器,但是动态链接器搜索库的路径同样重要的,但是这点好像一直都没有强调,所以有次疑惑。GCC在安装的过程中会生成一个叫做libgcc的库,这个库有什么用处的呢?

看来你还没搞清楚,或者是自己把自己搞乱了。看看我之前写的一篇文章:注意里面提到的工具链编译公式:

http://www.linuxsir.cn/bbs/thread335436.html

5.6章编译的Glibc,依赖的是系统的ld.so.conf,也就是/etc/ld.so.conf,5.6章增加的是/tools/etc/ld.so.conf,
看清楚了。别搞错了对象:到底是哪个决定动态连接库。

GCC生成的libgcc库,是GCC本身需要的。没有它,GCC本身就不能运行起来。

libgcc       Contains run-time support for gcc
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-10-23 16:33:43 | 显示全部楼层
Post by ti8er;1898069
看来你还没搞清楚,或者是自己把自己搞乱了。看看我之前写的一篇文章:注意里面提到的工具链编译公式:

http://www.linuxsir.cn/bbs/thread335436.html

5.6章编译的Glibc,依赖的是系统的ld.so.conf,也就是/etc/ld.so.conf,5.6章增加的是/tools/etc/ld.so.conf,
看清楚了。别搞错了对象:到底是哪个决定动态连接库。

GCC生成的libgcc库,是GCC本身需要的。没有它,GCC本身就不能运行起来。

libgcc       Contains run-time support for gcc


仔细看了那篇文章,基本上理解了。但是对于你在文章中提到的这个概念感到迷惑的很:
有了虚根环境,还会再一次编译库文件。这是因为之前编译的LIB-B是经过重定位装在别的地方的(可见重定位的麻烦),
你要编译一个新的没有重定位的库文件,装在默认的地方,以便将来你的程序都可以利用它。这时生成了LIB-C。
LIB-B+GCC-B2+LD-B2==>LIB-C。
然后,编译GCC和LD,将它们之前的重定位去掉。
LIB-C+GCC-B2+LD-B2==>LD-C
LIB-C+GCC-B2+LD-C==>GCC-C


这里的重定位一直没有搞清楚是什么含义。


另外我查了下cat /etc/ld.so.conf的内容,在LFS-LIVECD中为:
/usr/local/lib
/opt/lib
觉得其实在LFS的过程中ld.so.conf没有起到什么作用。在LFS过程中动态连接器需要搜索的库都在/lib、/usr/lib目录下,根本用不上其他目录下的动态库。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-10-23 17:31:21 | 显示全部楼层
在坛子里看到的关于动态连接器搜索库路径的东东:
在Linux下,大部分系统的library库被安装在/usr/lib目录下。只有一些基本的共享库被安装在/lib目录下。例如:libc.so,libcurses.so,libm.so,libtermcap.so(各个版本对应的文件会有些不同),在其他部分被mount上之前,那些文件是启动Linux系统所必须的。连接器默认的搜索路径是/lib,/usr/lib,/usr/local/lib。

环境变量LD_LIBRARY_PATH列出了查找共享库时除了默认路径之外的其他路径。
/etc/ld.so.conf文件则指出了程序ldconfig要搜索的目录。该程序将这些目录中所有的共享库都存储到/etc/ld.so.cache中。假如共享库已经被从默认的目录中移走,Linux ELF动态连接库将在/etc/ld.so.cache文件中找该共享库。

程序ldconfig将把/etc/ld.so.conf文件中列出的搜索目录中的所有的共享库存储到/etcld.so.cache中。假如共享库已经被从默认的目录中移走,Linux ELF动态连接库将在/etc/ld.so.cache文件中找该共享库。

对于普通用户无法修改/etc/ld.so.conf,又想用其他位置的库,就可以用LD_LIBRARY_PATH
回复 支持 反对

使用道具 举报

发表于 2008-10-23 18:11:02 | 显示全部楼层
恩,不错。这样就更加清楚了。
回复 支持 反对

使用道具 举报

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

本版积分规则

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