原标题:知识详解 | Linux动态库文件搜索路径
五种方法
首先让我们一起来看下,一共有多少种方法来指定告诉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/lib test.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
void pt{
printf("1 path>}
pt2.c
#include
void pt{
printf("2 path>}
pt3.c
#include
void pt{
printf("3 path>}
pt4.c
#include
void pt{
printf("4 path>}
pt5.c
#include
void pt{
printf("5 path>}
然后,分别编译这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
int main{
printf("start....n");
pt;
printf("......endn");
return 0;
}
最后,准备环境,让ld都知道这5个路径:
往/etc/ld.so.conf中增加一行,内容:/tmp/st/3,然后执行 ldconfig 命令。
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....
1 path>......end
这里在可执行文件中动态段中DT_RPATH所指定的路径,因此需要在编译m.c的时候就指定路径,由于其他路径都也告诉了ld,很明显,此种方法优先级最高了。
gcc m.c -o m -L/tmp/st/1 -lpt
./m
start....
2 path>......end
这里很显然调用了LD_LIBRARY_PATH指定了路径中的共享库,因此此种情况优先级第二。
mv /tmp/st/2/libpt.so /tmp/st/2/libpt2.so
/m
start....
3 path>......end
这里是调用了/etc/ld.so.cache中所缓存的动态库路径中的共享库,因此此种情况优先级第三。
mv /tmp/st/3/libpt.so /tmp/st/3/libpt3.so
./m
start....
4 path>......end
这里是调用/lib中的共享库,优先级第四。
rm /lib/libpt.so
./m
start....
5 path>......end
这里是调用/lib中的共享库,优先级第五。
故证明这五种路径指定方法的优先级是:1-->2-->3-->4-->5。返回搜狐,查看更多
责任编辑: