日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

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

發(fā)布時間:2023/11/27 生活经验 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 centos6.5原生系统修改ceph-mon 的ELF来让其加载低版本glibc库函数 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

        • Step 1:glibc-2.17 被libc.so.6庫依賴,升級glibc庫
        • Step2:升級編譯器-->4.8.2可以正常編譯glibc2.17
        • Step3:修改ELF,降低ceph-mon依賴的庫函數(shù)版本
          • 解決ceph-mon調(diào)用高版本libc庫(修改動態(tài)庫鏈接表ELF)

Step 1:glibc-2.17 被libc.so.6庫依賴,升級glibc庫

環(huán)境上需要擁有g(shù)cc支持編譯
使用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

出現(xiàn)如下問題:

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

系統(tǒng)崩潰,glibc庫的鏈接被損壞。因為編譯器版本較低,并不支持高版本的glibc庫,導(dǎo)致升級高版本的C庫時破壞掉
了原生系統(tǒng)的C庫鏈接

Step2:升級編譯器–>4.8.2可以正常編譯glibc2.17

使用命令
objdump -T /lib64/libc.so.6 |grep GLIBC_2.17可以看到在C庫中使用glibc-2.17版本的具體函數(shù)
執(zhí)行如下命令可以看到我們的ceph-mon所要求的GLIBC庫函數(shù)

objdump -T /usr/bin/ceph-mon |grep GLIBC_2.17
或者使用命令
nm -a /usr/bin/ceph-mon |grep GLIBC_2.17 打印所有使用glibc_2.17的版本函數(shù)
發(fā)現(xiàn)并沒有輸出,即ceph-mon沒有用到與2.17版本的C函數(shù)
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函數(shù)
即我們在無法在低版本的centos上運行ceph-mon的原因是其引用了高版本的libc-2.17庫中的memcpy

解決以上C庫引用版本問題可以嘗試更改mon的鏈接文件,讓elf調(diào)用低版本的C庫中的memcpy函數(shù)

Step3:修改ELF,降低ceph-mon依賴的庫函數(shù)版本

使用命令查看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調(diào)用高版本libc庫(修改動態(tài)庫鏈接表ELF)

使用命令strings /root/ceph-mon | grep GLIBC_ 查看運行庫調(diào)用的glibc版本如下有2.16以及2.14

使用nm /root/ceph-mon |grep GLIBC_2.14查看對應(yīng)版本的調(diào)用函數(shù),只有高版本的一個函數(shù)

再使用命令nm /lib64/libc.so.6 |grep memcpy查看當(dāng)前系統(tǒng)libc庫中的memcpy函數(shù)是否低版本的c庫函數(shù)

顯然我們擁有兩種版本的內(nèi)存拷貝函數(shù),那么接下來就是修改2.14版本的動態(tài)庫為2.2.5版本的

使用命令 readelf -sV /root/ceph-mon 使用加載器讀取ceph-mon內(nèi)容,查看該部分內(nèi)容如下 二進制文件入口地址(16進制)如下(由于內(nèi)容較多,無法顯示完全,只截取有用信息部分):

對應(yīng)函數(shù)偏移地址(16進制)如下,查看file libc.so.6文件下的對應(yīng)版本

如上2.14版本的內(nèi)存拷貝函數(shù)偏移地址為0x02c0,2.2.5版本的為0x0320
尋找真正的函數(shù)入口地址即為二進制文件入口地址+函數(shù)偏移地址–》
glibc2.14版本的: 0x2a9368+0x02c0=0x2a9628
glibc2.2.5版本的: 0x2a9368+0x0320=0x2a9688

執(zhí)行命令vim /root/ceph-mon 打開二進制文件,一般模式下輸入:%!xxd 轉(zhuǎn)為16進制格式如下

這個時候因為我們函數(shù)真正入口地址為0x2a9628,以8結(jié)尾,所以我們跳轉(zhuǎn)到2a9620以及2a9680位置,對應(yīng)函數(shù)入口地址如下:

紅色為2.16版本的memcpy函數(shù)入口地址,藍色為2.2.5版本入口地址,將2.16的數(shù)值與2.2.5數(shù)值對應(yīng)位置保持一直即可完成版本修改

輸入:%!xxd -r指令將16進制轉(zhuǎn)回為2進制,保存退出即可,再次執(zhí)行readelf -sV /root/ceph-mon查看readelf動態(tài)鏈接表,已經(jīng)完成修改memcpy函數(shù)的glibc版本為2.2.5。此處注意,編輯轉(zhuǎn)換為16進制之后的ceph-mon二進制文件時不能退出vim編輯,否則再次進去的時候無法轉(zhuǎn)換回二進制格式

總結(jié)

以上是生活随笔為你收集整理的centos6.5原生系统修改ceph-mon 的ELF来让其加载低版本glibc库函数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。