Linux C ++尝试使用绝对路径加载一个特定的库,而其他所有库则使用相对路径链接

274

我遇到以下问题:我正在尝试创建程序的可移植版本,因此我将rpath设置为“”。因此,所有库都使用相对文件路径进行链接。这确实适用于除一个库以外的所有库。由于某种原因,该程序仅在编译时链接到的特定位置上存在一个特定的库时才起作用。我自己写的那个,也把它的rpath设置为“。”。因此,从根本上讲,即使库与可执行文件的位置完全相同,该程序也将拒绝启动。
我已经验证了只有一个库是问题所在,因为如果在测试计算机上的计算机上创建了该库所在的文件夹,则程序将启动。

linux-vdso.so.1 =>  (0x00007ffcc5961000)
libOgreHlmsPbs.so.2.1.0 => ./libOgreHlmsPbs.so.2.1.0 (0x00007fedeec3f000)
libOgreHlmsUnlit.so.2.1.0 => ./libOgreHlmsUnlit.so.2.1.0 (0x00007fedeea1d000)
libOgreMain.so.2.1.0 => ./libOgreMain.so.2.1.0 (0x00007fedee194000)
/home/marvin/workspace/HLMS_DS_DEMO/libHLMS_DS.so => not found

那么,有没有人知道导致Linux尝试在原始位置而不是相对其他位置的相对位置找到该库的想法?该程序在Windows上也可以正常运行。

马克西姆·埃格鲁什金

我将rpath设置为,.因此所有库都使用相对文件路径链接

.在rpath中使用是一个糟糕的主意:

  • 可用性:必须从特定的工作目录运行该应用程序。
  • 安全性:攻击者可能会将修改后的.so文件放在另一个目录中,然后从该目录运行您的应用程序。

正确的方法是使用-rpath=$ORIGIN功能。man ld.so

$ ORIGIN(或等效的$ {ORIGIN})将扩展到包含程序或共享库的目录。因此,可以使用以下命令编译位于somedir / app中的应用程序:

gcc -Wl,-rpath,'$ORIGIN/../lib'

这样,无论somedir在目录层次结构中的什么位置,它都可以在somedir / lib中找到关联的共享对象。这有助于创建“交钥匙”应用程序,这些应用程序不需要安装到特殊目录中,而是可以解压缩到任何目录中,并且仍然可以找到它们自己的共享库。

$ORIGIN语法是有点可惜,因为它被扩展为双方的变量makebash,所以你可能需要适当地引用它。


可能导致linux尝试在原始位置而不是相对其他位置的相对位置上查找该库

链接时,可以将库指定为-lmylib-l:libmylib.so-l<path>/libmylib.so在后一种情况下,运行时链接程序<path>/libmylib.so在该特定路径中查找库有关详细信息man ld请参见,选项-l您可能想查看您的构建系统链接器命令。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

CMake:从ExternalProject链接共享的C ++对象会生成具有相对路径的二进制文件,而不是绝对路径

如果具有绝对路径,C ++中的“ #include”是否仍可以在其他PC上使用?

如何在Linux中以编程方式获取给定相对路径的绝对路径?

使用strchr在linux中查找绝对路径

如何使用LINUX命令行列出具有绝对和相对路径的类列表文件?

IOError:[Errno 2]没有这样的文件或目录-在Linux上,使用绝对路径

在 C# 中使用相对路径

C ++从相对获得模型/资源的绝对路径

Linux上dlopen()的有效相对路径?

从另一个位置运行时如何在Linux上获取绝对路径

从相对路径在C#中加载dll

从相对路径在C ++中加载Python模块

如何在Linux中使用'find'命令获取找到的文件的绝对路径?

C ++ fopen相对路径

fstream C ++的相对路径

Visual Studio C ++相对路径

如何使用Java从linux环境中获取tomcat中当前目录的相对路径

即使我通过-C更改为dir,为什么tar也使用绝对路径?

我的C#类中的相对路径如何与NUnit 3.x一起使用?

使用工作目录的相对路径并在C#项目中启动

在C#WebApi项目中使用相对路径中的文件-调试和发布

使用 C 在 Windows 上按相对路径打开文件

如何使用相对路径在C ++文件中向上导航

如何从相对路径使用动态链接库

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

如何在Linux中生成带有绝对路径的文件列表?

在Linux中递归列出具有权限的文件的完整绝对路径

需要一个用于Linux的播放列表创建者,该创建者会执行相对路径

如何用两个绝对路径(或URL)在Java中构造一个相对路径?