zoukankan      html  css  js  c++  java
  • 汇编的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.s VectorsHandlers.s Func.c ARM_Vectors第一个向量值
    IMPORT     StackTop  [WEAK]

    0
    IMPORT     StackTop  [WEAK] EXPORT  StackTop VectorsHandlers.s的StackTop地址
    IMPORT     StackTop EXPORT  StackTop              [WEAK] 有同名的StackTop函数 Func.c的StackTop地址
    IMPORT     StackTop EXPORT  StackTop      有同名的StackTop函数 存在两个StackTop,编译出错
    IMPORT     StackTop  [WEAK] EXPORT  StackTop              [WEAK] 0
  • 相关阅读:
    MySQL根据出生日期计算年龄的五种方法比较
    用于测试API并生文档的开发人员工具
    【实例】使用Eolinker工具进行接口测试时传递集合参数的方法
    如何克服API测试中的挑战
    关于API网关(一)性能
    为什么需要监控API
    比Swagger2更好用的自动生成文档工具?对比流程说话!
    如何通过3个步骤执行基本的API测试
    【学习】API接口测试用例编写规则
    微信小程序之蓝牙 BLE 踩坑记录
  • 原文地址:https://www.cnblogs.com/Caden-liu8888/p/7603484.html
Copyright © 2011-2022 走看看