【问题标题】:Linux C++ trys to load one specific library using an absolute path, while all otheres are linked using a relative oneLinux C++ 尝试使用绝对路径加载一个特定库,而所有其他库都使用相对路径链接
【发布时间】:2017-02-10 11:41:52
【问题描述】:

我有以下问题:我正在尝试创建程序的可移植版本,因此我将 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相对于当前目录($PWD)还是相对可执行位置?
  • 为什么不遵循 -I 规则? GCC Directory Options
  • 最佳相对可执行位置
  • 发布构建应用程序的完整命令行。从 Eclipse 输出中复制粘贴。
  • 已经解决了,感谢帮助

标签: c++ linux gcc dynamic-linking


【解决方案1】:

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

在 rpath 中使用 . 是个坏主意:

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

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

$ORIGIN(或等效的 ${ORIGIN}) 这将扩展到包含程序或共享对象的目录。因此,位于 somedir/app 中的应用程序可以用

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

以便它在 somedir/lib 中找到关联的共享对象,无论 somedir 位于目录层次结构中的哪个位置。这有助于创建不需要安装到特殊目录中的“统包”应用程序,而是可以将其解压缩到任何目录中,并且仍然可以找到它们自己的共享对象。

$ORIGIN 语法有点不幸,因为它被makebash 扩展为变量,因此您可能需要适当地引用它。


什么可能导致 linux 试图在原始位置而不是像所有其他位置一样在相对位置找到库

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

【讨论】:

  • 我正在使用 eclipse cdt,所以我会查看输出。感谢您的帮助
  • 这无济于事,我想要一个可移植的应用程序,这意味着用户需要能够将文件夹放在他想要的任何位置并执行程序。它在内部使用,所以别担心,我会看看你的其余答案,看看是否有帮助
  • 我刚试过 Ldd,但奇怪的是,每个其他库都是动态加载的,而我的是用绝对路径加载的,我发布了输出...
  • @user2741831 -rpath=$ORIGIN 是你需要的伙伴,这就是所有商业 Linux 应用程序的链接方式。不过,您需要能够理解文档。
  • 那我一定做错了,因为我确实使用 rPath="$Origin" 构建了应用程序,但是当我检查时它仍然将库链接到应用程序编译时的路径ldd。还是我还需要使用 rpath Origin 构建库?
猜你喜欢
  • 2018-11-06
  • 2021-12-14
  • 2021-10-03
  • 2016-11-14
  • 1970-01-01
  • 2018-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多