Linux动态链接库搜索目录规则



通过ldd命令可以找出可执行文件所使用动态连接库,但是Linux系统是怎样找到这些在不同目录下的库文件的?
首先,Linux采用文件名匹配的方式来确定动态连接库,也就是在库目录中找文件名和所需库一样的文件。
然而这些库文件散落在不同的目录下,所以就需要一个机制来确定搜索哪些目录和搜索的顺序。
有三类方式影响这个规则:系统的配置文件,可执行文件自带的标签,和环境变量。它们直接互相影响,优先级关系见图。

编译时如何设置rpath/runpath?

CMake中设置CMAKE_INSTALL_RPATH 或者对每个项目设置,如

set_target_properties(project_name PROPERTIES INSTALL_RPATH "${RPATH_DIRECTORIES}")

 

使用rpath还是runpath?

尽量使用runpath,这样运行是可以通过LD_LIBRARY_PATH来控制使用的库。但为什么是尽量?因为runpath不会作用到间接依赖的库,而rpath会。

编译时如何选择rpath或runpath?

通过使用连接器的 –disable-new-dtags 或 –enable-new-dtags 参数
如在CMake中使用

set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--disable-new-dtags")  # use rpath

注意不同版本的gnu-ld 的默认设置不一样,最新版本的默认设置为runpath

如何查看path/runpath?

使用chrpath

 

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.