允许使用 dlopen() 加载的插件动态 link 到它们自己目录中的共享对象

Allow plugins loaded with dlopen() to dynamically link to shared objects in their own directory

我有一个使用 dlopen() 加载插件的应用程序。 插件本身可能需要动态 link 到另一个库(比如 libwhatever.so),该库分布在它们自己的插件文件夹中。 直到运行时,应用程序或插件才知道插件路径。

尝试次数

1) Link 个插件 -Wl,-rpath,. 这不起作用,因为 . 指的是应用程序目录,而不是插件目录。 它需要使用 -Wl,-rpath,relative/path/to/plugin,但插件在编译时不知道此相对路径。

2) 在应用程序中 dlopen() 之前使用 setenv("LD_LIBRARY_PATH", pluginPath, 1)。 这不起作用,因为 ld.so 在应用程序启动之前缓存 LD_LIBRARY_PATH 并且在运行时不注意环境变量。 也许有办法刷新这个缓存?

您正在寻找:

-Wl,-rpath='$ORIGIN'

(注意:单引号——您不希望 shell 扩展它)。

来自man page

  $ORIGIN (or equivalently ${ORIGIN})
      This expands to the directory containing the program or shared
      object.