Linux 如何使用相对路径从共享库链接到共享库?

Linux 如何使用相对路径从共享库链接到共享库?,linux,gcc,linker,shared-libraries,Linux,Gcc,Linker,Shared Libraries,我正在开发一个Firefox插件,它使用外部库在浏览器上渲染3D图形 问题是,我希望插件使用附带的外部库,而不更改LD\u LIBRARY\u PATH变量。 这些库安装在相对于插件的位置(也是一个共享库),而实际的可执行文件(即浏览器)可以完全位于其他位置 我正在Ubuntu上测试它(在Windows版本的插件上没有问题) 我的依赖项是OpenSceneGraph库,静态编译将使插件变得非常大(如果有其他插件,则不是一个选项)。您可以在编译过程中使用-L标志来指定链接器可以找到共享对象的相对路

我正在开发一个Firefox插件,它使用外部库在浏览器上渲染3D图形

问题是,我希望插件使用附带的外部库,而不更改
LD\u LIBRARY\u PATH
变量。
这些库安装在相对于插件的位置(也是一个共享库),而实际的可执行文件(即浏览器)可以完全位于其他位置

我正在Ubuntu上测试它(在Windows版本的插件上没有问题)
我的依赖项是OpenSceneGraph库,静态编译将使插件变得非常大(如果有其他插件,则不是一个选项)。

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

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

提示:您可以使用unix命令
nm
轻松检查库中是否定义了某些符号。这是检查链接是否完成得很好的一种有用方法


(如果我是你,我会暂时改变
LD\u LIBRARY\u路径,就像你在文章中说的那样。你为什么不想这样做?

在链接和指定“特殊”路径时使用rpath选项$ORIGIN

例如:

-Wl,-R,'$ORIGIN/../lib'
这里有一个网站详细介绍了如何使用$ORIGIN
出于安全原因使用相对rpath是错误的


您应该使用libdl函数(dlopen等)

这不是链接器查找库的问题,而是加载程序在相对于当前加载的库(插件)的位置查找库的问题。使用插件,您无法控制主机进程(即浏览器)的调用方式,因此环境变量无法做到这一点。在OS X上
@loader\u path
会起作用,在Linux上我不知道。好吧,很抱歉读错了。也许最好的办法是在运行时使用特定于语言的命令来加载库。如果我找不到合适的解决方法,明天我可能会删除这个答案。通常的动态加载的主要缺点是没有存根,因此您必须手动解析符号:/n这可能很有用:有趣,我可以通过一个简单的测试程序确认这一点。它使用
dlopen()
加载
lib1
lib1
链接到
lib2
,并使用
$ORIGIN
从相对路径加载。如果实现得不好,rpath的使用肯定会导致问题,但是Linux(和其他系统)有内置的保护措施。例如,在某些情况下,ld.so根本不会扩展ORIGIN。此外,相对路径对于可重定位程序是绝对必要的;否则,您将不得不将软件包安装到固定位置——例如,被迫将matlab安装到/usr/share/matlab,而不是像/opt/matlab或/usr/local/matlab之类的东西。此外,人们还可以在知情的情况下决定是否使用ORIGIN expansion,特别是如果所讨论的软件是他们自己创建的,并在他们自己的硬件上使用。链接已断开(5年前是的,我知道:))到救援:)同样,这也有帮助(尽管我还没有尝试过…)