注意: 只有 Linux 才允许自定义标准库。所以以下示例全部基于 Linux 。

指定 Library Search Paths

要告诉 dynamic linker (DL) shared library 的位置有两种方法

  • 安装到标准目录,如 \lib, \usr\lib 等等。
  • LD_LIBRARY_PATH 加入新的 .so 文件。

还有第三种方法,在静态编译时,把路径(a list of directories)直接写入 ELF 文件里

“run-time library path (rpath) list”

如需写入目录,一般是 (可以理解为 -Wl 是给 linkder 的参数)

gcc -Wl,-rpath,path-to-lib-dir
  • 可以使用多个 -Wl,-rpath, 参数
  • 也可以使用一个 -Wl,rpath, 后面接上多个路径(使用 colon-separated list)

据说 -rpath 本身是个 design 错误,

可以用 DT_RUNPATH 在运时覆盖,但不是这里的重点。反正我不觉得有什么错误。

Dynamic string tokens

Dynamic Linker 认识一下特殊的 token ,例如

gcc -Wl,-rpath,'$ORIGIN/lib'

不过不是这里的重点, 反正都会用绝对路径的。

Finding Shared Libraries at Run Time

  1. 看一看 DT_RPATH (即 rpath)
  2. 看一看 LD_LIBRARY_PATH
  3. 看一看 DT_RUNPATH
  4. 看一看 /etc/ld.so.cache
  5. 再看一看 /lib64/usr/lib64

参考资料