在加载第三方库过程中,无法加载到库的问题(使用readelf, patchelf命令)

无法加载到库问题

  • 问题及分析过程
  • readelf 命令
  • patchelf命令

问题及分析过程

在开发一个程序过程中,需要加载第三方库iTapTradeAPI, 在CMakeList.txt中已经设置了CMAKE_INSTALL_RPATH,但是发布到生产之后由于目录问题无法加载到libiTapTradeAPI库了

下面时分析的过程图
在这里插入图片描述
从图中可以看出iTapTradeAPI使用的相对路径,与其他依赖库不同, 然后查看依赖库iTapTradeAPI的信息
在这里插入图片描述
可以看到使用的RPATH时 .:/RIGIN路径
刚开始想到的时是否把相对路径去掉, 使用如下命令:

patchelf --remove-rpath <path-to-elf>
eg: patchelf --remove-rpath libiTapTradeAPI.so

去掉之后还是不行,对比项目中的其他动态库,发现这个动态库少了一个选项SONAME, 然后使用命令

patchelf --set-soname libiTapTradeAPI.so ./libiTapTradeAPI.so

进行设置,这样之后就可以了

另外假如在生产上想先快速修复:还可以使用

patchelf --replace-needed LIBRARY NEW_LIBRARY

来做应急修复,替换依赖库的路径

readelf 命令

readelf是一个用于查看可执行文件和共享库的信息的命令行工具。它可以显示二进制文件的各种部分,包括头部信息、节(section)信息、符号表、动态链接信息等

readelf -h
readelf: Warning: Nothing to do.
Usage: readelf <option(s)> elf-file(s)Display information about the contents of ELF format filesOptions are:-a --all               Equivalent to: -h -l -S -s -r -d -V -A -I	//  显示所有信息,相当于 -h -l -S -s -r -d -V -A -I-h --file-header       Display the ELF file header			//  显示ELF文件头信息-l --program-headers   Display the program headers	// 显示程序头信息--segments          An alias for --program-headers	// --program-headers的别名-S --section-headers   Display the sections' header	// 显示节头信息--sections          An alias for --section-headers	// --section-headers的别名-g --section-groups    Display the section groups	// 显示节组信息-t --section-details   Display the section details	// 显示节的详细信息-e --headers           Equivalent to: -h -l -S	// 相当于 -h -l -S-s --syms              Display the symbol table	//  显示符号表--symbols           An alias for --syms	// --syms的别名--dyn-syms             Display the dynamic symbol table	// 显示动态符号表-n --notes             Display the core notes (if present)	// 显示核心注释(如果存在)-r --relocs            Display the relocations (if present)	// 显示重定位信息(如果存在)-u --unwind            Display the unwind info (if present)	// 显示展开信息(如果存在)-d --dynamic           Display the dynamic section (if present)	//  显示动态节信息(如果存在)-V --version-info      Display the version sections (if present)	// 显示版本节信息(如果存在)-A --arch-specific     Display architecture specific information (if any)	// 显示特定于体系结构的信息(如果有)-c --archive-index     Display the symbol/file index in an archive	// 在存档中显示符号/文件索引-D --use-dynamic       Use the dynamic section info when displaying symbols	// 显示符号时使用动态节信息-x --hex-dump=<number|name>Dump the contents of section <number|name> as bytes // 以字节形式显示节的内容-p --string-dump=<number|name>Dump the contents of section <number|name> as strings //  以字符串形式显示节的内容-R --relocated-dump=<number|name>Dump the contents of section <number|name> as relocated bytes // 以重定位后的字节形式显示节的内容-z --decompress        Decompress section before dumping it	// 在显示节内容之前解压缩节-w[lLiaprmfFsoRt] or--debug-dump[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,=frames-interp,=str,=loc,=Ranges,=pubtypes,=gdb_index,=trace_info,=trace_abbrev,=trace_aranges,=addr,=cu_index]Display the contents of DWARF2 debug sections	// 显示DWARF2调试节的内容--dwarf-depth=N        Do not display DIEs at depth N or greater	// 不显示深度大于或等于N的DIEs--dwarf-start=N        Display DIEs starting with N, at the same depthor deeper	// 从深度为N的DIE开始显示-I --histogram         Display histogram of bucket list lengths	// 显示桶列表长度的直方图-W --wide              Allow output width to exceed 80 characters	// 允许输出宽度超过80个字符@<file>                Read options from <file>		// 从文件中读取选项-H --help              Display this information-v --version           Display the version number of readelf
  1. 查看文件头部信息:
readelf -h executable
  1. 查看节(section)信息:
readelf -S executable
  1. 查看符号表:
readelf -s executable
  1. 查看动态链接信息:
readelf -d executable
  1. 查看库依赖:
readelf -d executable | grep NEEDED

patchelf命令

patchelf是一个用于修改可执行文件和共享库属性的工具。它可以用来修改运行时搜索路径(rpath)、修改依赖库路径、修改库版本等。

1. 查看文件属性:

patchelf --print-interpreter executable
patchelf --print-rpath executable
patchelf --print-needed executable

2.  将可执行文件的运行时搜索路径(rpath)修改为 "path/to/library-dir"。运行时搜索路径用于指定程序在运行时查找共享库的路径。通过修改运行时搜索路径,您可以控制程序在运行时加载特定的共享库。

patchelf --set-rpath path/to/library-dir executable

3. 将可执行文件的动态链接器(interpreter)路径修改为 "path/to/ld-linux.so.2"。动态链接器负责在程序启动时加载共享库并解析符号。通过修改动态链接器路径,您可以指定程序在运行时使用特定的动态链接器。

patchelf --set-interpreter path/to/ld-linux.so.2 executable

