文章

Linux系统及编译相关笔记

1. 加载多个DSO中存在同名符号

APP加载的多个DSO,如果存在重复的符号,则只加载第一个遇到的符号。规则适合于包括函数,全局变量。

加载顺序,由链接顺序,以及环境变量定义lib路径优先级,如RPATHLD_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 进行授权