链接时 库在命令行位置的影响

4 篇文章 0 订阅
1 篇文章 0 订阅

请看下面的Makefile文件
这里写图片描述
这是一个不一定好 但能正常工作的Makefile,但我曾困惑为什么下面的会编译出错
这里写图片描述
上面最本质的变化是库在可重定位文件(即.o文件)之前出现,慢慢的随着知识的对链接时符号解析规则的了解知道了其中的秘密:
在链接开始前,链接器会创建三个空集合E,U,D,其中E表示可重定位文件(.o文件 这个集合中的文件会被合并成可执行文件),U表示引用了但尚未定义的符号(这里的符号指外部变量和函数等),D表示引用并且已定义的符号集合
链接器解析符号算法:
1、对命令行上的每个输入文件f,如果f是目标文件,那么链接器把f添加到E,修改U和D来反映f中的符号定义和引用,并继续下一个输入文件。
2、如果f是一个存档文件,那么链接器就尝试匹配U中未解析的符号和由存档文件成员定义的符号。如果某个存档文件成员m,定义了一个符号来解析U中的一个引用,那么就将m加到E中,并且链接器修改U和D来反映m中的符号定义和引用。对存档文件中所有的成员目标文件都反复进行这个过程,直到U和D不再发生变化。在此时,任何不包含在E中的成员目标文件都简单地被丢弃,而链接器将继续处理下一个输入文件
3、如果当链接器完成对命令行上输入文件的扫描后,U是非空的,那么链接器就会输出一个错误并终止。否则,它会合并和重定位E中的目标文件,从而构建输出的可执行文件。
根据上面的算法,如果定义一个符号的库出现在引用这个符号的目标文件之前,那么引用就不能被解析,链接就宣告失败。这也就解释了库在可重定位文件(即.o文件)之前会出错的原因,因为如果库在可重定位文件之前就和没有库是一样的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值