Linker 允许加载了dlopen()的插件动态链接到它们自己目录中的共享对象

Linker 允许加载了dlopen()的插件动态链接到它们自己目录中的共享对象,linker,ld,dynamic-linking,dlopen,Linker,Ld,Dynamic Linking,Dlopen,我有一个应用程序可以加载带有dlopen()的插件。 插件本身可能需要动态链接到另一个库(比如libwhater.so),该库分布在插件文件夹中。 直到运行时,应用程序或插件才知道插件路径 尝试 1) 将插件链接到-Wl,-rpath,. 这不起作用,因为引用的是应用程序目录,而不是插件目录。 它需要使用-Wl,-rpath,relative/path/to/plugin,但是插件在编译时不知道这个相对路径 2) 在应用程序中的dlopen()之前使用setenv(“LD\u LIBRARY\u

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

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

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

您正在寻找:

-Wl,-rpath='$ORIGIN'
(注意:单引号引用它——您不希望shell扩展它)

从:


这似乎是我需要的。我之前测试了$ORIGIN,但不知何故错误地认为它与
-rpath=”相同。
它实际上是指“共享对象目录”。@Vortico当您之前测试它时,您是否引用了它?是的。可能还有其他阻碍加载共享对象的因素。
  $ORIGIN (or equivalently ${ORIGIN})
      This expands to the directory containing the program or shared
      object.