编译

首先肯定是要下载glibc源码,可以去官网,国内也可以去清华镜像下载。

编译的时候要带有调试信息,并选择合适的输出目录。大概需要10min。

1
2
3
4
5
6
mkdir build
cd build
echo "CFLAGS += -fno-stack-protector" > configparms
../configure CFLAGS="-O1 -g3 -ggdb" CXXFLAGS="-O1 -g3 -ggdb" --disable-werror --prefix=/home/richar/glibc/lib --enable-cet
make
make install

生成用于调试的程序

对于一般的elf执行文件,肯定是默认到系统目录去找libc。有两种方式可以自己指定链接的libc位置,一种是在编译的时候加上选项,但这只能用于自己编译的程序。

1
gcc -g3 -ggdb -o hello hello.c -Wl,-rpath=/home/richar/glibc/lib/lib -Wl,--dynamic-linker=/home/richar/glibc/lib/lib/ld-2.32.so

另一种是用patchelf修改程序的链接位置这种更加灵活

1
patchelf --set-interpreter /home/richar/glibc/lib/lib/ld-2.32.so  --set-rpath /home/richar/glibc/lib/lib [执行文件]

调试

调试时就可以看到libc源码了。如图

debug

LibcSearch&libc-database

由于LibcSearch自带的libc-database版本太老,所以直接把github上最新的libc-database下载下来,LibcSearch里的libc-database目录直接替换成软链接这样就可以方便的更新libc库了。命令如下

1
2
rm -rf LibcSearch/libc-database
ln -s libc-database LibcSearch/

然后把自己编译的libc库添加进libc-database

1
libc-database/add glibc/lib/lib/libc-2.32.so

完工!

参考文章

  1. 源码级调试glibc - astrotycoon
  2. 使用题目给定的libc动态调试 - HAPPYers