Linux系统及编译相关笔记
1. 加载多个DSO中存在同名符号
APP
加载的多个DSO
,如果存在重复的符号,则只加载第一个遇到的符号。规则适合于包括函数,全局变量。
加载顺序,由链接顺序,以及环境变量定义lib路径优先级,如RPATH
,LD_LIBRARY_PATH
。路径搜索优先级为:RPATH
> LD_LIBRARY_PATH
> ld.so.cache
。
1.1. RPATH
编译期间,设定RPATH
,如cmake
脚步设置如下:
1
set_target_properties(${target_name} PROPERTIES LINK_FLAGS "-Wl,-rpath='$ORIGIN' ")
如果存在间接依赖,则也优先使用RPATH
设定的路径进行搜索。
1.1.1. ORIGIN 占位符
$ORIGIN
是一个特殊的占位符,代表可执行文件或库文件自身的目录,当设置为$ORIGIN
时,它告诉动态链接器在可执行文件或库所在的同一目录下查找依赖的库。
1.2. 调试lib加载–LD_DEBUG
设置环境变量LD_DEBUG
使能系统级加载信息:
1
LD_DEBUG=libs ./test_app
1.3. 参考链接
本文由作者按照 CC BY 4.0 进行授权