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

2023-12-11

我有以下问题:我正在尝试创建程序的可移植版本,因此我将 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 设置为.因此所有库都使用相对文件路径链接

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

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

正确的方法是使用-rpath=$ORIGIN特征。看man ld.so:

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

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

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

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


什么可能导致 linux 尝试在原始位置而不是像所有其他位置一样在相关位置查找该库

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • Javascript/Typescript 将默认常量导出为异步函数调用的值

    我读了很多书 但还没有找到有效的解决方案 我见过的最接近的是这里 导出React中async函数的结果 请记住 我想导出一个对象 并且该对象是异步函数的结果 而不是导出异步函数定义本身 这是到目前为止我的用例和实现 我们有一个名为 conf
  • 有没有更简洁的正则表达式来完成这个任务?

    首先 对这个蹩脚的标题感到抱歉 但我想不出更好的标题 我需要测试密码以确保以下内容 密码必须至少包含以下 3 项 大写字母 小写字母 numbers 特殊字符 这是我想到的 它有效 但我想知道是否有更好的方法来做到这一点 Dim lower
  • 从 3D Rcpp NumericVector 索引切片

    您好 我有一个关于将 NumericVector 对象视为多维数组的非常简单的 Rcpp 问题 我找不到可能显而易见的答案 如果是这种情况 请先道歉 我对 C 的经验不足是罪魁祸首 如果我使用此处发布的答案 在 Rcpp 中构造 3D 数组
  • Android 支持 JDK 6 或 7 [重复]

    这个问题在这里已经有答案了 我是 Android 开发新手 我可以在 Android 中使用使用 JDK 7 开发的现有 Java 代码吗 这些函数使用 xerces dom xslt 和 xpathapi 目前 当我安装Android E
  • 错误:控制到达非 void 函数的末尾 [-Werror=return-type] } ^

    问题基本上是从给定的 n 个数字生成一个算术表达式 并且该表达式应该能被 101 整除 我们只能有 运算符 并且表达式是左关联的 我已经尝试了所有可用的解决方案 这些解决方案已经在堆栈溢出中提到过 例如用 else 关闭表达式等等 bool
  • Vbscript msxml12.XMLHTTP错误处理

    我使用这个 vbscript 代码来下载网页 Dim oXML Set oXML CreateObject msxm12 XMLHTTP oXML Open GET mysite com False oXML Send 如果没有这样的网站
  • PHP REGEX - 通过 preg_split 在换行符处将文本转换为数组

    EDITED 需要有关拆分数组的帮助 数组示例 array 0 gt some normal text some long text here and so on sometimes i m breaking down and some n
  • TFSPreview.com 和 Azure 持续部署 TFS 中的多个解决方案

    我最近尝试了 Microsoft 的 TFS in the cloud 服务 TFSPreview com 感觉 TFS 团队终于 明白了 TFSPreview com 可能会让我们从 GIT bug 跟踪器 powershell 切换过来
  • 如何在多列上创建索引

    我们有以下实体关系 其中用户属于特定组织 我的查询看起来像 select from User where org org 或 select from User where org org and type type 我在 User 类上有单
  • 是否可以将 Nesta CMS 包含到 Rails3 应用程序中?

    我想将 Nesta CMS 应用程序 安装 到 Rails3 应用程序上 这可能是 Nesta Sinatra 应用程序的原因 它应该是机架可安装层 但是您会怎么做 你将从哪里开始 有人有关于这个话题的经验吗 建议的文档 嘿卢卡 我一两个月
  • R中如何使用函数名的字符串来调用函数?

    我正在尝试使用给定的函数名称字符串来调用函数 E g print funcList 1 2 sin works mult lt mult 5 6 1 30 不起作用 func1 lt funcList 1 func1 5 6 func2 l
  • 从 URL 获取 HTTP 响应代码的最佳方法是什么?

    我正在寻找一种从 URL 获取 HTTP 响应代码 即 200 404 等 的快速方法 我不确定要使用哪个库 更新使用精彩请求库 请注意 我们使用的是 HEAD 请求 它应该比完整的 GET 或 POST 请求发生得更快 import re
  • 将片段实例保留在 FragmentPagerAdapter 中

    是否可以保留为某个片段创建的每个片段的实例 FragmentPagerAdapter在 的里面FragmentPagerAdapter 像这样的东西 Override public Object instantiateItem ViewGr
  • 同时下载多个页面?

    我想用Python编写一个脚本 它可以从数据库中获取url 并同时下载网页以加快速度 而不是等待每个页面一个接一个地下载 根据这个线程 Python 不允许这样做 因为称为全局解释器锁这可以防止多次启动相同的脚本 在投入时间学习 Twist
  • 无法从jupyterhub/jupyter笔记本调用tensorflow gpu,为什么?

    好吧 我认为八个小时足够我自己解决这个问题 所以我只想问大家 我在 jupyterhub 和 Jupyter Notebook 之外的名为 tensorflow 的虚拟环境中运行 tensorflow gpu 1 1 0 运行得很好 也就是
  • Scrapy CrawlSpider 基于 start_urls 的动态规则?

    我正在编写一个 Scrapy 抓取工具 它使用 CrawlSpider 来抓取网站 检查其内部链接 并抓取任何外部链接 域与原始域不同的链接 的内容 我设法用两条规则来做到这一点 但它们是基于正在爬网的网站的域 如果我想在多个网站上运行它
  • 当每一侧有不同数量的项目时,将弹性项目置于一行中居中

    如何实现图片上绘制的布局 例如 左侧 3 项 一项居中 两项在右侧 ul 是橙色 黑框是项目 ul display flex width 100 ul li Item 1 li li Item 2 li li Item 3 li li It
  • scala 集合:映射列表并携带一些状态?

    我似乎一直遇到这个问题 我想修改列表中的一些元素 但我需要在这样做时保留一些状态 因此地图不起作用 这是一个例子 scala gt val l1 List a b c d e f b c e b a l1 List String List
  • Arm 板上有两个以上的 SPI 设备,但只支持两个?

    我们其中一块板上的 Arm 处理器有一个 spi 端口 带有两条片选线 该处理器的数据表中提到它最多可以控制两个 spi 设备 是否可以使用 GPIO 作为附加 spi 设备的从选择 如何修改现有的库 设备驱动程序以支持此更改 到目前为止
  • Linux C++ 尝试使用绝对路径加载一个特定库,而所有其他库则使用相对路径链接

    我有以下问题 我正在尝试创建程序的可移植版本 因此我将 rpath 设置为 因此所有库都使用相对文件路径链接 这确实适用于除一个库之外的所有库 由于某种原因 只有当一个特定库存在于编译时链接的同一位置时 该程序才能工作 这是我自己写的 它的