文章目录

  • 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编辑,否则再次进去的时候无法转换回二进制格式

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

  1. glibc手动升级高版本导致系统(RedHat/Centos)异常(无法开机等)的解决方法(回退低版本glibc)

    https://blog.csdn.net/weixin_42881528/article/details/85142674 https://www.zhihu.com/question/331104 ...

  2. 虚拟机Virtualbox中的Ubuntu系统,安装增强功能时报错:未能加载虚拟光驱VBoxsGuestAdditions.iso到虚拟电脑

    虚拟机Virtualbox中的Ubuntu系统,安装增强功能时报错:未能加载虚拟光驱VBoxsGuestAdditions.iso到虚拟电脑 在virtualbox中装ubuntu虚拟机,但是分辨率太 ...

  3. 计算机windows无法加载怎么办,win7开机提示由于系统注册表文件丢失或损坏因此无法加载怎么办...

    ? ? 有番茄花园win7旗舰版用户向小编反馈,使用u盘重装系统后开不了机,提示"由于系统注册表文件丢失或损坏因此无法加载",错误代码是0xc000000f,遇到这种问题我们该怎么 ...

  4. win10打开此计算机慢,Win10系统打开此电脑很慢总显示在加载的解决方法

    原标题:Win10系统打开此电脑很慢总显示在加载的解决方法 众所周知,安装完win10系统之后,经常会遇到一些故障,有win10系统用户反映说要打开桌面上此电脑图标的时候,速度很慢,总是在加载不显示出 ...

  5. 电脑桌面计算机打开很慢,Win10系统打开此电脑很慢总显示在加载的解决方法

    众所周知,安装完win10系统之后,经常会遇到一些故障,有win10系统用户反映说要打开桌面上此电脑图标的时候,速度很慢,总是在加载不显示出里面的内容,这样很是耗费时间,有什么方法可以解决Win10系 ...

  6. 注册表文件缺失oracle,win7开机提示由于系统注册表文件丢失或损坏因此无法加载怎么办...

    ‍‍ 有番茄花园win7旗舰版用户向小编反馈,使用u盘重装系统后开不了机,提示"由于系统注册表文件丢失或损坏因此无法加载",错误代码是0xc000000f,遇到这种问题我们该怎么办 ...

  7. jquery/原生js/css3 实现瀑布流以及下拉底部加载

    思路: style: <style type="text/css">body,html{margin: 0;padding:0;}#container{position ...

  8. linux系统css样式加载不出,Linux系统虚拟主机网站访问页面css样式文件加载失败或图片无法显示的分析解决...

    问题场景:客户使用Linux系统虚拟主机,网站程序上传之后访问发现页面排版有问题,css样式文件加载失败,部分图片显示不出来,以织梦CMS程序为例,如下图所所示: 问题原因: 1.Linux系统虚拟主 ...

  9. linux系统把驱动编译成.ko模块 insmod动态加载

    介绍: Linux 驱动有两种运行方式,第一种就是将驱动编译进 Linux 内核中,这样当 Linux 内核启动的时候就会自动运行驱动程序.第二种就是将驱动编译成模块(Linux 下模块扩展名为.ko ...

最新文章

  1. 第2条 遇到多个构造器参数时要考虑构建器
  2. linux 下 设置 MySQL8 表名大小写不敏感方法,解决设置后无法启动 MySQL 服务的问题
  3. dubbo提供者主配置文件application.properties
  4. samba权限跟linux权限,linux之samba与linux权限
  5. oracle视图失效,ORACLE 11Gr2 V$ARCHIVED_LOG视图过期信息
  6. 【LeetCode笔记】剑指 Offer 10-I. 斐波那契数列 (Java、递归、动态规划)
  7. SAP License:SAP凭证的类别和记账码
  8. python pip 安装
  9. Nodejs解压版安装
  10. 通讯简单测试—Modscan32使用简介-Susie 周
  11. 浏览器被hao360,hao123,2345,搜狗,www.xie116.xyz/ 劫持的方法
  12. 阿里P9告诉你:P6-P10到底啥区别,别再傻傻分不清?怎样才能打怪晋级?
  13. 获取不带后缀名的Excel文件名Python
  14. php使用qq登录api接口,QQ的账号登录及PHP api操作
  15. Android 数字显示带E(科学计数法)
  16. 深入分析Linux虚拟化KVM-Qemu之ARMv8虚拟化
  17. CGAL 三维三角剖分
  18. Java实现 蓝桥杯VIP 算法提高 我们的征途是星辰大海
  19. c语言名人名言大全摘抄,数学名人名言大全摘抄
  20. 轻量级实时语义分割:ENet ERFNet

热门文章

  1. python基础(三元运算+深浅拷贝+函数参数)
  2. Expect 教程中文版
  3. DOS批处理的字符串功能
  4. 深度解析VC中的消息(上)
  5. mysql连接池为何不用nio_为什么要用数据库连接池?
  6. python删除字典中性别为男_python初学者,用python3实现基本的学生管理系统代码实例...
  7. ubuntu 禁用透明大页_Linux关于透明大页的使用与禁用介绍
  8. 聊天软件系统测试用例,QQ聊天框测试用例设计
  9. 梯度算法求步长的公式_LM(Levenberg-Marquarelt)算法
  10. fastdfs java client_fastdfs-client-java操作fastdfs5.0.4