【workaround】可执行文件(编译时)glibc版本小于运行环境(运行时)glibc版本

本文主要是介绍【workaround】可执行文件(编译时)glibc版本小于运行环境(运行时)glibc版本,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

content

  • Q1. /lib64/libm.so.6: version `GLIBC_2.29' not found
    • Q1b. *** These critical programs are missing or too old: make
  • Q2. Segmentation fault (core dumped)

Q1. /lib64/libm.so.6: version `GLIBC_2.29’ not found

Q1. 网上下载了一个软件压缩包,解压后只有可执行文件。运行可执行文件时报错如下。

...: /lib64/libm.so.6: version `GLIBC_2.29' not found (required by ...)

A1. 通过ldd --versionstrings /lib64/libm.so.6 |grep ^GLIBC_等命令,确认机器上没有2.29版本。因此下载安装新版本。

wget -c https://ftp.gnu.org/gnu/glibc/glibc-2.29.tar.gz
tar -zxvf glibc-2.29.tar.gz
cd glibc-2.29
mkdir build
cd build
sudo ../configure --prefix=/new/path/glibc#该步骤可能出现missing or too old错误,详见Q1b;
sudo make
sudo make install

参考:https://stackoverflow.com/questions/74740941/how-can-i-resolve-this-issue-libm-so-6-version-glibc-2-29-not-found-c-c

Q1b. *** These critical programs are missing or too old: make

Q1b. 执行上述A1中的configure时,可能出现以下错误。

*** These critical programs are missing or too old: make
*** Check the INSTALL file for required versions.

该错误的出现可能是make版本过老,或configure文件关于make版本正则不匹配造成的。
前者需要安装符合版本要求的make。后者需要修改configure文件中make版本正则匹配规则。

Q2. Segmentation fault (core dumped)

安装完新版本的GLIBC后,本来打算将路径导入LD_LIBRARY_PATH,然后执行命令,但出现新的报错。

export LD_LIBRARY_PATH=/new/path/glibc/2.29 && ./your_app
Segmentation fault (core dumped)

综合网上查阅资料,应该是编译时的glibc库和运行时的glibc库版本不一致造成的。由于没有源码,无法重新编译,只能在运行时想办法,目前有两种方案可以解决该问题。

A2-方案1:ld-linux-x86-64.so.2方法

# 方案1. 匹配版本
/new/path/glibc/2.29/lib/ld-linux-x86-64.so.2 --library-path . ./your_app

方案1无需修改可执行文件,结合脚本封装快速方便。缺点是一旦可执行文件中嵌套了其它可执行文件,该方法就无能无力了。

A2-方案2:patchelf方法

# 安装
git clone https://github.com/NixOS/patchelf.git
cd patchelf
./bootstrap.sh
./configure# *** A compiler with support for C++17 language features is required.# 总出这种报错很烦,笔者后面直接开了台云机器安装patchelf,然后将可执行文件上传、修改、然后传回。各位老铁也可以安装C++试试看。
make
make check
sudo make install# 修改
/patchelf --set-interpreter /new/path/glibc/2.29/lib/ld-linux-x86-64.so.2 --set-rpath /new/path/glibc/2.29/lib/  your_app1
/patchelf --set-interpreter /new/path/glibc/2.29/lib/ld-linux-x86-64.so.2 --set-rpath /new/path/glibc/2.29/lib/  your_app2
...

方案2使用patchelf可以修改相关ELF/可执行文件中的动态加载器和运行时搜索路径。

参考
https://stackoverflow.com/questions/19709932/segfault-from-ld-linux-in-my-build-of-glibc
https://stackoverflow.com/questions/847179/multiple-glibc-libraries-on-a-single-host/44710599#44710599
https://github.com/NixOS/patchelf

这篇关于【workaround】可执行文件(编译时)glibc版本小于运行环境(运行时)glibc版本的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Pytest多环境切换的常见方法介绍

《Pytest多环境切换的常见方法介绍》Pytest作为自动化测试的主力框架,如何实现本地、测试、预发、生产环境的灵活切换,本文总结了通过pytest框架实现自由环境切换的几种方法,大家可以根据需要进... 目录1.pytest-base-url2.hooks函数3.yml和fixture结论你是否也遇到过

idea maven编译报错Java heap space的解决方法

《ideamaven编译报错Javaheapspace的解决方法》这篇文章主要为大家详细介绍了ideamaven编译报错Javaheapspace的相关解决方法,文中的示例代码讲解详细,感兴趣的... 目录1.增加 Maven 编译的堆内存2. 增加 IntelliJ IDEA 的堆内存3. 优化 Mave

浅谈配置MMCV环境,解决报错,版本不匹配问题

《浅谈配置MMCV环境,解决报错,版本不匹配问题》:本文主要介绍浅谈配置MMCV环境,解决报错,版本不匹配问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录配置MMCV环境,解决报错,版本不匹配错误示例正确示例总结配置MMCV环境,解决报错,版本不匹配在col

Java编译生成多个.class文件的原理和作用

《Java编译生成多个.class文件的原理和作用》作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象... 目录一、内部类机制与.class文件生成成员内部类(常规内部类)局部内部类(方法内部类)匿名内部类二、

Linux卸载自带jdk并安装新jdk版本的图文教程

《Linux卸载自带jdk并安装新jdk版本的图文教程》在Linux系统中,有时需要卸载预装的OpenJDK并安装特定版本的JDK,例如JDK1.8,所以本文给大家详细介绍了Linux卸载自带jdk并... 目录Ⅰ、卸载自带jdkⅡ、安装新版jdkⅠ、卸载自带jdk1、输入命令查看旧jdkrpm -qa

Tomcat版本与Java版本的关系及说明

《Tomcat版本与Java版本的关系及说明》:本文主要介绍Tomcat版本与Java版本的关系及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Tomcat版本与Java版本的关系Tomcat历史版本对应的Java版本Tomcat支持哪些版本的pythonJ

IDEA中Git版本回退的两种实现方案

《IDEA中Git版本回退的两种实现方案》作为开发者,代码版本回退是日常高频操作,IntelliJIDEA集成了强大的Git工具链,但面对reset和revert两种核心回退方案,许多开发者仍存在选择... 目录一、版本回退前置知识二、Reset方案:整体改写历史1、IDEA图形化操作(推荐)1.1、查看提

Java终止正在运行的线程的三种方法

《Java终止正在运行的线程的三种方法》停止一个线程意味着在任务处理完任务之前停掉正在做的操作,也就是放弃当前的操作,停止一个线程可以用Thread.stop()方法,但最好不要用它,本文给大家介绍了... 目录前言1. 停止不了的线程2. 判断线程是否停止状态3. 能停止的线程–异常法4. 在沉睡中停止5

JDK多版本共存并自由切换的操作指南(本文为JDK8和JDK17)

《JDK多版本共存并自由切换的操作指南(本文为JDK8和JDK17)》本文介绍了如何在Windows系统上配置多版本JDK(以JDK8和JDK17为例),并通过图文结合的方式给大家讲解了详细步骤,具有... 目录第一步 下载安装JDK第二步 配置环境变量第三步 切换JDK版本并验证可能遇到的问题前提:公司常

nvm如何切换与管理node版本

《nvm如何切换与管理node版本》:本文主要介绍nvm如何切换与管理node版本问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录nvm切换与管理node版本nvm安装nvm常用命令总结nvm切换与管理node版本nvm适用于多项目同时开发,然后项目适配no