ubuntu 編譯glibc


參考

編譯glibc,以期源碼調試

https://www.cnblogs.com/zq10/p/14314952.html

make manpage

https://linux.die.net/man/1/make

 

1 下載glibc

見 https://www.cnblogs.com/zhangzhiwei122/p/15815100.html 

 

2 編譯glibc

zhiwei@LAPTOP-ZHIWEI:~/work/c/glibc$ cd glibc-2.31/

zhiwei@LAPTOP-ZHIWEI:~/work/c/glibc/glibc-2.31$ mkdir -p build/

zhiwei@LAPTOP-ZHIWEI:~/work/c/glibc/glibc-2.31$ cd build/

zhiwei@LAPTOP-ZHIWEI:~/work/c/glibc/glibc-2.31/build$ ../configure --prefix=/home/zhiwei/work/c/glibc/install --disable-werror --disable-profile

 

zhiwei@LAPTOP-ZHIWEI:~/work/c/glibc/glibc-2.31/build$ make –debug=b  | tee build.log

zhiwei@LAPTOP-ZHIWEI:~/work/c/glibc/glibc-2.31/build$ make install

 

 

3 使用glibc

3.1 建立符號連接

 

zhiwei@LAPTOP-ZHIWEI:~/work/c/glibc/install/lib$ cd /home/zhiwei/work/c/glibc/install/lib

zhiwei@LAPTOP-ZHIWEI:~/work/c/glibc/install/lib$ ln -s ld-2.31.so ld-linux-x86-64.so.2

zhiwei@LAPTOP-ZHIWEI:~/work/c/glibc/install/lib$ ln -s libc-2.31.so libc.so.6

zhiwei@LAPTOP-ZHIWEI:~/work/c/glibc/install/lib$ ll ld-linux-x86-64.so.2  libc.so.6

lrwxrwxrwx 1 zhiwei zhiwei 10 Jan 17 15:14 ld-linux-x86-64.so.2 -> ld-2.31.so*

lrwxrwxrwx 1 zhiwei zhiwei 12 Jan 17 15:13 libc.so.6 -> libc-2.31.so*

 

3.2 使用新glibc 的libc 和 ld.so 生成main.elf

zhiwei@LAPTOP-ZHIWEI:~/work/c$ gcc main.c -o main.myc.elf -L /home/zhiwei/work/c/glibc/install/lib -Wl,--rpath=/home/zhiwei/work/c/glibc/install/lib -Wl,-I /home/zhiwei/work/c/glibc/install/lib/ld-2.31.so

 

注意檢查生成的 main.myc.elf 的interpreter

 

 

4 調試glibc 的函數 – printf 為例子

 

4.1 gdb 啟動調試

 

gdb main.myc.elf

 

4.2 附帶說明-用戶層應用的第一條指令

參考  https://www.cnblogs.com/zhangzhiwei122/p/15811422.html

 

這兒僅僅使用自己編譯的glibc 再 佐證一下

 

1、starti 執行1 條指令

2、我們新編譯的ld-2.31.so 里面的 _start 函數

 

3、反匯編 _start 函數,注意機器碼和前面 這兒的一樣。但是前面一篇中使用系統的ld-2.31.so ,沒有 _start 函數。

 

4、多反匯編 一些內存,看到,和 前面一篇中使用系統的ld-2.31.so 時,一樣。

 

tips:

這兒有 _start 這個標識符,使用系統自己的 ld-2.31.so 時怎么沒有?

是因為

1、系統的 ld-2.31.so 被strip 了,_start 符號被抹掉了【可以把我們編譯的ld-2.31.so 也strip 一下測試,看到和使用系統的一樣了,都沒_start 了。

 

2、ld-2.31.so 編譯使用了 --version-script 選項,

gcc   -nostdlib -nostartfiles -shared -o /home/zhiwei/work/c/glibc/glibc-2.31/build/elf/ld.so.new       \

      -Wl,-z,combreloc -Wl,-z,relro -Wl,--hash-style=both -Wl,-z,defs     \

      /home/zhiwei/work/c/glibc/glibc-2.31/build/elf/librtld.os \

 -Wl,--version-script=/home/zhiwei/work/c/glibc/glibc-2.31/build/ld.map    \

      -Wl,-soname=ld-linux-x86-64.so.2        \

      -Wl,-defsym=_begin=0

 

選擇性的導出了一些符號,其他【像_start】都沒導出,所以這些符號會被 strip 掉。

 

參考

https://blog.csdn.net/hh2000/article/details/3201716

 

4.3 調試glibc函數-printf為例

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM