源码编译 glibc 调试版

下载 glibc 源码

镜像下载地址:http://mirrors.ustc.edu.cn/gnu/libc/glibc-2.31.tar.gz

编译安装 glibc

1
2
3
4
5
mkdir build
cd build
../glibc-2.31/configure --prefix=/home/lhx/glibc/install/ --disable-werror --enable-debug=yes
make -j
make install

编译测试用例时指定 glibc

通过 -Wl,-rpath 选项,在编译阶段指定要链接的 glibc 库

1
gcc -g test.c -Wl,-rpath=/home/lhx/glibc/install/lib

有些情况下会报重定位的错误,这时候需要在编译时指定 ld-linux.so.2,即完整的命令:

1
gcc -g test.c -Wl,-rpath=/home/lhx/glibc/install/lib -Wl,-dynamic-linker=/home/lhx/glibc/install/lib/ld-linux.so.2

可以看到测试用例 a.out 链接的 glibc 库就是刚才自己编译出来的调试版

1
2
3
4
lhx@ubuntu:~/test$ ldd a.out 
linux-vdso.so.1 (0x00007fff60736000)
libc.so.6 => /home/lhx/glibc/install/lib/libc.so.6 (0x00007fd4a40a5000)
/lib64/ld-linux-x86-64.so.2 (0x00007fd4a426f000)

开始 gdb 调试

使用 gdb 调试刚编译的 a.out,可以在 printf 那行代码,单步 step 进入到 printf 的内部。

1
2
3
4
5
6
7
8
9
10
13	    printf("i = %d\n", i); 
(gdb) s
__printf (format=0x555555556004 "i = %d\n") at printf.c:28
28 {
(gdb) s
32 va_start (arg, format);
(gdb) bt
#0 __printf (format=0x555555556004 "i = %d\n") at printf.c:32
#1 0x000055555555517b in main () at test2.c:13
(gdb)