2010-10-18 137 views
19

我正在使用外部库在浏览器上呈现3D图形的Firefox插件。如何从共享库链接到具有相对路径的共享库

问题是我想让插件使用与其一起打包的外部库而不更改LD_LIBRARY_PATH变量。
库安装在相对于插件(共享库)的位置,而实际的可执行文件(即浏览器)可以位于其他位置。

你必须知道的一些事情。 我测试它在Ubuntu(在Windows版本的插件没有问题) 我的依赖是OpenSceneGraph的图书馆和静态编译将使插件真正的大(不是如果有另外一个选项)

希望你能帮我

此致敬礼。

+2

这可能是有用的:http://stackoverflow.com/questions/3015411/shipping-gnu-linux-firefox-plugin-with-shared-libraries-for-installation-with-no – 2010-10-19 07:23:56

+0

有趣的是,我可以用一个简单的测试程序来确认。它使用'dlopen()'加载'lib1'和'lib1'链接到'lib2'并使用'$ ORIGIN'从相对路径加载它。这工作没有问题。 – 2010-10-19 22:56:06

回答

0

您可以在编译期间使用-L标志来指定链接器可以找到您的共享对象的相对路径。

如果您已经生成了lib,可以通过直接调用ld命令进行链接。

提示:可以轻松地检查如果某些符号在使用UNIX命令nm一个lib定义。这是检查链接是否完成的有用方法。

(如果我是你,我只想改变temporaly的LD_LIBRARY_PATH如您在您的文章说,为什么你不希望这样做?)

+0

这不是关于链接器查找库的问题,而是关于加载程序在相对于当前正在加载的库(插件)中找到它们的位置。使用插件无法控制主机进程(即浏览器)的调用方式,因此环境变量不会这样做。在OS X上'@ loader_path'在Linux上我不知道。 – 2010-10-18 16:16:21

+0

对不起,读书不好。也许最好的做法是使用语言特定的命令在运行时加载lib。如果我没有找到正确解决这个问题的方法,我可能会在明天删除这个答案。 – ThR37 2010-10-18 16:35:20

+0

通常的动态加载有没有存根的主要缺点,所以你必须手动解析符号:/ – 2010-10-18 16:50:40

26

连接时使用rpath的选项,并指定“专项'路径$ ORIGIN

例子:

-Wl,-R,'$ORIGIN/../lib' 

下面是使用$ ORIGIN阐述网站: http://www.itee.uq.edu.au/~daniel/using_origin/

+5

链接被破坏(5岁是我知道:)) – dashesy 2015-09-02 20:02:04

+0

[Wayback Machine](https:// web.archive.org/web/20130915172134/http://itee.uq.edu.au/~daniel/using_origin/)拯救:) – 865719 2015-12-13 02:44:18

+0

此外,[看起来](https://en.wikipedia.org/wiki/Rpath)['chrpath'](http://man.devl.cz/man/1/chrpath)和['patchelf'](http://man.devl.cz/man/1/patchelf )也可以提供帮助(虽然我还没有尝试过) – 865719 2015-12-13 02:53:54

-2

是错误的使用相对rpath的安全原因,

您应该使用libdl功能(dlopen等)

+3

如果实施得不好,rpath的使用肯定会导致问题,但Linux(和其他系统)具有内置的安全防护措施。例如,在某些情况下,ld.so根本不会扩展ORIGIN。另外,对于可重定位程序来说,相对路径是绝对必要的;否则,你最终不得不安装一个软件包到一个固定的位置 - 例如,被强制安装matlab到/ usr/share/matlab,而不是像/ opt/matlab或/ usr/local/matlab等等 – 2012-07-03 16:09:54

+1

此外,人们可以对是否使用ORIGIN扩展做出明智的决定,特别是如果有问题的软件是自己创建的并在自己的硬件上使用。 – 2012-07-03 16:10:44