Specifying output format
默认情况下,源文件被编译并链接到可执行映像中。利用这些选项,可指导编译程序从C或C++源文件创建未链接的目标文件、汇编语言文件或列表文件。
-asm
将编译程序产生的汇编语言列表写入文件。如果不使用-c选项,生成目标代码。如果和-fs使用,用汇编列表交叉存取源文件,并且源文件输出到.txt文件。
§ -asm
inputname.s用于结果列表
§ -asm –fs 因为不可用将交叉存取代码输入汇编程序,所以使用inputname.txt来保存交叉存取代码。
§ -asm –c –o newname.ext
有两个输出文件(通常newname.o用于目标代码,newname.s用于汇编)。如果.ext不是.s或.o,则newname.exe是目标文件的名称,newname.s则是列表文件的名称
§ -asm –fs –c –o newname.ext 同-asm –c –o newname.ext作用相同,区别在于列表文件具有交叉存取源代码和.txt扩展名。
-c
只编译程序不执行链接阶段。编译程序编译源程序,并将目标文件写入当前目录或由-o file指定的文件
-list
使用基于输入文件名的名称在文件中生成原始列表信息。该信息通常用于生成已格式化的列表。原始列表信息包含原始源语句行、包含文件转入转出信息及编译程序生成的诊断信息。其使用options包含-fi、-fj和-fu。
-o file
命名保存编译的最终输出的文件
-MD
该选项编译源代码并将makefile依赖行写入文件。
-depend filename
将依赖行的输出文件指定到filename
-S 将编译程序产生的汇编语言列表写入文件,与-asm不同,该编译选项并不进行编译输出目标文件
指定目标处理器或体系结构
The options describe in this section specify the target processor or architecture attributes for a compile.利用这些选项可指定编译的目标处理器或体系结构属性。默认情况下,-cpu指定是-cpu ARM7TDMI。
-cpu name: This option generates code for a specific ARM processor or architecture
其中name可以为:
3、3M、4、4xM、4T、4TxM、5T、5TE、5TEJ
-fpu name : This option selects the target Floating-Point Unit(FPU) architecture.
该选项的值可为:
none、vfp、vfpv1、vfpv2、fpa、softvfp+vfp、softvfp+vfpv2、softvfp和softfpa
Generating debug information
利用这些选项可指定是否为当前编译生成调试表
-g
该选项启用生成当前编译的调试表。无论是否使用-g,编译程序生成相同的代码,不同之处在于调试表的存在与否。由-o指定调试代码的优化选项,默认情况下,-g选项自身等价于-g –dwarf2 –o0 –gt+p
-gt+p 该选项与-g一起使用,该选项启动生成预处理程序宏定义的调试表条目
Controlling code generation
Option
|
Desc
|
-Onumber
|
指定优化级别。优化级别可为:
-o0
关闭所有优化,除去一些简单的源转换。如果使用
-g
生成调试表,此为默认优化级别。它给出最佳可能调试视图和优化的最低级别
-o1
关闭严重影响调试视图的优化。如果和
-g
一起使用,该选项给出良好合适代码密度的满意调试试图
-o2
生成充分优化代码。如果与
-g
一起使用,调试视图可能不令人满意,因为目标代码和源代码的映射有时不清晰。
|
-ospace
|
指示编译程序执行优化,以可能延长执行时间为代价减少映像大小。例如,由外部函数而非内联代码执行大的结构副本。若代码大小比性能更重要,则使用该选项,这是默认设置
|
-otime
|
指示编译程序执行优化,以可能增大映像大小为代价缩短执行时间。不能同时使用
-ospace
和
-otime
。
|
-Ono_inline
|
禁止使用函数的内联。该选项可帮助调试内联函数
|
-Oinline
|
启用编译内联函数程序。此时
inline
叫限定符;而
C
中的
__inline
,
C
和
C++
中的
_forceinline
和
inline
则叫关键字。
|
-Ono_autoline
|
禁用自动内联,这是
-o1
和
-o0
的默认设置
|
-Oautoinline
|
启用自动内联,
-o2
默认打开自动内联
|
-split_ldm
|
指示编译程序在所需要位置将
LDM
和
STM
指令分裂为两个或更多的
LDM
或
STM
指令,以减少传送寄存器的最大数量
|
控制代码和数据段
| |
-zo
|
该选项为源文件中的每个函数生成一个
ELF
段。使用与生成段的函数相同的名称命名输出段。例如
int f(int x) {return x + 1;}
|
|
使用
-zo
编译给出:
AREA ||i.f||, CODE, READONLY
f PROC
ADD r0, r0, #1
MOV pc, lr
该选项减少了函数之间共享地址、数据和字符串文字的可能性。可以通过
armlink –remove
允许链接程序时删除不用的函数。
配合该选项,可以使用分散加载描述文件将一些函数放在快速存储器中,其余函数放在慢速存储器中
|
-littleend
|
该选项使用小端存储器生成用于
ARM
处理器的代码。在小端存储器中,字的最低位字节具有最低地址。这是默认设置
|
-bigend
|
该选项使用大端存储器生成
ARM
处理器代码。
|
Setting alignment options
| |
-memaccess option
|
向编译程序指定目标系统中的存储器稍微具有受限制的或扩展的能力
|
-fy
|
强制所有枚举类型为整型存储。不要常用该选项,因与
ISO
不兼容
|
-zc
|
使
char
类型带有符号。该选项不要常用,
ISO
兼容源不要求该选项
|
ARM编译程序参考
介绍ARM编译程序的ARM特有方面,包括:
Pragmas
编译指示
Function keywords
函数关键字
Variable declaration keywords 变量声明关键字
Pragmas
ARM编译程序可识别一下格式的编译指示:
#pragma [no_] feature-name
编译指示优于相关的命令行选项。
能识别的编译选项如下:
Pragma name
|
Default
|
Reference
|
arm section
|
Off
|
Pragmas controlling code generation
|
check_printf_formats
|
Off
|
Pragmas controlling printf and scanf argument checking
|
check_scanf_formats
|
Off
|
Pragmas controlling printf and scanf argument checking
|
check_stack
|
On
|
Pragmas controlling code generation
|
debug
|
On
|
Pragmas controlling debugging
|
import
|
|
code generation
|
Ospace
|
|
optimization
|
Otime
|
|
optimization
|
Onum
|
|
optimization
|
softfp_linkage
|
Off
|
code generation
|
- check_printf_formats
该编译指示标记类似于printf的函数,如果存在文字格式串,则对照进行类型检查。
#pragma check_printf_formats
extern void myprintf(const char *format, …);
#pragma no_check_printf_formats
- check_scanf_formats
该编译指示对声明为类似于scanf的函数做标记,以便对照文字格式串检查自变量的格式。
#pragma check_scanf_formats
extern void myformat(const char *format, …);
#pragma no_check_scanf_formats
- debug 该编译指示可打开或关闭调试表生成, 如果指定#pragma no_debug,则不会为随后的声明和函数生成调试信息表条目,直到下一个#pragma debug出现。
- Pragmas controlling optimization
Ospace
Otime
Onum
- Pragmas controlling code generation
- check_stack 如果已经使用了#pragma no_check_stack和-apcs/swst命令行选项禁止栈检查,则该编译指示可使的检查是否违反了栈限制的函数入口代码的重新生成。
- once 同#ifndef …#endif效果相类似,用于头文件。但一般推荐使用#ifndef…#define。
- softfp_linkage 该编译指示指定了至下一个#pragma no_softfp_linkage之间的所有函数声明描述了使用软件浮点链接的函数。__softfp关键字与该编译指示的效果相同
- import(symbol_name) 该编译指示生成对symbol_name的导入引用。同如下汇编语言相同:IMPORT symbol_name。符号名作为外部符号放在映像的符号表中。
- arm section section_sort_list This pragma specifies the code or data section name that used for subsequent function or objects.This include definitions of anonymous objects the compiler creates for initializations.该编译指示可指定代码或数据段的名称用于随后的函数或对象。包括编译程序为初始化而创建的匿名对象的定义。该选项对一下情况没有影响:
内联函数(及其局部静态变量)
模板实例(及其局部静态变量)
消除未使用的变量和函数
将定义写入目标文件中的顺序
该编译指示完整语法为:
#pragma arm section [sort_type[[=]“name”]][,sort_type=
“name”]
此处name用于段名称,sort_type可为如下之一code, rwdata, rodata
和zidata。若指定sort_type,没有指定name,则sort_type的段名被
重新设置为默认值。单独输入#pragma arm section,则所以对象段的
恢复为其默认值
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
int y1[ 100 ]; // in .bss (default)
int const z1[ 3 ] = {1,2,3} ; // in .constdata (default)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
int const z2[ 3 ] = {1,2,3} ; // in bar
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
int const z3[ 3 ] = {1,2,3} ; // in .constdata
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
{
return x+1;
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
使用分散加载描述文件和链接程序,以控制将命名段放置在存储器中
的特定地址。
· Function keywords
一些关键字指示编译程序对其某个函数进行特殊处理。包括函数内的声明,函数限定符及函数存储类限定符。即Declarations inside function, Function qualifiers and Function storage.
__asm{assembler-code} 指示编译程序该语句是用汇编语言编写的。
__irq
This enables a C or C++ function to be used as an interrupt routine called by the IRQ, or FIQ vectors. All corrupted registers except floating-point registers are preserved, not only those that are normally preserved under the ATPCS. The default ATPCS mode must be used. The function exits by setting the pc to lr-4 and the CPSR to the value in SPSR. It is not available in tcc or tcpp. No arguments or return values can be used with __irq functions.
__pure
指明函数声明为纯的。纯函数没有了公共子表达式。默认情况下,函数假定是不纯的(产生副作用)。纯函数需要满足:其结果仅取决于其自变量的值;没有副作用,其不能调用非纯函数。不能使用全局变量或废弃指针,同一参数两次调用纯函数,返回应该相同。