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.