• 汇编的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
  • 相关阅读:
    asp.net core3.1修改代码以支持windows服务发布
    .NET Core3.1IFreeSql使用FreeSql.Generator自动生成实体类
    西南大学2021年秋《线性代数》参考答案
    西南大学2021年秋形势与政策2 阶段一参考答案
    送给程序员的礼物
    西南大学2021年秋形势与政策2 阶段三参考答案
    拿 M 奖真的那么难吗?这份美赛攻略请收下!
    前端开发必会实战项目,Vue Router 实战来啦!​​
    你喜欢哪款 Linux 桌面?萝莉风?御姐风?
    Python 挑战,你通关了吗?速来看题解!
  • 原文地址:https://www.cnblogs.com/Caden-liu8888/p/7603484.html
Copyright © 2020-2023  润新知