当前位置: 首页 > 编程日记 > 正文

centos6.5原生系统修改ceph-mon 的ELF来让其加载低版本glibc库函数

文章目录

        • Step 1:glibc-2.17 被libc.so.6库依赖,升级glibc库
        • Step2:升级编译器-->4.8.2可以正常编译glibc2.17
        • Step3:修改ELF,降低ceph-mon依赖的库函数版本
          • 解决ceph-mon调用高版本libc库(修改动态库链接表ELF)

Step 1:glibc-2.17 被libc.so.6库依赖,升级glibc库

环境上需要拥有gcc支持编译
使用glibc源码编译安装步骤如下:

tar -zxvf glibc-2.17.tar.gz
cd glibc-2.17
mkdir build && cd $_
sudo ../configure --prefix=/usr/glibc-2.17 --disable-profile --enable-add-ons --withheaders=/
usr/include --with-binutils=/usr/bin
make && make install

出现如下问题:

/usr/bin/python: error while loading shared libraries: libpython2.6.so.1.0: cannot open
shared object file: No such file or directory

系统崩溃,glibc库的链接被损坏。因为编译器版本较低,并不支持高版本的glibc库,导致升级高版本的C库时破坏掉
了原生系统的C库链接

Step2:升级编译器–>4.8.2可以正常编译glibc2.17

使用命令
objdump -T /lib64/libc.so.6 |grep GLIBC_2.17可以看到在C库中使用glibc-2.17版本的具体函数
执行如下命令可以看到我们的ceph-mon所要求的GLIBC库函数

objdump -T /usr/bin/ceph-mon |grep GLIBC_2.17
或者使用命令
nm -a /usr/bin/ceph-mon |grep GLIBC_2.17 打印所有使用glibc_2.17的版本函数
发现并没有输出,即ceph-mon没有用到与2.17版本的C函数
objdump -T /usr/bin/ceph-mon |grep GLIBC_2.14
[root@node5 yum]# objdump -T /usr/bin/ceph-mon |grep GLIBC_2.14
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.14 memcpy
此时可以看到Ceph-mon使用了2.14 libc库的memcpy函数
即我们在无法在低版本的centos上运行ceph-mon的原因是其引用了高版本的libc-2.17库中的memcpy

解决以上C库引用版本问题可以尝试更改mon的链接文件,让elf调用低版本的C库中的memcpy函数

Step3:修改ELF,降低ceph-mon依赖的库函数版本

使用命令查看ELF符号表
readelf -sV /usr/bin/ceph-mon