4. 将共享库的 soname 修改为 "new-soname.so.1"。Soname 是共享库的标识符,用于在运行时确定库的版本。通过修改 soname,您可以控制共享库的版本和依赖关系。

patchelf --set-soname new-soname.so.1 library.so

patchelf -h
syntax: patchelf
[–set-interpreter FILENAME] // 设置动态库解析器
[–page-size SIZE] // 设置页大小
[–print-interpreter]
[–print-soname] Prints ‘DT_SONAME’ entry of .dynamic section. Raises an error if DT_SONAME doesn’t exist
[–set-soname SONAME] Sets ‘DT_SONAME’ entry to SONAME. // 设置名字
[–set-rpath RPATH] // 设置 rpath
[–remove-rpath] // 删除 rpath
[–shrink-rpath] // 收缩rpath
[–print-rpath] // 打印 rpath
[–force-rpath] // 强制使用 rpath
[–add-needed LIBRARY] // 添加需要的动态库
[–remove-needed LIBRARY] // 删除需要的动态库
[–replace-needed LIBRARY NEW_LIBRARY] // 替换需要的动态库
[–print-needed] // 打印帮助信息
[–no-default-lib] // 不链接默认的动态库
[–debug]
[–version]
FILENAME


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/340783.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

统计学-R语言-2.2

文章目录 前言导入.RData文件方式1方式2方式3 导入程序包总结 前言 本篇文章是将上篇得软件安装完&#xff0c;对其部分功能进行介绍。 导入.RData文件 在我们日常练习时会有.RData文件导入&#xff0c;并对其进行分析&#xff0c;下面是两种方导入.RData文件。 方式1 直接…

iOS rootless无根越狱解决方案

据游戏工委数据统计&#xff0c;2023年国内游戏市场实际销售收入与用户规模双双创下新高&#xff0c;游戏普遍采用多端并发方式&#xff0c;成为收入增长的主因之一。 中国市场实际销售收入及增长率丨数据来源&#xff1a;游戏工委 多端互通既是机遇&#xff0c;也是挑战。从游…

跟着仙凡兄学习编译Telegram vs2022 2024.1.11编译成功

编译Telegram 本人花了两天&#xff0c;问官方作者终于编译成功Telegram 运行环境&#xff1a;win11 vs2022 参见学习视频&#xff1a;【telegram编译成功&#xff0c;编译遇到的各种问题】https://www.bilibili.com/video/BV11c411x7jm?vd_sourcedf2e51268cc7412cc3937cf3df2…

2 快速前端开发

CSS快速入门 1.CSS案例1.1 内容回顾1.2 案例&#xff1a;二级菜单1.2.1 划分区域1.2.2 搭建骨架1.2.3 Logo区域1.2.4 菜单部分 1.3 案例&#xff1a;顶部菜单 二级菜单小结 1.4 案例&#xff1a;推荐区域1.4.1 划分区域1.4.2 搭建骨架1.4.3 案例的实现小结 2. CSS知识点2.1 ho…

SAP PP配置学习(五)

查找 四、 其它 设置 MM 过帐号码范围 定义凭证号码范围 OB52 打开期间 MMPV 开帐 &#xff08;下篇见&#xff09;

pytorch07:损失函数与优化器

目录 一、损失函数是什么二、常见的损失函数2.1 nn.CrossEntropyLoss交叉熵损失函数2.1.1 交叉熵的概念2.2.2 交叉熵代码实现2.2.3 加权重损失 2.2 nn.NLLLoss2.2.1 代码实现 2.3 nn.BCELoss2.3.1 代码实现 2.4 nn.BCEWithLogitsLoss2.4.1 代码实现 三、优化器Optimizer3.1 什么…

激活/注册navicat15

一、获取软件 链接&#xff1a;https://pan.baidu.com/s/1F_tiLuLvVFMEz8pDfIvDjw?pwdjjfj 提取码&#xff1a;jjfj 二、安装 安装的过程我就不放了&#xff0c;重点如下 安装完不要打开软件&#xff01; 安装完不要打开软件&#xff01; 安装完不要打开软件&#xff01;…

谁说贵的就好?揭秘性价比最高的指纹识别模块!

消费者在购买产品时的一种常见误区&#xff0c;即认为价格高就一定意味着品质好。在指纹识别模块的市场上&#xff0c;这种观念同样存在。但实际上&#xff0c;性价比高并不代表产品价格低&#xff0c;而是指产品在性能、质量、服务等多方面都达到较高标准&#xff0c;且价格合…

微软Office 2019 批量授权版

软件介绍 微软办公软件套件Microsoft Office 2019 专业增强版2024年1月批量许可版更新推送&#xff01;Office2019正式版2018年10月份推出&#xff0c;主要为多人跨平台办公与团队协作打造。Office2019整合对过去三年在Office365里所有功能&#xff0c;包括对Word、Excel、Pow…

【计算机网络】TCP原理 | 可靠性机制分析(三)

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【网络编程】【Java系列】 本专栏旨在分享学习网络编程、计算机网络的一点学习心得&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目…

【.NET Core】可为null类型详解

【.NET Core】可为null类型详解 文章目录 【.NET Core】可为null类型详解一、概述二、可为空的值类型2.1 声明和赋值2.2 检查可为空值类型2.3 基础类型与可为空的值类型互换2.4 可为空的值类型装箱和取消装箱2.5 如何确定可为空的值类型 三、可为 null 的引用类型 一、概述 nu…

低压系统母线为什么必须装设弧光保护

安科瑞武陈燕acrelcy 1 重视中低压母线故障的原因 我国电力发展建设的速度超前&#xff0c;它已经进入人电网、大机组、压输电阶段&#xff0c;并且对发电机组的容量要求越来越高&#xff0c;这时就需要在安全运行方面要跟上要求&#xff0c;因为单台大机组的运行情况&#x…