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 掉。
参考 |
4.3 调试glibc函数-printf为例