动态链接库链接顺序
总结
概念
- -L 用于链接时指定显示链接的库的搜索路径(优先级高)
- -rpath 用于在链接时指定直接或间接链接的库搜索路径(最高优先级),并且(写入二进制文件中RPATH)指定运行时的本二进制文件的直接或间接依赖的动态加载库搜索路径(最高优先级)。注:有些系统默认开启链接选项-enable-new-dtags,导致-rpath生成RUNPATH。通过指定链接选项-disable-new-dtags来使其生成RPATH。
- -rpath-link 用于在链接时指定直接或间接链接的库搜索路径(优先级高)。
- LD_LIBRARY_PATH 在运行时搜索直接或间接依赖。优先级低于RPATH为第二优先级
- RUNPATH写入在二进制文件中,用于指定运行时本二进制文件的直接依赖动态加载库搜索路径(优先级低于LD_LIBRARY_PATH)。存在时覆盖二进制文件中RPATH。
工具
- ldd -s lib_path
- LD_DEBUG=libs lib_path
- readelf -d lib_path
- cmake 设置rpath指令
- chrpath -r [new_rpath] [lib_name] 注:只能改路径比原来短的.
- patchelf –set-rpath [new_rpath] [lib_name] 注:没有限制路径长度,但是修改的是RUNPATH