汇编的WEAK关键字

一般来说,这个关键字使用在IMPORT和EXPORT这两个声明段。

////
//VectorsTrampolines.s
////
IMPORT     StackTop [WEAK]

 AREA |.text|, CODE, READONLY 
;Vector list
ARM_Vectors
   DCD     StackTop

 IMORT:   如果我们有一个名为ARM_Vectors的量表,向量表的第一个数值指向一个StackTop函数的地址。因为我们可能定义了该函数,也可能没有,为了代码的简便,我们可以使用WEAK关键字。

当我们定义了StackTop函数后,那么ARM_Vectors里第一个向量值就是StackTop函数的地址。如果没有定义StackTop,那么编译器不会报错,而这时候第一个向量值就直接赋予0。

EXPORT:EXPORT的函数带有WEAK标志的话,并且别的源代码没有定义同名函数,那么连接时就是该函数;否则,就是另外的一个同名函数(类似类的继承)

eg:

////
//VectorsTrampolines.s
////
 IMPORT     StackTop 
 AREA |.text|, CODE, READONLY 
;Vector list
ARM_Vectors
   DCD     StackTop


////
//VectorsHandlers.s
////
EXPORT  StackTop               [WEAK]
 AREA    |i.DefaultHandler|, CODE, READONLY
StackTop     PROC                
                B       .
                ENDP

////
//Func.c
////
Extern “C” StackTop()
{}

    因为VectorsHandlers.s的StackTop是用WEAK导出的,而Func.c又有同名的函数,那么这时候VectorsTrampolines.s里的StackTop是连接Func.c里定义的StackTop。

 

很有意思的问题,如果EXPORT和IMPORT都用WEAK声明,如:

////
//VectorsTrampolines.s
////
 IMPORT     StackTop  [WEAK]
 AREA |.text|, CODE, READONLY 
;Vector list
ARM_Vectors
   DCD     StackTop


////
//VectorsHandlers.s
////
EXPORT  StackTop               [WEAK]
 AREA    |i.DefaultHandler|, CODE, READONLY
StackTop     PROC                
                B       .
                ENDP

 这时候VectorsTrampolines.s里的ARM_Vectors的第一个向量值是什么呢?还是VectorsHandlers.s里的StackTop函数地址么?很遗憾,不是,而直接是0!所以这点就注意了,最好不要对同名的函数在IMPORT和EXPORT时都使用WEAK,否则结果很可能让你抓狂!

总结:

Vectors Trampolines.sVectorsHandlers.sFunc.cARM_Vectors第一个向量值
IMPORT     StackTop  [WEAK]

0
IMPORT     StackTop  [WEAK]EXPORT  StackTopVectorsHandlers.s的StackTop地址
IMPORT     StackTopEXPORT  StackTop              [WEAK]有同名的StackTop函数Func.c的StackTop地址
IMPORT     StackTopEXPORT  StackTop     有同名的StackTop函数存在两个StackTop,编译出错
IMPORT     StackTop  [WEAK]EXPORT  StackTop              [WEAK]0

转载于:https://www.cnblogs.com/Caden-liu8888/p/7603484.html

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值