修改二进制程序的rpath和interpreter, 实现“高版本gcc编译出的程序在低版本glibc机器上运行“实验记录

编译环境:

ubuntu20.04
gcc (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0
g++ (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0

运行环境:

centos7.9
gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-44)
g++ (GCC) 4.8.5 20150623 (Red Hat 4.8.5-44)

验证源文件 main.cpp:

#include <iostream>
#include <string>int main(int argc, char *argv[])
{std::string tmp("hello world test link libstdc++.so");printf("hello world link libc.so\n");std::cout << tmp << std::endl;return 0;
}

编译为可执行文件:

g++ -o main main.cpp


编译环境下, 运行输出: ./main

hello world link libc.so
hello world test link libstdc++.so

把main直接拷贝到运行环境,并运行: ./main

./main: /lib64/libstdc++.so.6: version `GLIBCXX_3.4.21' not found (required by ./main)


我们分析main在编译环境下,到底依赖高版本中的哪些文件:

编译环境下,查看可执行文件的依赖:ldd main
 

linux-vdso.so.1 (0x00007ffecf5af000)
libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fbae4d72000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fbae4b80000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fbae4a31000)
/lib64/ld-linux-x86-64.so.2 (0x00007fbae4f72000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fbae4a16000)

可以看出,main依赖编译环境下的这几个文件:
 

/lib/x86_64-linux-gnu/libstdc++.so.6
/lib/x86_64-linux-gnu/libc.so.6
/lib/x86_64-linux-gnu/libm.so.6
/lib64/ld-linux-x86-64.so.2
/lib/x86_64-linux-gnu/libgcc_s.so.1

把编译环境下的这5个文件,拷贝到运行环境下,可执行文件main同目录中的lib文件夹中,相对位置如下:

运行环境下,修改rpath:
 

yum install patchelf -y 
patchelf --set-rpath `pwd`/lib main 


运行环境下,运行:./main

./main: relocation error: /data/gopath/src/helloworld_dll/src/main/tmp/lib/libc.so.6: symbol _dl_find_dso_for_object, version GLIBC_PRIVATE not defined in file ld-linux-x86-64.so.2 with link time reference

运行环境下,修改interpreter,这一步是关键,即在运行环境下也一定要使用编译环境下的ld-linux-x86-64.so.2来引导编译环境下编译的可执行文件main
 

patchelf --set-interpreter `pwd`/lib/ld-linux-x86-64.so.2 ./main

运行环境下,再次运行,终于不报错了:./main
 

hello world link libc.so
hello world test link libstdc++.so

参考:

高版本gcc编译出的程序在低版本glibc机器上运行 - 简书 (jianshu.com)

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

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

相关文章

智慧工地信息化管理系统源码带APP

需求痛点&#xff1a;建筑行业是一个安全事故多发的行业。目前&#xff0c;工程建设规模不断扩大&#xff0c;工艺流程纷繁复杂&#xff0c;如何搞好现场施工现场管理&#xff0c;控制事故发生频率&#xff0c;一直是施工企业、政府管理部门关注的焦点。利用现代科技&#xff0…

仿美团外卖源码/在线外卖平台源码PHP/支持多商户+多样化配送费+本土外卖+支持第三方配送

源码简介&#xff1a; 进云仿美团外卖源码&#xff0c;作为外卖平台源码&#xff0c;它不仅支持多商户、多样化配送费、本土外卖&#xff0c;还支持第三方配送。 进云仿美团外卖源码是一个进云源生插件&#xff0c;支持多商户多样化配送费模式本土外卖平台支持第三方配送&…

python如何抓取携程酒店的价格,让工作更简单点

有时候老板没事安排点事&#xff0c;为了偷懒&#xff0c;只能使出大招&#xff0c;毕竟自己不是那么老老实实干活的人&#xff0c;整理数据这类累和繁琐的活&#xff0c;我怎么能轻易动&#xff0c;好在gpt可以帮我来实现&#xff0c;有人可能会说&#xff0c;这么点内容你还不…

python基于YOLOv6最新0.4.1分支开发构建钢铁产业产品智能自动化检测识别系统

在前文中陆续基于不同类型的目标检测模型开发构建了钢铁产业产品缺陷质检系统&#xff0c;关于yolov6除了刚提出的时候有过使用&#xff0c;后续使用较少了&#xff0c;今天就以yolov6最新0.4.1分支模型为基准来开发实践目标检测项目开发。 首先看下实例效果&#xff1a; 官方…

上市公司-绿色专利申请、授权(2000-2022年)

一、数据介绍 数据名称&#xff1a;上市公司-绿色专利申请、授权 数据范围&#xff1a;A股上市公司 数据年份&#xff1a;2000-2022年 数据样本&#xff1a;56167条 数据来源&#xff1a;国家知识产权局、WIPO绿色专利清单 数据整理&#xff1a;自主整理 二、数据用途 数…

【目标跟踪】光流跟踪(python、c++代码)

文章目录 前言一、代码流程与思路二、python 代码2.1 代码详解2.2 完整代码 三、c 代码四、结果展示 前言 光流利用图像序列中像素在时间域上的变化以及相邻帧之间的相关性来找到上一帧跟当前帧之间存在的对应关系&#xff0c;从而计算出相邻帧之间物体的运动信息的一种方法。…

如何撰写和发表SCI——computer-science

你的论文是&#xff0c;教给过去的“你”成为现在“你”所需的所有知识 一、SCI论文基本要求 1.写作模型 2.写作要点 Material and Method&#xff08;材料和方法&#xff09; 我怎么解决这个问题Result&#xff08;结果&#xff09; 我发现了什么&#xff1f;Discussion 我…

vue3-在自定义hooks使用useRouter 报错问题

文章目录 前言一、报错分析报错的Vue warn截图&#xff1a;查看文档 二、那么在hook要怎么引入路由呢&#xff1f; 前言 记录在vue3项目中&#xff0c;hook使用useRouter 报错问题 一、报错分析 报错的Vue warn截图&#xff1a; 警告 inject() can only be used inside setup…

【蓝桥杯选拔赛真题26】C++字符串逆序 第十三届蓝桥杯青少年创意编程大赛C++编程选拔赛真题解析

目录 C/C++字符串逆序 一、题目要求 1、编程实现 2、输入输出 二、算法分析

如何在Rocky Linux中安装nmon

一、环境基础 [rootlocalhost nmon16d]# cat /etc/redhat-release Rocky Linux release 9.2 (Blue Onyx) [rootlocalhost nmon16d]# uname -r 5.14.0-284.11.1.el9_2.x86_64 [rootlocalhost nmon16d]# 二、安装步骤 在Rocky Linux和AlmaLinux等基于RHEL 的发行版上&#xff…

高速USB转以太网芯片CH397各系统使用指南

简介 CH397是一款USB2.0高速转以太网芯片&#xff0c;支持10M/100M网络的以太网MACPHY&#xff0c;内置青稞RISC-V 处理器、符合IEEE802.3 和IEEE802.3az-2010 协议规范。支持Windows/ Linux /macOS /iOS /Android 等多平台各系统&#xff0c;适配各类台式电脑、笔记本电脑、平…

Swift构造器继承链

类类型的构造器代理 Swift构造器需遵循以下三大规则&#xff1a; 指定构造器必须调用它直接父类的指定构造器方法便利构造器必须调用同一个类中定义的其他初始化方法便利构造器在最后必须调用一个指定构造器 两段式构造过程 Swift 中类的构造过程包含两个阶段。第一个阶段&a…