最后更新2021/10/31
十月最后一天收尾,遥遥无期漫无边际的前路有了可估计的日程。32位加载过程基本搞定,要写一个从头到尾的程序实现一下,忽然发现恐怖的libc shr.o竟然有3000多个依赖symbol !要是都搞一搞,奶油雪糕都凉了。想了一个偷懒的办法,从前往后,首先需要哪个,加载哪个;其次弄个universal的call,都去调用它,然后程序执行的时候输出被谁调用了,尽管程序fail,但是至少留下了遗言,把这个call解决之后再来,终究需要的call都能显示出来。对于小程序,估计十几个,最多几十个重要的调用也就解决了。
先按这个思路继续,11月份看效果。
32位xcoff程序的加载过程框架如下(正统的过程,不涉及到前面提到的偷懒方案):
- filehdr被读取,判断magic,错误则失败返回;
- 继续读auxhdr。据说auxhdr是变长,但未找到任何依据,目前看是定长的,可以和filehdr同时读进来;
- 通过这两个hdr,拿到scnhdr等等相关的信息,加载text段,data段,bss段,读入loader段,继续分析符号重定位信息;
- 先读取import依赖表,看看import依赖的动态链接程序是否已经被加载,如果不是,先加载。也许可以在后续步骤再加载?我觉得无所谓,毕竟整体上是一个load domain,早晚都要用,现在内存很大,不差这么一点;如果要加载动态链接文件,则是重复以上1-4过程&#x