虚拟机:GCC共享库在连接时的搜索位置和优选次序

电子说

1.3w人已加入

描述

假设有两个相同的共享库,一个在标准的共享库搜索目录(/lib/i386-linux-gnu), 一个在非标准目录(/home/charles/tmp):

搜索

在/home/charles/tmp下有个测试程序main.c, 调用共享库里的函数。

用如下的命令编译:
搜索

用ldd看一下link的共享库:

搜索

可以看出,虽然我们指定了 要使用 /home/charles/tmp下的库,但实际上用的还是标准搜索路径下的库。

换句话说,GNU ld 优选搜索标准路径下的文件,然后才是 -L指定的

现在执行

export LD_LIBRARY_PATH=/home/charles/tmp

搜索

可见, LD_LIBRARY_PATH指定的路径优选于系统标准目录。

最后尝试一下如下的方法:

gcc main.c -wl,-rpath,/home/charles/tmp -g -o main -lshared

或者:

gcc main.c -Wl,-rpath /home/charles/tmp -g -o main -lshared

搜索

最后,总结一下,共享库的搜索顺序(按照优先次序):

1) LD_LIBRARY_PATH指定的目录

2) rpath指定的路径。

rpath指定的路径同时被写进了二进制文件里面。

p$ readelf -d main | grep rpath

0x0000000f (RPATH) Library rpath: [/home/charles/tmp]

3)系统标准路径

这包括 /lib, /usr/lib, /usr/local/lib以及在/etc/ld.conf 里面指定的路径。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分