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

本文主要是介绍在加载第三方库过程中,无法加载到库的问题(使用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


这篇关于在加载第三方库过程中,无法加载到库的问题(使用readelf, patchelf命令)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/595155

相关文章

SQL Server配置管理器无法打开的四种解决方法

《SQLServer配置管理器无法打开的四种解决方法》本文总结了SQLServer配置管理器无法打开的四种解决方法,文中通过图文示例介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录方法一:桌面图标进入方法二:运行窗口进入检查版本号对照表php方法三:查找文件路径方法四:检查 S

Spring IoC 容器的使用详解(最新整理)

《SpringIoC容器的使用详解(最新整理)》文章介绍了Spring框架中的应用分层思想与IoC容器原理,通过分层解耦业务逻辑、数据访问等模块,IoC容器利用@Component注解管理Bean... 目录1. 应用分层2. IoC 的介绍3. IoC 容器的使用3.1. bean 的存储3.2. 方法注

Python内置函数之classmethod函数使用详解

《Python内置函数之classmethod函数使用详解》:本文主要介绍Python内置函数之classmethod函数使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录1. 类方法定义与基本语法2. 类方法 vs 实例方法 vs 静态方法3. 核心特性与用法(1编程客

怎样通过分析GC日志来定位Java进程的内存问题

《怎样通过分析GC日志来定位Java进程的内存问题》:本文主要介绍怎样通过分析GC日志来定位Java进程的内存问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、GC 日志基础配置1. 启用详细 GC 日志2. 不同收集器的日志格式二、关键指标与分析维度1.

Java进程异常故障定位及排查过程

《Java进程异常故障定位及排查过程》:本文主要介绍Java进程异常故障定位及排查过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、故障发现与初步判断1. 监控系统告警2. 日志初步分析二、核心排查工具与步骤1. 进程状态检查2. CPU 飙升问题3. 内存

Linux中压缩、网络传输与系统监控工具的使用完整指南

《Linux中压缩、网络传输与系统监控工具的使用完整指南》在Linux系统管理中,压缩与传输工具是数据备份和远程协作的桥梁,而系统监控工具则是保障服务器稳定运行的眼睛,下面小编就来和大家详细介绍一下它... 目录引言一、压缩与解压:数据存储与传输的优化核心1. zip/unzip:通用压缩格式的便捷操作2.

Java 线程安全与 volatile与单例模式问题及解决方案

《Java线程安全与volatile与单例模式问题及解决方案》文章主要讲解线程安全问题的五个成因(调度随机、变量修改、非原子操作、内存可见性、指令重排序)及解决方案,强调使用volatile关键字... 目录什么是线程安全线程安全问题的产生与解决方案线程的调度是随机的多个线程对同一个变量进行修改线程的修改操

使用Python实现可恢复式多线程下载器

《使用Python实现可恢复式多线程下载器》在数字时代,大文件下载已成为日常操作,本文将手把手教你用Python打造专业级下载器,实现断点续传,多线程加速,速度限制等功能,感兴趣的小伙伴可以了解下... 目录一、智能续传:从崩溃边缘抢救进度二、多线程加速:榨干网络带宽三、速度控制:做网络的好邻居四、终端交互

Python中注释使用方法举例详解

《Python中注释使用方法举例详解》在Python编程语言中注释是必不可少的一部分,它有助于提高代码的可读性和维护性,:本文主要介绍Python中注释使用方法的相关资料,需要的朋友可以参考下... 目录一、前言二、什么是注释?示例:三、单行注释语法:以 China编程# 开头,后面的内容为注释内容示例:示例:四

SpringBoot整合liteflow的详细过程

《SpringBoot整合liteflow的详细过程》:本文主要介绍SpringBoot整合liteflow的详细过程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋...  liteflow 是什么? 能做什么?总之一句话:能帮你规范写代码逻辑 ,编排并解耦业务逻辑,代码