- 在 linux 中执行程序时,有时会遇到“error while loading shared libraries”这种谬误,这是因为动静链接器 ld 无奈找到程序启动须要的动静库。这时就须要设置动静库的搜寻门路了。
-
动静链接器 ld 搜寻门路的程序以及如何设置:
- ELF 文件中 Dynamic Section 段的 DT_RPATH 设置的门路。例如,能够在编译时增加链接参数“-Wl,–rpath,./lib”来指定搜寻./lib。
- 环境变量 LD_LIBRARY_PATH 设置的门路。
- ELF 文件中 Dynamic section 段的 DT_RUNPATH 设置的门路。应用形式与 1 相似,须要增加–enable-new-dtags 参数。例如,链接参数为“-Wl,–rpath,./lib,–enable-new-dtags”,则是指定 DT_RUNPATH 为./lib。因为 DT_RUNPATH 存在,则 DT_RPATH 会被疏忽。
- /etc/ld.so.cache 中缓存的动静库搜寻门路。能够通过批改配置文件 /etc/ld.so.conf 增删门路(批改后须要运行 ldconfig 命令)。
- 默认的 /lib/ 和 /usr/lib/。如果链接时指定 -z nodefaultlib,这个默认门路将被疏忽。
- PS:能够应用“readelf -d”查看 Dynamic Section 段。
- PPS:如果只想对特定的 app 起作用的话,通过设置 DT_RPATH 或者 DT_RUNPATH 来指定搜寻门路是一个较优的形式。