指定共享库搜索路径的几种方式

Linux 上有三种方式指定运行时动态链接库的搜索路径, 按照优先级顺序从高到低依次是:

  • rpath
  • LD_LIBRARY_PATH
  • runpath

假设我们有一个程序 a.out 动态链接 liba.so

然后将 liba.so 拷贝到两个独立的目录中:

目录结构如下

使用 -Wl,–enable-new-dtags 参数,通过 gcc 告诉 linker (ld, ld.gold, lld) 使用新的 dtags,即 runpath

运行时通过环境变量 LD_LIBRARY_PATH 指定共享库查找路径为目录 2;通过调试动态链接器,可以看到优先在目录 2 中寻找 liba.so,即 LD_LIBRARY_PATH 的优先级高于 runpath.

如果不指定 –enable-new-dtags 这个 linker 参数,或者使用 –disable-new-dtags,则会使用旧的 dtags,即 rpath

运行时通过环境变量 LD_LIBRARY_PATH 指定共享库查找路径为目录 2;通过调试动态链接器,可以看到优先在目录 1 中寻找 liba.so;即 rpath 的优先级高于 LD_LIBRARY_PATH.

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据