gcc链接阶段

来源:互联网 发布:网络传播营销策划案 编辑:程序博客网 时间:2024/06/08 14:04

gcc链接阶段(link time)
  此阶段,告诉编译器,在哪里找到库文件?以静态还是动态的方式链接库文件?默认情况下使用动态方式链接,这要求存在对应的.so动态库文件,如果不存在,则寻找相应的.a静态库文件。


若在编译时向gcc传入-static选项,则使用静态方式链接,这要求所有库文件都必须有对应的*.a静态库。


  那么,是否可以令某些库使用动态链接,另一些库使用静态链接?不太确定,请参考ld的使用手册,我没有这样用过。


在链接阶段,gcc编译器如何寻找库文件呢(linker本身并没有默认的查找路径,这些查找路径是由gcc传递给linker的)


大家可以在编译时,向gcc加入-v选项来观察它向linker传递的库文件查找路径(观察LIBRARY_PATH变量的值),通常查找路径如下:








任何由-rpath-link或-rpath选项指定的目录 
LD_RUN_PATH(如果没有找到-rpath或-rpath-link选项) 
-Ldir1 -Ldir2 ... 
/usr/lib/gcc/// 
/usr/lib/ 
第一行-rpath-link与-rpath选项的区别在于,-rpath选项指定的目录被硬编码到可执行文件中,-rpath-link选项指定的目录只在链接阶段生效。由于这两个选项都是链接器ld的选项,如何从gcc中向ld传递这两个选项?方法如下(更从细节参考gcc的-Wl选项):

gcc -Wl, -rpath, /usr/local/lib

这相当于向ld向传递了如下参数:

ld -rpath /usr/local/lib

第二行,如果没有设置-rpath或-rpath-link选项,则查找LD_RUN_PATH环境变量指定的目录,并把它当作-rpath选项来处理。第三行-Ldir1 -Ldir2 ...,是我们通过gcc的-L选项向其指定的库文件查找路径,查找顺序按照我们传递的-L参数从左到右进行搜索;第四行属于gcc自己的库目录;第五行/usr/lib/是Linux系统默认的系统库文件的目录。第四、第五行,都是gcc自动向linker传递的查找目录。例如我现在的机器上,使用gcc -v可以看到LIBRARY_PATH变量值为:

LIBRARY_PATH=/usr/lib/gcc/i686-redhat-linux/4.5.1/:/usr/lib/

但是这并不是全部真理!根据我自己的测试,我发现gcc会把/usr/local/lib/目录也作为链接阶段的查找路径,这正是问题的根源——我们在链接过程中,使用到了/usr/local/lib/里面的一些库文件,但在运行时阶段,却说找不到该库文件。

原创粉丝点击