Version needs section ‘.gnu.version_r’ contains 11 entries: Addr: 0x00000000002a9330 O set: 0x2a9330 Link: 5
(.dynstr) 000000: Version: 1
File: ld-linux-x86-64.so.2 Cnt: 1
0x0010: Name: GLIBC_2.3 Flags: none Version: 39
0x0020: Version: 1
File: librt.so.1 Cnt: 1
0x0030: Name: GLIBC_2.2.5 Flags: none Version: 36
0x0040: Version: 1
File:libgcc_s.so.1 Cnt: 2
0x0050: Name: GCC_3.0 Flags: none Version: 42
0x0060: Name: GCC_3.4 Flags: none Version: 35
0x0070: Version: 1
File: libdl.so.2 Cnt: 1
0x0080: Name: GLIBC_2.2.5 Flags: none Version: 23
0x0090: Version: 1
File:libnss3.so Cnt: 4
0x00a0: Name: NSS_3.12.9 Flags: none Version: 38
0x00b0: Name: NSS_3.3 Flags: none Version: 32
0x00c0: Name: NSS_3.2 Flags: none Version: 19
0x00d0: Name: NSS_3.12.5 Flags: none Version: 16
0x00e0: Version:1
File: libibverbs.so.1 Cnt: 2
0x00f0: Name: IBVERBS_1.0 Flags: none Version: 30
0x0100: Name: IBVERBS_1.1 Flags: none Version: 14
0x0110: Version: 1
File: libm.so.6 Cnt: 1
0x0120: Name: GLIBC_2.2.5 Flags: none Version: 13
0x0130: Version: 1
File: libresolv.so.2 Cnt: 2
0x0140: Name: GLIBC_2.2.5 Flags: none Version: 21
0x0150: Name:GLIBC_2.9 Flags: none Version: 12
0x0160: Version: 1
File: libstdc++.so.6 Cnt: 12
0x0170: Name: CXXABI_1.3.7 Flags: none Version: 41
0x0180: Name: GLIBCXX_3.4.17 Flags: none Version: 37
0x0190: Name: CXXABI_1.3.1 Flags: none Version: 34
0x01a0: Name: GLIBCXX_3.4.18 Flags: none Version: 26
0x01b0: Name: GLIBCXX_3.4.9 Flags: none Version: 25
0x01c0: Name: GLIBCXX_3.4.11 Flags: none Version: 20
0x01d0: Name: GLIBCXX_3.4.14 Flags: none Version: 18
0x01e0: Name: CXXABI_1.3.5 Flags: none Version: 15
0x01f0: Name: GLIBCXX_3.4.15 Flags: none Version:
9 0x0200: Name: GLIBCXX_3.4.19 Flags: none Version: 8
0x0210: Name: GLIBCXX_3.4 Flags: none Version: 5 0x0220:
Name: CXXABI_1.3 Flags: none Version: 4 0x0230: Version: 1
File: libpthread.so.0 Cnt: 3
0x0240: Name: GLIBC_2.12Flags: none Version: 17
0x0250: Name: GLIBC_2.2.5 Flags: none Version: 7
0x0260: Name: GLIBC_2.3.2 Flags: none Version: 3
0x0270: Version: 1
File: libc.so.6 Cnt: 12
0x0280: Name: GLIBC_2.3.3 Flags: none Version: 40 0x0290:
Name: GLIBC_2.7 Flags: none Version: 33
0x02a0: Name: GLIBC_2.4 Flags: none Version: 31
0x02b0: Name:GLIBC_2.14 Flags: none Version: 29
0x02c0: Name: GLIBC_2.10 Flags: none Version: 28
0x02d0: Name: GLIBC_2.8Flags: none Version: 27
0x02e0: Name: GLIBC_2.9 Flags: none Version: 24
0x02f0: Name: GLIBC_2.3.2 Flags: noneVersion: 22
0x0300: Name: GLIBC_2.3 Flags: none Version: 11
0x0310: Name: GLIBC_2.2.5 Flags: none Version: 10
0x0320: Name: GLIBC_2.5 Flags: none Version: 6
0x0330: Name: GLIBC_2.3.4 Flags: none Version: 2

解决ceph-mon调用高版本libc库(修改动态库链接表ELF)

使用命令strings /root/ceph-mon | grep GLIBC_ 查看运行库调用的glibc版本如下有2.16以及2.14
在这里插入图片描述
使用nm /root/ceph-mon |grep GLIBC_2.14查看对应版本的调用函数,只有高版本的一个函数
在这里插入图片描述
再使用命令nm /lib64/libc.so.6 |grep memcpy查看当前系统libc库中的memcpy函数是否低版本的c库函数
在这里插入图片描述
显然我们拥有两种版本的内存拷贝函数,那么接下来就是修改2.14版本的动态库为2.2.5版本的

使用命令 readelf -sV /root/ceph-mon 使用加载器读取ceph-mon内容,查看该部分内容如下 二进制文件入口地址(16进制)如下(由于内容较多,无法显示完全,只截取有用信息部分):
在这里插入图片描述
对应函数偏移地址(16进制)如下,查看file libc.so.6文件下的对应版本
在这里插入图片描述
如上2.14版本的内存拷贝函数偏移地址为0x02c0,2.2.5版本的为0x0320
寻找真正的函数入口地址即为二进制文件入口地址+函数偏移地址–》
glibc2.14版本的: 0x2a9368+0x02c0=0x2a9628
glibc2.2.5版本的: 0x2a9368+0x0320=0x2a9688

