最近想重新过一遍glibc的源码,记一下带glibc源码调试的方法。

Step1: Configure and Compile

本地编译glibc源码。

从gnu官网下载glibc 2.23的源码,创建三个文件夹:

image-20200401153046609

其中glibc_2.23是放源码的文件夹,另外两个自己创建一下。glibc不允许在自己源码的文件夹下编译。

进入到glibc-2.23_build文件夹,配置编译选项。

1
../glibc-2.24/configure  '--prefix=/home/keenan/Desktop/glibc-2.24_out'

然后

1
2
make
make install

make大概10分钟,make install大概2分钟。

成果物:

  • Libc.so和libc.so.6 在glibc-2.23_build文件夹下
  • ld.so在glibc-2.23_build/elf文件夹下
  • make install之后libc.so.6在glibc-2.23_out/lib/libc.so.6

Step2: Patch

首先先编译一个c文件,例如我们想调试malloc:

image-20200401153655890

gcc编译。

1
gcc test.c -o test

通过patchelf将bin修改为,用我们build文件夹下的ld来链接,这样才能用我们带源码的libc.so.6。

1
patchelf --set-interpreter /home/keenan/Desktop/glibc-2.23_build/elf/ld.so ./test

前后的效果:

image-20200401154016958

可以看到用的ld.so是我们自己编译的。

我们用LD_DEBUG来看一下libc的搜索路径:

image-20200401154138648

可以看到用的是我们编译的libc了。

Step3: Debugging

现在我们来实验一下gdb.

gdb打开在main下断点,此时是没有源码的。

image-20200401154343839

我们进入到第二个malloc。可以看到出现了源码。

image-20200401154421946

通过源码行号下断点:例如想在3793下断点:

image-20200401154613675

1
2
pwndbg> b /home/keenan/Desktop/glibc-2.23/malloc/malloc.c:3793
Breakpoint 2 at 0x7ffff7aaed8b: file malloc.c, line 3793.

可以看到成功。

image-20200401154644157

这里是可以用p查看变量值的。

image-20200401154730368

或者通过条件下断点:

1
break test.c:6 if num>0

查看源码:

1
list

image-20200401154847865

参考