ARM编译器支持的数据类型
************************************************************
数据类型 长度(位) 对齐特性
Char 8 1(字节对齐)
short 16 2(百字对齐)
Int 32 4(字对齐)
Long 32 4(字对齐)
Longlong 64 4(字对齐)
Float 32 4(字对齐)
Double 64 4(字对齐)
Long double 64 4(字对齐)
All pointers 32 4(字对齐)
Bool(C++ only) 32 4(字对齐)
1.整数类型
在ARM体系中,整数类型是以2的补码形式存储的。对于long long类型来说,在little endian内存模式下,其低32位保存在低地址的字单元中,高32为保存在高地址的字单元中;在big endian模式下,其低32位保存在高地址的字单元中,高32为保存在低地址的字单元中。对于整型数据的操作遵守下面的规则:
**任何带符号的整型书的运算是按照二进制的补码进行的。
**带符号的整型数的运算不进行符号的扩展。
**带符号的整型数的右移操作是算数移位。
**定制的移位位数的数是8位的无符号数。
**进行移位操作的数被作为32位数。
**超过31位的逻辑左移的结果为0。
**对于无符号数和有符号的正数来说,超过32位的右移操作结果为0;对于有符号的负数来说,超过32位的右移操作结果为-1。
**整数除法运算的余数和除数有相同的符号。
**当把一个整数截断成位数更短的整数类型的数时,并不能确保所得到的结果的最高位的符号位的正确性。
**整型数据之间的类型转换不会产生异常中断。
**整型数据的溢出不会产生异常中断。
**整型数据除以0将会产生异常中断。
2.浮点数
在ARM体系中,浮点数是按照IEEE标准存储的。
**float类型的数是按照IEEE的单精度数表示的。
**double和long double 是用IEEE的双精度数表示的。
对于浮点数的操作遵守下面的规则:
**遵守正常的IEEE754规则。
**当默认情况下禁止浮点数运算异常中断。
**当发生卷绕时,用最接近的数据来表示。
3.指针类型的数据
下面的规则适用于处数据成员指针以外的其他指针:
**NULL被定义为0。
**相邻的两个存储单元地址相差一。
**在指向函数的指针和指向数据的指针进行数据转换时,编译器将会产生警告信息。
**类型size_t被定义为unsigned int.
**类型ptrdiff_t被定义为signed int。
**两个指针类型的数据相减时,结果能够按照下面的公式得到。
((int)a-(int)b)/(int)sizeof(type pointed to)
这时,只要指针所指的对象不是pack的,其对齐特性能够满足整除的需要。
ARM编译器中预定义的宏
*****************************************************
ARM编译器预定义了一些宏,这些预定义宏对应一定的数值,有些预定义宏没有对应数值,见下表:
_arm _ 使用编译器armcc,tcc,armcpp,tcpp时
_ARMCC_VERSION Ver 代表编译器版本号,其格式为:
PVtbbb,其中:
P为产品编号(1代表ADS)
V为副版本号(1代表1.1)
T为补丁版本号(0代表1.1)
bbb为build号(比如650)
_APCS_INTERWORK _ 使用编译选项-apcs/interwork时
_APCS_ROPI _ 使用编译选项apcs/ropi时
_RWPI _ 使用编译选项-apcs/rwpi时
_APCS_SWST _ 使用编译选项-apcs/swst时
_BIG_ENDIAN _ 编译器针对目标系统使用big-endian内存模式时
_cplusplus _ 编译器工作和C++模式时
_CC_ARM _ 返回编译器的名称
_DATE_ date 编译源文档的日期
_embedded_cplusplus 编译器工作于EC++模式时
_FEATURE_SINGED_CHAE 使用编译配置选项-zc时配置该预定义宏
_FILE_ name 包含全路径的当前被编译的源文档名称
_func_ name 当前被编译的函数名称
_LINE_ num 当前被编译的代码行号名称
_MOUDLE_ mod 预定义宏_FILE_的文档名称部分
_OPTIMISE_SPACE _ 使用编译选项-OSPACE时
_OPTIMISE_TIME _ 使用编译选项-Otime时
_pretty_func name unmangled的当前函数名称
_sizeof_int 4 sizeof(int),在预处理表达式中能够使用
_sizeof_long 4 sizeof(long),在预处理表达式中能够使用
_sizeof_ptr 4 sizeof(void*)在预处理表达式中能够使用
_SOFTFP _ 编译时使用浮点数
_ _ 在各种编译器模式下
_STDC_VERSION _ 标准的版本信息
_STRICT_ANSI_ _ 使用编译选项-STRICT时
_TARGET_ARCH_xx _ xx代表ARM体系编号
_TARGET_CPU_xx _ xx代表CPU编号
_TARGET_FEATURE_ 当ARM体系支持指令PLD,LDRD,STRD,MCRR,MRRC时
DOUBLEWORD _ 配置该定义宏
_TARGET_FEATURE_ 当系统中包含DSP乘法处理器时,配置该
DSPMUL _ 预定义宏
_TARGET_FEATURE_ 假如目标ARM体系支持半字访问连同有符号的字节数据
HALFWORD _ ,配置该预定义宏
_TARGET_FEATURE_ 假如目标ARM体系支持长乘法指令MULL和
MULTIPLY _ MUAL,配置该预定义宏
_TARGET_FEATURE_ 假如目标ARM体系支持THUMB指令
THUMB _
_TARGET_FPU_xx _ 表示FPU选项,可能取值如下所示:
_TARGET_FPU_VFP
_TARGET_FPU_FPA
_TARGET_FPU_SOFTVFP
_TARGET_FPU_SOFTVFP_VFP
_TARGET_FPU_SOFTFPA
_TARGET_FPU_NONE
_thumb _ 编译器为tcc或tcpp时,配置该预定义宏
_TIME 源文档编译时间
ARM映像文档
*****************************************************
1.ELF格式文档的结构
1.1映像文档组成部分
**一个映像文档有一个或多个域组成
**每个域包含一个或多个输出段
**每个输出段包含一个或多个输入段
**各输入段中包含了目标文档中的代码和数据
输入段中包含了四类内容:代码、已初始化的数据、未经初始化的存储区域、内容初始化成0的存储区域。每个输入段有相应的属性,能够为只读的(RO)、可读写的(RW)连同初始化成0的(ZI)。ARM连接器根据个输入段的属性将这些输入段分组,再组成不同的输出段及域。
一个输出段中包含了一系列的具备相同的RO、RW和ZI属性的输入段。输出段的属性和其中包含的输入段的属性相同。在一个输出段的内部,各输入段是按照一定的规则排序的,这将在1.3节油周详地介绍。
一个域中包含1-3个输出段,其中个输出段的属性各不相同。各输出段的排列顺序是由其属性决定的。其中RO属性的输出段排在最前面,其次是RW属性的输出段,最后是ZI属性的输出段。一个域通常映射到一个物理存储器上,如ROM或RAM。
1.2ARM映像文档各组成部分的地址影射
ARM映像文档各组成部分在存储系统中的地址有两种:一种是映像文档位于存储器中时(也就是该映像文档运行之前)的地址,称之为加载地址;一种是映像文档运行时的地址,称之为运行时地址。之所以有这两种地址,是因为映像文档在运行时,其中的有些域是能够移动的新的存储区域。比如,已初始化的RW属性的数据所在的段运行之前可能保存系统的ROM中,在运行时,他被移动至RAM中。
通常,一个映像文档包含若干个域,各域又包含若干的输出段。ARM连接器需要知道如下的信息,已决定怎样生成相应的映像文档。
**分组信息 决定怎样将个输入段组织成相应的输出段和域。
**定位信息 决定个域在存储空间地址中的起始地址。
根据映像文档中地址映射的复杂程度,有两种方法来告诉arm连接器这些相关信息。对于映像文档中地址映射关系比较简单的情况,能够使用命令行选项;对于映像文档中地址映射关系比较复杂的情况,能够使用一个配置文档。
2.arm映像文档的入口点
2.1arm映像文档的入口点有两种类型:一种是映像文档运行时的入口点,称为初始入口点(initial entry point),另一种是普通入口点(entry point).
初始入口点是映像文档运行时的入口点,每个映像文档只有一个唯一的初始入口点,他保存在ELF头文档中。假如映像文档是被操作系统加载的,操作系统是通过跳转到该初始入口点处来加载该映像文档。
普通的入口点是在汇编中用ENTRY伪操作定义。他通常用于标志该段代码是通过异常中断处理程式进入的。这样连接器删除无用的段时不会将该段代码删除。一个映像文档中能够定义多个普通入口点。
应该注意的是,初始入口点能够使普通入口点,但也能够不是普通入口点。
2.2定义初始入口点
初始入口点必须满足下面两个条件:
**初始入口点必须位于映像文档的运行时域内。
**饱含初始入口点的运行时域不能被覆盖,他的加载地址和运行地址必须是相同的。
能够使用连接选项-entry address来指定映像文档的初始入口点。这时,address指定了映像文档的初始入口点的地址值。
对于地址0x0处为rom的嵌入式应用系统,能够使用-entry 0x0来指定映像文档的初始入口点。这样当系统复位后,自动跳转到该入口开始执行。
假如映像文档是被一个加载器加载的,该映像文档该映像文档必须包含一个初始化入口点。这种映像文档通常还包含了其他普通入口点,这些普通入口点一般为异常中断处理程式的入口地址。
当用户没有指定-entry address时,连接器根据下面的规则决定映像文档的初始入口点。
**假如输入的目标文档中只有一个普通入口点,该普通入口点被连接器当成映像文档的初始入口点。
**假如输入的目标文档中没有一个普通入口点,或其中的普通入口点多于一个,则连接器生成的映像文档中不包含初始入口点,并产生警告信息。
2.3普通入口点的用法
普通入口点是在汇编中用ENTRY 伪操作定义。在嵌入式应用中,各异常中断的处理程式入口使用普通入口点标示。这样连接器在删除无用段时不会将该段代码删除。
一个映像文档中能够定义多个普通入口点。没有指定连接选项-entry addres时,假如输入的目标文档中只有一个普通入口点,该入口点被连接器当成映像文档的初始入口点。
ARM映像文档??2
*****************************************************
3输入段的排序规则
连接器根据输入段的属性来组织这些输入段,具备相同属性的输入段被放到域中一段连续的空间中,组成一个输出段。在一个输出段中,各输入段的起始地址和
输出段的起始地址和该输出段中个输入段的排列顺序有关。
通常情况下,一个输出段中个输入段的排列顺序由下面几个因素决定的。用户能够通过连接选项-first和-last来改变这些规则。
**输入段的属性。
**输入段的名称
**各输入段在连接命令行的输入段列表中的排列顺序
按照输入段的属性,其排列顺序如下所示:
**只读的代码段
**只读的数据段
**可读写的代码段
**其他已初始化的数据段
**未出世化的数据
对于具备相同属性的输入段,按照其名称来排序。这是输入段名称是区分大小写的,按照其ASCII码顺序进行排序。
对于具备相同属性和名城的输入段,按照其在输入段列表中的顺序进行排序。也就是说,几十个输入段的属性和名称保持不变,假如其在编译时,各输入段在输
入段列表中的排列顺序不同,生成的映像文档也将不同。
能够通过连接选项-first和-last来改变这些规则。假如连接时使用了配置文档,能够在配置文档中通过伪属性FIRST和LAST达到相同的效果。
连接选项-first和-last不能改变根据输入段进行排序的规则,他只能改变根据输入段名称和其在输入列表中的顺序的排序规则。也就是说,假如使用-first指定
一个输入段,只有该输入段所在的输出段位于运行时域的开始位置时,该输入段才能位于整个运行时域的开始位置。
各个输入段排好顺序后,在确定各个输入段的起始地址之前,何以通过填充补丁是个输入段满足地址对齐的需要。
***********************************************************
ARM连接器armlink将编译得到的ELF格式文档连同相关的C/C++运行时库连接生成相应的结果文档。armlink能够完成下面的操作:
**连接编译后得到的目标文档相应的c/c++运行时库,生成可执行的影像文档。
**将一些目标文档进行连接,生成一个新的目标文档,供将来进一步连接时使用,这成为部分连接。
**指定代码和数据在内存中的位置。
**生成被连接文档的调试信息和相互间的引用信息。
Armlink在进行部分连接和完全生成可执行文档时作进行的操作是不同的。下面分别介绍:
(1)解析输入的目标文档之间的符号引用关系。
(2)根据输入目标文档对c/c++函数的调用关系,从c/c++运行时库中提取相应模块。
(3)将各个输入段排序,组成相应的输出段。
(4)删除重复的调试信息。
(5)根据用户指定的分组和定位信息,建立映像文档的地址映射关系。
(6)重定位需要重定位的值。
(7)生成可执行的映像文档。
armlink在进行部分连接生成新的目标文档时执行下面的操作。
(1)删除重复的调试信息
(2)最小化符号表的大小
(3)保留那些未被解析的符号
(4)生成新的目标文档
下面根据各armlink的命令行选项的功能分类列举了armlink的命令行选项,各选项的具体用法将在后面有周详地介绍。
**提供关于armlink的帮助信息
**指定输出文档的名称和类型:*-output;*-partial;*-elf
**使用选项文档,其中能够包含一些连接选项。
**定制可执行映像文档的内存映射关系。*-rwpi;*-ropi;*-rw_base;*-ro_base;*-spit;*-scatter
**控制可执行映射文档的内容。*-first;*-last
**生成和映像文档的相关信息
**控制armlink生成相关的诊断信息。
文章评论(0条评论)
登录后参与讨论