Debugging with GNU libc source code
Apr 1, 2020
最近想重新过一遍glibc的源码,记一下带glibc源码调试的方法。
Step1: Configure and Compile
本地编译glibc源码。
从gnu官网下载glibc 2.23的源码,创建三个文件夹:
其中glibc_2.23是放源码的文件夹,另外两个自己创建一下。glibc不允许在自己源码的文件夹下编译。
进入到glibc-2.23_build文件夹,配置编译选项。
1 | ../glibc-2.24/configure '--prefix=/home/keenan/Desktop/glibc-2.24_out' |
然后
1 | make |
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:
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 |
前后的效果:
可以看到用的ld.so是我们自己编译的。
我们用LD_DEBUG来看一下libc的搜索路径:
可以看到用的是我们编译的libc了。
Step3: Debugging
现在我们来实验一下gdb.
gdb打开在main下断点,此时是没有源码的。
我们进入到第二个malloc。可以看到出现了源码。
通过源码行号下断点:例如想在3793下断点:
1 | pwndbg> b /home/keenan/Desktop/glibc-2.23/malloc/malloc.c:3793 |
可以看到成功。
这里是可以用p查看变量值的。
或者通过条件下断点:
1 | break test.c:6 if num>0 |
查看源码:
1 | list |
参考