执行命令vim /root/ceph-mon 打开二进制文件,一般模式下输入:%!xxd 转为16进制格式如下
在这里插入图片描述
这个时候因为我们函数真正入口地址为0x2a9628,以8结尾,所以我们跳转到2a9620以及2a9680位置,对应函数入口地址如下:
在这里插入图片描述
红色为2.16版本的memcpy函数入口地址,蓝色为2.2.5版本入口地址,将2.16的数值与2.2.5数值对应位置保持一直即可完成版本修改
在这里插入图片描述
输入:%!xxd -r指令将16进制转回为2进制,保存退出即可,再次执行readelf -sV /root/ceph-mon查看readelf动态链接表,已经完成修改memcpy函数的glibc版本为2.2.5。此处注意,编辑转换为16进制之后的ceph-mon二进制文件时不能退出vim编辑,否则再次进去的时候无法转换回二进制格式
在这里插入图片描述

相关文章:

如何创建一个基础jQuery插件

如何创建一个基础插件 How to Create a Basic Plugin 有时你想使一块功能性的代码在你代码的任何地方有效.比如,也许你想调用jQuery对象的一个方法,对该对象进行一系列的操作.可能你写了一个真正有用的实用函数,想它能够轻易的移植到其他项目.在这种情况下,你可能想写一个插件.…

rk3399在linux机上烧写img,烧写固件 — TB-96AI documentation

Window主机烧写固件1、安装Windows PC端USB驱动(首次烧写执行)。2、双击DriverAssitant_v4.5DriverInstall.exe打开安装程序,点击“驱动安装”按提示安装驱动即可,安装界面如下所示:3、Type-C线连接主机端的USB接口和RK3399Pro TB-96AI开发板的Type-C接口…

Eclipse,Mycclipse自动补全快捷键设置

为什么80%的码农都做不了架构师?>>> eclipse3.3及以后的版本中中把内容助手(content assist)的快捷键由 alt /改成了ctrl space,这又刚好跟我们操作系统的切换输入法的快捷键冲突,所以造成内容助手不能使用了,给写代…

php 无限极分类

无限极分类1&#xff1a; 1 public function judeg($id)2 {3 $rs Db::name(finance_class) -> field(parent_code) -> where(id,$id) -> select();4 $i 1;5 foreach($rs as $k > $v){6 if($v[parent_code] <> 0){7 $i $this -…

ceph-bluestore-tool基本使用

主要是在bluestore的实例上执行低级管理操作的使用程序,是ceph bluestore的管理工具 命令 help显示帮助信息fsck [--deep]对bluestore元数据进行一致性检查。如果指定了–deep,还要读取所有对象数据并验证校验和repair运行一致性检查 并修复我们可以发生的任何错误bluefs-expo…

Android基础是什么,Android基础概念

