符号和符号解析

从入口函数开始解析

2. 符号解析

(1)符号解析过程

E:将被合并以组成可执行文件的所有目标文件集合
U:当前所有未解析的引用符号的集合
D:当前所有定义符号的集合

① 开始E、U、D为空,首先扫描main.o,把它加入E, 同时把myfun1加入U,main加入D。
② 接着扫描到 mylib.a,将U中所有符号(本例中为myfunc1)与 mylib.a中所有目标模块(myproc1.o和myproc2.o )依次匹配,发现在myproc1.o中定义了myfunc1 ,故myproc1.o加入E,myfunc1从U转移到D。在 myproc1.o中发现还有未解析符号printf,将其加到 U。
③ 不断在mylib.a的各模块上进行迭代以匹配U中的符号,直到U、D都不再变化。
④ 此时U中只有一个未解析符号printf,而D中有main和myfunc1。因为模块 myproc2.o没有被加入E中,因而它被丢弃。
⑤ 接着,扫描默认的库文件libc.a,发现其目标模块printf.o定义了 printf,于是printf也从U移到D,并将 printf.o加入E,同时把它定义的所有符号 加入D,而所有未解析符号加入U。
 处理完libc.a时,U一定是空的。
————————————————
版权声明:本文为CSDN博主「WuDL.」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/baidu_41667019/article/details/84789564

posted @ 2021-06-22 22:45  zzfx  阅读(199)  评论(0编辑  收藏  举报