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为例