android {compileSdkVersion 23buildToolsVersion “23.0.1”defaultConfig {applicationId “com.example.checkyourtargetsdk"minSdkVersion 15targetSdkVersion 23versionCode 1versionName “1.0”}以上是Android工程里名称为app的module的build.gradle文件其中的内容…

HDOJ 1060 Leftmost Digit

Author Ignatius.L题目大意&#xff1a;1.第一行输入一个整数T代表接下来有T组测试数据。2.接下来的T行&#xff0c;每行输入一个整数&#xff08;1<N<1,000,000,000&#xff09;。3.输出结果为N^N&#xff08;N的N次方&#xff09;最左边的那一位数&#xff08;即最高位…

WPF-002 下拉列表的简单实现

最近在一个WPF项目中用到一个下拉列表&#xff0c;随着用户输入字符而进行显示&#xff0c;使用了绑定等知识&#xff0c;虽然实现比较简单&#xff0c;可是在性能上也是想了很多办法终于才勉强可以用&#xff0c;与大家分享下。 用于页面绑定的模型类&#xff1a; public clas…

洛谷:P3950 部落冲突

原题地址:https://www.luogu.org/problemnew/show/P3950 题目简述 给定一棵树&#xff0c;每次给定一个操作&#xff0c;有如下两种&#xff1a; 将某条边染黑 2.询问给定的u,v两点间是否有边被染黑思路 询问两点间是否有边被染黑只需要在求LCA时判一下就行。所以直接上树链剖分…

深入理解ceph-disk prepare 源码逻辑

文章目录CEPH-DISK代码逻辑DEF MAIN:DEF PARSE_ARGS:DEF Prepare.set_subparser(subparsers)def _prepare(self):PrepareBluestore的_prepare函数def prepare(self, *to_prepare_list):PrepareData类中的prepare函数def prepare_device(self, *to_prepare_list): #prepare_devi…

Deep Learning 学习随记(三)续 Softmax regression练习

上一篇讲的Softmax regression&#xff0c;当时时间不够&#xff0c;没把练习做完。这几天学车有点累&#xff0c;又特别想动动手自己写写matlab代码 所以等到了现在&#xff0c;这篇文章就当做上一篇的续吧。 回顾&#xff1a; 上一篇最后给出了softmax regression的代价函数和…

html画三个重叠的矩形,html5 实现两个矩形的叠加

Canvas Primer - Example: Drawing shadowswindow.addEventListener(load, function () {//得到canvas&#xff0c;并检测是否支持canvasvar elem document.getElementById(myCanvas);if (!elem || !elem.getContext) {return;}// 得到可以画图的上下文contextvar context el…

sqlplusw下登录sys账户

今天使用sqlplusw时&#xff0c;发现每次使用sys用户登录时总是报错&#xff0c;提示要以sysdba或者sysoper的身份登录&#xff0c;错误提示如下图所示&#xff1a;可是界面上没地方可以输入角色的地方呀&#xff0c;后经尝试发现&#xff0c;在口令输入框里首先输入密码&#…

mybatis =或这个=提示错误Tag name expecte问题解决

解决方案&#xff1a; 1、将<号或者>号进行转义 DATE_SUB(CURDATE(), INTERVAL 31 DAY) < DATE(created) 2、使用<![CDATA[ ]]>符号进行说明 <![CDATA[DATE_SUB(CURDATE(), INTERVAL 31 DAY) < DATE(created)]]> 附&#xff1a; 附录&#xff1a;常见…

s-sgdisk源码分析 “--set-alignment=value分区对齐参数”

文章目录边界对齐子命令使用源码分析sgdisk.cc main函数入口gptcl.cc DoOptions解析并执行具体命令函数gpt.cc CreatePartition创建分区函数&#xff0c;设置起始扇区对齐gpt.cc Align分区对齐函数&#xff0c;设置起始扇区对齐sgdisk命令是由 gdisk-0.8.6-4.el7.x86_64程序包安…

NuGet学习笔记(3) 搭建属于自己的NuGet服务器

文章导读 创建NuGetServer Web站点 发布站点到IIS 添加本地站点到包包数据源 在上一篇NuGet学习笔记(2) 使用图形化界面打包自己的类库 中讲解了如何打包自己的类库&#xff0c;接下来进行最重要的一步&#xff0c;从零开始搭建属于自己的NuGet服务器&#xff0c;诚然园子里及其…

计算机网络共享打不开,网络和共享中心打不开,共享无法访问没有权限

在Win7系统下如果别的计算机设置了共享&#xff0c;那么在本机设置网络发现后就可以打开网络搜索到共享计算机和共享文件了&#xff0c;不过一些朋友反馈win7系统网络发现无法启用的问题&#xff0c;下面小编整理了解决方法&#xff0c;大家可以参考一下哦。解决方法如下&#…

千万不要把 bool 当成函数参数

我们有很多 Coding Style 或 代码规范。 但这一条可能会经常被我们所遗忘&#xff0c;就是我们 经常会在函数的参数里使用bool参数&#xff0c;这会大大地降低代码的可读性。 不信&#xff1f;我们先来看看下面的代码。 当你读到下面的代码&#xff0c;你会觉得这个代码是什么意…

修改ceph-disk源码,增加指定ceph.conf部署osd的功能

文章目录 ceph环境源码修改 主文件:`ceph-disk/main.py`main函数入口parse_args(argv)增加子命令解析get_conf函数使`conf`生效修改所有调用get_conf函数的上级函数参数配置由于最近工作中需要优化osd部署流程,单节点并发加盘过程需要指定特定conf文件,来完成单盘db,wal分区…

相关计算机专业的英语文献,英文文献及翻译计算机专业.doc

英文文献及翻译计算机专业外文资料翻译—英文原文NET-BASED TASK MANAGEMENT SYSTEMHector Garcia-Molina, Jeffrey D. Ullman, Jennifer WisdomABSTRACTIn net-based collaborative design environment, design resources become more and more varied and complex. Besides c…

作业 3 应用分支与循环结构解决问题 统计字符个数

/*统计字符&#xff0c;包括空格或回车&#xff0c;数字字符和其他字符*/#include<stdio.h> int main(void) {int digit,space,letter,other; /*定义4个变量分别存放统计结果*/ char ch;int i;digitspaceletterother0; /*置…

php后期静态绑定

从php5.3开始&#xff0c;php增加了一个叫后期绑定的功能&#xff0c;用于在继承范围内引用静态调用的类 该功能从语言内部角度考虑北命名为“后期静态绑定”&#xff1b;“后期绑定”意思说&#xff1a;static&#xff1a;&#xff1a;不再被解析为定义当前方法所在的类&#…

pytest 9 pytest-datadir读取文件信息

安装&#xff1a;pip install pytest-datadir 介绍&#xff1a;用于操作测试数据目录和文件的插件。pytest-datadir他会寻找包含测试模块名字的文件夹或者全局的一个文件夹名字为data下的数据。比如以下的一个结构&#xff1a; firstdemo.py可以从test_firstdemo文件夹下的文件…

深入理解ceph-disk activate 源码逻辑

文章目录CEPH-DISK代码逻辑Activate osd的主要逻辑如下DEF main_activate激活osd的入口函数DEF mount_activate挂载临时目录&#xff0c;分配osd id并初始化osdDEF activate 分配osd_id以及初始化osdCEPH-DISK代码逻辑 本文在上文 :深入理解ceph-disk prepare 源码逻辑基础上描…

simple_html_dom meta,HTML DOM Meta content 属性

HTML DOM Meta content 属性Meta 对象定义和用法content 属性可设置或者返回 meta 元素 content 属性值。content 属性指定了 meta 信息的内容。注意&#xff1a; 这个属性可用的值依赖于name 和httpEquiv 属性的值。语法设置 content 属性&#xff1a;linkObject.content"…

struts2登录后返回登录前的页面

在Action中添加 String getUrl&#xff08;&#xff09; &#xff5b; return ServletActionContext.getRequest().getHeader("referer"); &#xff5d; 然后配置struts的这个Action的result为&#xff1a;<result type"redirect">${url}</resu…

Exchange 2010 恢复误删除的邮箱账户及其邮箱

在误删除邮箱后&#xff0c;AD中相应的账号也会随之删除&#xff0c;此时该如何恢复&#xff1f; 先来模拟邮箱被误删除&#xff0c;在EMC控制台中删除别名为jqq的邮箱 打开ADUC&#xff0c;发现相应的jqq账号也被删除了: 1.恢复AD账号 下载运行ADRecycle Bin&#xff0c;点击【…

Python 函数初识 (1)

一、今日主要内容 认识函数 函数:对功能或者动作的封装(定义) 语法: def 函数名字(形参) 函数体 函数的调用格式:函数名(实参) 函数的返回值 关键字:return 终止函数的运行 1、函数内部不写return,默认函数末尾返回…

python的popen函数

最近了解了一下python的popen函数的使用&#xff0c;主要是用来执行linux命令 函数使用 使用之前需要导入import os模块 使用方式: os.popen(cmd)返回值: 返回一个文件句柄 import os cmd"/sbin/partx /dev/sdb" result_listos.popen(cmd) print result_list执行…

计算机竞赛CCC可以直接学吗,CCC 计算机竞赛到底有多牛!

加拿大计算机竞赛是什么&#xff1f;难度情况&#xff1f;加拿大计算机竞赛是由加拿大滑铁卢大学主办的&#xff0c;每年举办一次&#xff0c;是一场面向中学生的计算机程序设计比赛&#xff0c;CCC竞赛的一个目的是为广大中学生朋友们提供一个机会来测试自己分析、设计以及编程…