如何从共享库链接到具有相对路径的共享库
我正在使用外部库在浏览器上呈现3D图形的Firefox插件。如何从共享库链接到具有相对路径的共享库
问题是我想让插件使用与其一起打包的外部库而不更改LD_LIBRARY_PATH
变量。
库安装在相对于插件(共享库)的位置,而实际的可执行文件(即浏览器)可以位于其他位置。
你必须知道的一些事情。 我测试它在Ubuntu(在Windows版本的插件没有问题) 我的依赖是OpenSceneGraph的图书馆和静态编译将使插件真正的大(不是如果有另外一个选项)
希望你能帮我
此致敬礼。
您可以在编译期间使用-L
标志来指定链接器可以找到您的共享对象的相对路径。
如果您已经生成了lib,可以通过直接调用ld
命令进行链接。
提示:可以轻松地检查如果某些符号在使用UNIX命令nm
一个lib定义。这是检查链接是否完成的有用方法。
(如果我是你,我只想改变temporaly的LD_LIBRARY_PATH
如您在您的文章说,为什么你不希望这样做?)
这不是关于链接器查找库的问题,而是关于加载程序在相对于当前正在加载的库(插件)中找到它们的位置。使用插件无法控制主机进程(即浏览器)的调用方式,因此环境变量不会这样做。在OS X上'@ loader_path'在Linux上我不知道。 – 2010-10-18 16:16:21
对不起,读书不好。也许最好的做法是使用语言特定的命令在运行时加载lib。如果我没有找到正确解决这个问题的方法,我可能会在明天删除这个答案。 – ThR37 2010-10-18 16:35:20
通常的动态加载有没有存根的主要缺点,所以你必须手动解析符号:/ – 2010-10-18 16:50:40
连接时使用rpath的选项,并指定“专项'路径$ ORIGIN。
例子:
-Wl,-R,'$ORIGIN/../lib'
下面是使用$ ORIGIN阐述网站: http://www.itee.uq.edu.au/~daniel/using_origin/
链接被破坏(5岁是我知道:)) – dashesy 2015-09-02 20:02:04
[Wayback Machine](https:// web.archive.org/web/20130915172134/http://itee.uq.edu.au/~daniel/using_origin/)拯救:) – 865719 2015-12-13 02:44:18
此外,[看起来](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
是错误的使用相对rpath的安全原因,
您应该使用libdl功能(dlopen等)
如果实施得不好,rpath的使用肯定会导致问题,但Linux(和其他系统)具有内置的安全防护措施。例如,在某些情况下,ld.so根本不会扩展ORIGIN。另外,对于可重定位程序来说,相对路径是绝对必要的;否则,你最终不得不安装一个软件包到一个固定的位置 - 例如,被强制安装matlab到/ usr/share/matlab,而不是像/ opt/matlab或/ usr/local/matlab等等 – 2012-07-03 16:09:54
此外,人们可以对是否使用ORIGIN扩展做出明智的决定,特别是如果有问题的软件是自己创建的并在自己的硬件上使用。 – 2012-07-03 16:10:44
这可能是有用的:http://*.com/questions/3015411/shipping-gnu-linux-firefox-plugin-with-shared-libraries-for-installation-with-no – 2010-10-19 07:23:56
有趣的是,我可以用一个简单的测试程序来确认。它使用'dlopen()'加载'lib1'和'lib1'链接到'lib2'并使用'$ ORIGIN'从相对路径加载它。这工作没有问题。 – 2010-10-19 22:56:06