寻找 glibc ld.so 的 _start 入口源码


上一篇 https://www.cnblogs.com/zhangzhiwei122/p/15811422.html  讲到,应用程序进入用户层的第一条指令是其 interpreter 的 入口指令。

这儿  https://www.cnblogs.com/zhangzhiwei122/p/15815472.html 也 自己编译了glibc ,使用新编译的 ld-2.31.so 看到其入口函数也是 _start

从源码分析一下,ld-2.31.so 入口_start的代码 来源

1.1 make --debug=b 保存build.log

zhiwei@LAPTOP-ZHIWEI:~/work/c/glibc/glibc-2.31/build$ make –debug=b  | tee build.log

得到了build.log

1.2 build.log 中查找 ld.so

搜索 关键字 ld.so 得到如上图

1、gcc 编译生成了 ld.so.new

2、重命名ld.so.new 为 ld.so

1.3 ld.so.new 的组成文件

 全部来自 librtld.os

来自 dl-allobjs.os 和 rtld-libc.a

有一个 librtld.os.map 文件,我们从里面找 _start 符号

1.4 从dl-allobjs.os 中找 _start

dl-allobjs.os 是elf 文件夹下面所有 os 的组成

这儿不好找是从 哪个 os 总引入的。就笨办法,一个个的尝试。

objdump -t rtld.os | grep _start

运气比较好,第一个就找到了。

1.5 rtld.os  对应rtld.c

没直接找到 _start ,找到和 start 相关的,RTLD_START 宏 ,并指明这个宏应该在 sysdeps 下面的头文件中定义

1.6 从 sysdeps/x86_64/dl-machine.h 中找到

zhiwei@LAPTOP-ZHIWEI:~/work/c/glibc/glibc-2.31/elf$ vim ../sysdeps/x86_64/dl-machine.h