动态链接顺序

从网上查找知道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

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章