随想录(libc.so和ld.so调试)

时间:2022-11-23 10:54:39


【 声明:版权所有,欢迎转载,请勿用于商业用途。

    有时候看glibc一头雾水,那么多macro,也不知道哪些代码讲了什么,也不知道哪些编译了,哪些没有编译,所以总想找个机会看看glibc里面做了什么。可是调试glibc稍微有点麻烦,下面时我个人的一些经验,供大家参考。

 

1、hello_world依赖哪些文件

通常hello_world要想运行起来,除了依赖它自己之外,还需要ld.so和libc.so

 

2、glibc如何下载编译

可以找一个和你os差不多版本的glibc,直接从https://www.gnu.org/software/libc/下载

./configure 之后直接make就可以了

 

3、如何调试libc和ld

a,静态编译,再调试,此时就没有ld和libc了

gcc hello_world.c -g -o hello_world -static
gdb ./hello_world

 

b,利用LD_PRELOAD的方法进行调试,先运行起来,再用gdb attach过去

LD_PRELOAD=/lib/x86_64-linux-gnu/libc-2.19.so ./hello_world

 

c,直接用ld.so运行执行文件来调试

 

gdb /lib/x86_64-linux-gnu/ld-2.19.so
set args ./hello
b _start
b dl_main
r

 

ps:

    ld.so中的信息加载都是通过bootstrap完成的,数据来源有这么几个途径:

1、通过system call向os要数据

2、读取静态文件,获取数据

3、读取链接文件中的变量来获取(这部分变量应该是编译器、连接器提供的)

4、本地函数编译的时候获取数据,这些主要是静态数据

 

参考:

​​javascript:void(0)​​