Linux系统及编译相关笔记

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

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

加载顺序,由链接顺序,以及环境变量定义lib路径优先级,如RPATHLD_LIBRARY_PATH。路径搜索优先级为:RPATH > LD_LIBRARY_PATH > ld.so.cache

1.1. RPATH

编译期间,设定RPATH,如cmake脚步设置如下:

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使能系统级加载信息:

LD_DEBUG=libs ./test_app

1.3. 参考链接

2. Linux命令:查看APP/DSO的编译器信息

查看架构:

file bin/jouav_cluster_msg_simu
# readelf -h bin/jouav_cluster_msg_simu | grep Machine

查看编译器版本:

readelf -p .comment bin/jouav_cluster_msg_simu

3. 其他文章




    Enjoy Reading This Article?

    Here are some more articles you might like to read next:

  • al-folio 本地部署记录(Ubuntu 24.04)
  • C++ Traits
  • 道格拉斯-普克算法(Douglas–Peucker algorithm)
  • CMake支持库收集
  • QGC代码架构解析:飞行前检查(起飞条件)