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
  • 相关阅读:
    在 Eclipse Workbench 之外使用 Eclipse GUI
    GB2312,GBK,Unicode
    木偶一之推荐系统
    Matlab:任意矩阵计算分布密度(海明距离的分布密度)
    live555在arm linux下的交叉编译,并下载的Arm板播放H264文件
    java设计模式之原型模式
    HDU 1102
    poj3661另一种做法(滚动数组)
    基于QT的小游戏细菌病毒战
    某代码查看器的保护突破
  • 原文地址:https://www.cnblogs.com/Caden-liu8888/p/7603484.html
Copyright © 2011-2022 走看看