从网上查找知道RPATH的优先级高于LD_LIBRARY_PATH
那LD_LIBARY_PATH中的多个路径存在同名的so文件的时候bin会选择哪一个?
用两个so和一个bin做实验验证下上面两个问题
实验环境gcc 5.4 ubuntu 16
文件目录结构
a.c b.c mai.c build.sh start.sh ./lib ./lib/deps
文件内容如下
a.c
#include <stdio.h>
void test_func(void)
{
printf("this is a.so test func\n");
}
b.c
#include <stdio.h>
void test_func(void)
{
printf("this is b.so test func\n");
}
main.c
#include <stdio.h>
extern void test_func(void);
int main(void)
{
test_func();
return 1;
}
build.sh
#!/bin/sh
gcc ./a.c -fPIC -shared -o libtest.so
cp ./libtest.so ./lib
gcc ./b.c -fPIC -shared -o libtest.so
cp ./libtest.so ./lib/deps
rm -rf libtest.so
gcc main.c -L./lib -ltest -o test
start.sh
#!/bin/sh
export LD_LIBRARY_PATH=./lib:./lib/deps
./test
将start.sh 的LD_LIBRARY_PATH 中lib和lib/deps的顺序变换可以得到不同的输出结果并可以得知,elf文件运行时在LD_LIBRARY_PATH中查找依赖so文件时会加载放在前面位置的so文件
如果有指定-rpath的情况下结果,build 脚本修改如下
build.sh
#!/bin/sh
gcc ./a.c -fPIC -shared -o libtest.so
cp ./libtest.so ./lib
gcc ./b.c -fPIC -shared -o libtest.so
cp ./libtest.so ./lib/deps
rm -rf libtest.so
gcc main.c -L./lib -ltest -Wl,-rpath=/home/faun/so_path/lib -o test
可以用readelf -d test 查看rpath 段的内容
faun@faun-TM1701:~/proj/so_path$ readelf -d test
Dynamic section at offset 0xe08 contains 26 entries:
标记 类型 名称/值
0x0000000000000001 (NEEDED) 共享库:[libtest.so]
0x0000000000000001 (NEEDED) 共享库:[libc.so.6]
0x000000000000000f (RPATH) Library rpath: [/home/faun/so_path/lib]
0x000000000000000c (INIT) 0x400548
lib目录中放的是a lib/deps中放的是b
添加了rpath后 ./start.sh的执行结果依然是根据LD_LIBRARY_PATH中的靠前的路径
最终结论:
同名的so文件同时出现在LD_LIBRARY_PATH的不同路径时候靠前的PATH中的so会被优先加载
即使定义了rpath,elf 执行时候会优先加载LD_LIBRARY_PATH路径中的so