一般来说,这个关键字使用在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

汇编的WEAK关键字的更多相关文章

  1. 灵活使用ARM汇编的WEAK关键字

    //=====================================================================//TITLE://    灵活使用ARM汇编的WEAK关 ...

  2. iOS深入学习之Weak关键字介绍

    iOS深入学习之Weak关键字介绍 前言 从大二的开始接触OC就用到了weak属性修饰词,但是当时只是知道如何去用这个关键字:防止循环引用.根本没有深入地去了解它. 在刚来北京的时候面试过程中也常常考 ...

  3. 什么情况使用 weak 关键字,相比 assign 有什么不同?

    什么情况使用 weak 关键字? 在 ARC 中,在有可能出现循环引用的时候,往往要通过让其中一端使用 weak 来解决,比如: delegate 代理属性 自身已经对它进行一次强引用,没有必要再强引 ...

  4. static关键字 weak关键字

    1.static关键字 static HAL_StatusTypeDef UART_Receive_IT(UART_HandleTypeDef *huart){ ...} 在函数前面加了一个stati ...

  5. Objective-C中copy 、retain以及ARC中新加入的strong、weak关键字的含义

    copy: 创建一个引用计数为1的对象,然后释放旧的对象 retain:释放旧的对象,将旧对象的值赋予输入对象,再提高输入对象的引用计数为 1 Copy其实是建立了一个相同的对象,而retain不是: ...

  6. KEA128单片机启动代码分析

    ;/*****************************************************************************; * @file: startup_SK ...

  7. 何时使用copy,strong,weak,assign关键字 定义属性

    现在我们看看iOS5中新的关键字strong, weak, unsafe_unretained. 可以与以前的关键字对应学习strong与retain类似,weak与unsafe_unretained ...

  8. ARC声明属性关键字详解(strong,weak,unsafe_unretained,copy)

    ARC声明属性关键字详解(strong,weak,unsafe_unretained,copy) 在iOS开发过程中,属性的定义往往与retain, assign, copy有关,我想大家都很熟悉了, ...

  9. assign、copy 、retain等关键字的含义

    assign: 简单赋值,不更改索引计数copy: 建立一个索引计数为1的对象,然后释放旧对象retain:释放旧的对象,将旧对象的值赋予输入对象,再提高输入对象的索引计数为1Copy其实是建立了一个 ...

随机推荐

  1. C++ 运算符重载一(二元运算符重载)

    //二元运算符重载 #include<iostream> using namespace std; class Point { public: Point(int x,int y){ th ...

  2. 京东阅读PDF导出

    适用平台:windows 需要软件:FastStone Capture(截图软件),TinyTask(操作录制软件) 1.打开京东阅读 2.设置截图软件 (1)设置截图区域(FastStone Cap ...

  3. Differential Geometry之第七章曲面的若干整体性质

    1.曲面的整体描述 2.整体的Gauss-Bonnet公式 2.1.曲面的三角剖分 2.2.Gauss-Bonnet公式 = 2.3.Gauss-Bonnet定理的应用 2.3.1.切向量场的指数定理 ...

  4. php -- PDO事务处理

    事务处理流程 开启事务 PDO::beginTransaction 事务操作 所有的实务操作就是增删改 事务提交 PDO::commit:成功后提交数据 PDO::rollback:失败后回滚数据 & ...

  5. 转载:Python十分钟入门

    Python十分钟入门:http://python.jobbole.com/23425/

  6. 用户控件(ASCX)向网页(ASPX)传值使用反射实现

    用户控件向网页传递值,方法非常之多,此博文尝试使用反射来实现.在站点中,建一个网页以及一个用户控件. 网页切换至设计模式,拉用户控件至网页上. Default.aspx: <%@ Page La ...

  7. python3----练习题(....)

    # 保存文件(文本,图片,视频...) 1 def save_file(): url = 'http://css.8684.cn/citys/images/line/45.jpg' root = r' ...

  8. ios开发之 -- 5分钟集成融云的客服功能

    最近项目中遇到了客服的功能,首先想到的就是使用融云的功能,因为以前做的即时通讯的项目,用的都是融云的sdk,花了点时间研究了下,希望能帮到大家! 废话不多说,步骤如下: 一.申请融云账号 二.创建应用 ...

  9. Objective-C内存管理基础

    2011-05-11 15:45 朱祁林 http://zhuqil.cnblogs.com 字号:T | T 本文我们将介绍<Objective-C内存管理基础>,在iOS开发中,内存管 ...

  10. LeetCode-Water and Jug Problem

    You are given two jugs with capacities x and y litres. There is an infinite amount of water supply a ...