【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

相关文章

通过Docker容器部署Python环境的全流程

《通过Docker容器部署Python环境的全流程》在现代化开发流程中,Docker因其轻量化、环境隔离和跨平台一致性的特性,已成为部署Python应用的标准工具,本文将详细演示如何通过Docker容... 目录引言一、docker与python的协同优势二、核心步骤详解三、进阶配置技巧四、生产环境最佳实践

Python一次性将指定版本所有包上传PyPI镜像解决方案

《Python一次性将指定版本所有包上传PyPI镜像解决方案》本文主要介绍了一个安全、完整、可离线部署的解决方案,用于一次性准备指定Python版本的所有包,然后导出到内网环境,感兴趣的小伙伴可以跟随... 目录为什么需要这个方案完整解决方案1. 项目目录结构2. 创建智能下载脚本3. 创建包清单生成脚本4

SpringBoot 多环境开发实战(从配置、管理与控制)

《SpringBoot多环境开发实战(从配置、管理与控制)》本文详解SpringBoot多环境配置,涵盖单文件YAML、多文件模式、MavenProfile分组及激活策略,通过优先级控制灵活切换环境... 目录一、多环境开发基础(单文件 YAML 版)(一)配置原理与优势(二)实操示例二、多环境开发多文件版

使用docker搭建嵌入式Linux开发环境

《使用docker搭建嵌入式Linux开发环境》本文主要介绍了使用docker搭建嵌入式Linux开发环境,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录1、前言2、安装docker3、编写容器管理脚本4、创建容器1、前言在日常开发全志、rk等不同

Ubuntu如何升级Python版本

《Ubuntu如何升级Python版本》Ubuntu22.04Docker中,安装Python3.11后,使用update-alternatives设置为默认版本,最后用python3-V验证... 目China编程录问题描述前提环境解决方法总结问题描述Ubuntu22.04系统自带python3.10,想升级

更改linux系统的默认Python版本方式

《更改linux系统的默认Python版本方式》通过删除原Python软链接并创建指向python3.6的新链接,可切换系统默认Python版本,需注意版本冲突、环境混乱及维护问题,建议使用pyenv... 目录更改系统的默认python版本软链接软链接的特点创建软链接的命令使用场景注意事项总结更改系统的默

Linux升级或者切换python版本实现方式

《Linux升级或者切换python版本实现方式》本文介绍在Ubuntu/Debian系统升级Python至3.11或更高版本的方法,通过查看版本列表并选择新版本进行全局修改,需注意自动与手动模式的选... 目录升级系统python版本 (适用于全局修改)对于Ubuntu/Debian系统安装后,验证Pyt

Java 与 LibreOffice 集成开发指南(环境搭建及代码示例)

《Java与LibreOffice集成开发指南(环境搭建及代码示例)》本文介绍Java与LibreOffice的集成方法,涵盖环境配置、API调用、文档转换、UNO桥接及REST接口等技术,提供... 目录1. 引言2. 环境搭建2.1 安装 LibreOffice2.2 配置 Java 开发环境2.3 配

MySQL 升级到8.4版本的完整流程及操作方法

《MySQL升级到8.4版本的完整流程及操作方法》本文详细说明了MySQL升级至8.4的完整流程,涵盖升级前准备(备份、兼容性检查)、支持路径(原地、逻辑导出、复制)、关键变更(空间索引、保留关键字... 目录一、升级前准备 (3.1 Before You Begin)二、升级路径 (3.2 Upgrade

Nginx进行平滑升级的实战指南(不中断服务版本更新)

《Nginx进行平滑升级的实战指南(不中断服务版本更新)》Nginx的平滑升级(也称为热升级)是一种在不停止服务的情况下更新Nginx版本或添加模块的方法,这种升级方式确保了服务的高可用性,避免了因升... 目录一.下载并编译新版Nginx1.下载解压2.编译二.替换可执行文件,并平滑升级1.替换可执行文件