寻找 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