Linux动态库文件搜索路径[转]

转自:http://blog.sina.com.cn/s/blog_690c46500100kxhd.html

   首先回答前面的问题,一共有多少种方法来指定告诉linux共享库链接器ld.so已经编译好的库libbase.so的位置呢?答案是一共有五种,它们都可以通知ld.so去哪些地方找下已经编译好的c语言函数动态库,它们是:

   1)ELF可执行文件中动态段中DT_RPATH所指定的路径。即在编译目标代码时,对gcc加入链接参数“-Wl,-rpath”指定动态库搜索路径,eg:gcc-Wl,-rpath,/home/arc/test,-rpath,/lib/,-rpath,/usr/lib/,-rpath,/usr/local/libtest.c

   2)环境变量LD_LIBRARY_PATH 指定的动态库搜索路径

   3)/etc/ld.so.cache中所缓存的动态库路径,这个可以通过先修改配置文件/etc/ld.so.conf中指定的动态库搜索路径,然后执行ldconfig命令来改变。

   4)默认的动态库搜索路径/lib

   5)默认的动态库搜索路径/usr/lib

   另外:在嵌入式Linux系统的实际应用中,1和2被经常使用,也有一些相对简单的的嵌入式系统会采用4或5的路径来规范动态库,3在嵌入式系统中使用的比较少,因为有很多系统根本就不支持ld.so.cache。

   那么,动态链接器ld.so在这五种路径中,是按照什么样的顺序来搜索需要的动态共享库呢?答案这里先告知就是按照上面的顺序来得,即优先级是:1-->2-->3-->4-->5。我们可以写简单的程序来证明这个结论。

 

   首先,写成5个函数,这5个函数名称都叫pt,但是里面的内容不一样:

pt1.c

#include <stdio.h>

void pt(){

       printf("1  path on the gcc give \n");

}

 

pt2.c 

#include <stdio.h>

void pt(){

       printf("2 path on the LD_LIBRARY_PATH \n");

}

 

pt3.c 

#include <stdio.h>

void pt(){

       printf("3 path on the /etc/ld.so.conf \n");

}

 

pt4.c 

#include <stdio.h>

void pt(){

       printf("4 path on the /lib \n");

}

 

pt5.c 

#include <stdio.h>

void pt(){

       printf("5 path on the /usr/lib \n");

}

 

   然后,分别编译这5个函数,然后将它们分别移到上面5种情况对应的5个不同目录下:

gcc -fPIC -c pt1.c -o pt.o

gcc -shared pt.o -o libpt.so

mv libpt.so /tmp/st/1/

 

gcc -fPIC -c pt2.c -o pt.o

gcc -shared pt.o -o libpt.so

mv libpt.so /tmp/st/2/

 

gcc -fPIC -c pt3.c -o pt.o

gcc -shared pt.o -o libpt.so

mv libpt.so /tmp/st/3/

 

gcc -fPIC -c pt4.c -o pt.o

gcc -shared pt.o -o libpt.so

mv libpt.so /lib/

 

gcc -fPIC -c pt5.c -o pt.o

gcc -shared pt.o -o libpt.so

mv libpt.so /usr/lib/

 

   再次,编写一个main函数m,让它来调用函数pt:

m.c

#include <stdio.h>

 

 

int main(){

       printf("start....\n");

       pt();

       printf("......end\n");

       return 0;

}

 

   最后,准备环境,让ld都知道这5个路径:

(a) 往/etc/ld.so.conf总增加一行,内容:/tmp/st/3,然后执行 ldconfig 命令

(b) export LD_LIBRARY_PATH=/tmp/st/2

另外3中路径,ld都可以得到,请接着看下面。

    之后测试:

gcc m.c -o m1 -L/tmp/st/1 -lpt -Wl,-rpath,/tmp/st/1

./m1

start....

path on the gcc give

......end

这里在可执行文件中动态段中DT_RPATH所指定的路径,因此需要在编译m.c的时候就指定路径,由于其他路径都也告诉了ld,很明显,此种方法优先级最高了。

 

gcc m.c -o m -L/tmp/st/1 -lpt

./m

start....

2 path on the LD_LIBRARY_PATH

......end

这里很显然调用了LD_LIBRARY_PATH指定了路径中的共享库,因此此种情况优先级第二。

 

mv /tmp/st/2/libpt.so /tmp/st/2/libpt2.so

/m

start....

3 path on the /etc/ld.so.conf

......end

这里是调用了/etc/ld.so.cache中所缓存的动态库路径中的共享库,因此此种情况优先级第三。

 

mv /tmp/st/3/libpt.so /tmp/st/3/libpt3.so

./m

start....

4 path on the /lib

......end

这里是调用/lib中的共享库,优先级第四。

 

rm /lib/libpt.so

./m

start....

5 path on the /usr/lib

......end

这里是调用/lib中的共享库,优先级第五。

 

   故证明这五种路径指定方法的优先级是1-->2-->3-->4-->5!



补充:

http://www.360doc.com/content/10/0123/14/79031_14221613.shtml
编译参数解析
最主要的是GCC命令行的一个选项:
-shared 该选项指定生成动态连接库(让连接器生成T类型的导出符号表,有时候也生成弱连接W类型的导出符号),不用该标志外部程序无法连接。相当于一个可执行文件

l -fPIC:表示编译为位置独立的代码,不用此选项的话编译后的代码是位置相关的所以动态载入时是通过代码拷贝的方式来满足不同进程的需要,而不能达到真正代码段共享的目的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux 动态库搜索路径是指在 Linux 系统下,动态链接器(ld)搜索和加载共享库(.so)时,按照一定的优先级和搜索路径去查找目标共享库的过程。 在 Linux 中,系统动态共享库的存放路径一般有如下几个: 1. /usr/lib:系统提供的共享库路径,一些常用的共享库会被安装在该目录下。 2. /lib:系统提供的另一个共享库路径,类似于 /usr/lib,但一些重要的共享库会被安装在该目录下,这些库通常是系统引导过程中需要的。 3. LD_LIBRARY_PATH 环境变量:如果设置了该环境变量,ld 将会在其所指定的路径中查找共享库,而不是在默认路径中查找。 4. /etc/ld.so.conf 文件:该文件指定了需要搜索的共享库路径,如果没有指定,ld 会使用默认路径搜索共享库。 5. /etc/ld.so.cache 文件:该文件记录了系统中已经安装的共享库和其路径信息,ld 可以通过该文件快速查找共享库,避免搜索时的性能损失。 在进行动态共享库链接时,系统动态链接器会按照以上搜索路径的优先级从上至下查找目标共享库。如果要修改默认的动态库搜索路径,可以在 /etc/ld.so.conf 中添加自定义库路径,并运行 ldconfig 命令更新缓存信息。 总之,动态库搜索路径Linux 下非常重要的概念,对于程序员和系统管理员而言,了解动态库搜索路径有助于更好地管理系统共享库,提高应用程序的可用性和性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值