ARM-GCC编译选项解释

ARM-GCC选项

-mabi=name
为指定的ABI生成代码。允许值为:‘apcs-gnu’, ‘atpcs’, ‘aapcs’, ‘aapcs-linux’ 和 ‘iwmmxt’

-mapcs-frame
为所有功能生成符合ARM过程调用标准的堆栈框架,即使这对于正确执行代码不是绝对必要的。指定-fomit-frame-pointer 如果使用此选项,则不会为叶函数生成堆栈帧。默认是-mno-apcs-frame。不建议使用此选项。

-mapcs
这是和 -mapcs-frame选项一样, 并已弃用。

-mthumb-interwork
生成支持在ARM和Thumb指令集之间调用的代码。如果没有此选项,则在v5之前的体系结构上,两个指令集不能在一个程序中可靠地使用。默认是-mno-thumb-interwork,因为当 -mthumb-互通已指定。在AAPCS配置中,此选项没有意义。

-mno-sched-prolog
防止对函数序言中的指令进行重新排序,或防止将这些指令与函数主体中的指令合并。这意味着所有功能都以一组可识别的指令开始(或者实际上是从一小组不同的功能序言中选择的一个),并且该信息可用于在可执行代码段中定位功能的开始。默认是-msched-序言。

-mfloat-abi=name
指定要使用的浮点ABI。允许值为:‘soft’, ‘softfp’ 和 ‘hard’

指定“soft’使GCC生成包含浮点操作库调用的输出。'softfp’允许使用硬件浮点指令生成代码,但仍使用软浮点调用约定。'hard’允许生成浮点指令并使用FPU特定的调用约定。

默认值取决于特定的目标配置。请注意,硬浮动和软浮动ABI不兼容。您必须使用相同的ABI编译整个程序,并链接一组兼容的库。

-mlittle-endian
为以little-endian模式下运行的处理器生成代码。这是所有标准配置的默认设置(小端)。

-mbig-endian
为以big-endian模式下运行的处理器生成代码;默认是为低端字节序处理器编译代码(大端)。

-march=name
这指定了目标ARM体系结构的名称。GCC使用此名称来确定在生成汇编代码时它可以发出哪种指令。此选项可与或结合使用-mcpu =选项。允许的名称为:‘armv2’, ‘armv2a’, ‘armv3’, ‘armv3m’, ‘armv4’, ‘armv4t’, ‘armv5’, ‘armv5e’, ‘armv5t’, ‘armv5te’, ‘armv6’, ‘armv6-m’, ‘armv6j’, ‘armv6k’, ‘armv6kz’, ‘armv6s-m’, ‘armv6t2’, ‘armv6z’, ‘armv6zk’, ‘armv7’, ‘armv7-a’, ‘armv7-m’, ‘armv7-r’, ‘armv7e-m’, ‘armv7ve’, ‘armv8-a’, ‘armv8-a+crc’, ‘armv8.1-a’, ‘armv8.1-a+crc’, ‘armv8-m.base’, ‘armv8-m.main’, ‘armv8-m.main+dsp’, ‘iwmmxt’, ‘iwmmxt2’.

“armv4t已弃用。

-march = armv6s-m 是 'armv6-m支持的(现在是必须的)SVC指令架构。

-march = armv6zk 是“armv6kz’,为了向后兼容而存在。

-march = armv7ve 是 'armv7-a’具有虚拟化扩展的架构。

-march = armv8-a + crc 支持ARMv8-A架构的代码生成以及可选的CRC32扩展。

-march = armv8.1-a启用对ARMv8.1-A体系结构的编译器支持。这个启用了 -march = armv8-a + crc。

-march = armv8.2-a启用对ARMv8.2-A架构的编译器支持。这个启用了 -march = armv8.1-a。

-march = armv8.2-a + fp16通过可选的FP16指令扩展支持编译器对ARMv8.2-A架构的支持。这也启用了-march = armv8.1-a 并设置 -mfp16-format = ieee。

-march=native 使编译器自动检测构建计算机的体系结构。目前,仅GNU / Linux支持此功能,并且并非所有体系结构都可以识别。如果自动检测失败,则该选项无效。

-mtune=name
此选项指定GCC为其调整代码性能的目标ARM处理器的名称。对于某些ARM实现,可以使用此选项获得更好的性能。允许的名称为:‘arm7di’, ‘arm7dmi’, ‘arm70’, ‘arm700’, ‘arm700i’, ‘arm710’, ‘arm710c’, ‘arm7100’, ‘arm720’, ‘arm7500’, ‘arm7500fe’, ‘arm7tdmi’, ‘arm7tdmi-s’, ‘arm710t’, ‘arm720t’, ‘arm740t’, ‘strongarm’, ‘strongarm110’, ‘strongarm1100’, ‘strongarm1110’, ‘arm8’, ‘arm810’, ‘arm9’, ‘arm9e’, ‘arm920’, ‘arm920t’, ‘arm922t’, ‘arm946e-s’, ‘arm966e-s’, ‘arm968e-s’, ‘arm926ej-s’, ‘arm940t’, ‘arm9tdmi’, ‘arm10tdmi’, ‘arm1020t’, ‘arm1026ej-s’, ‘arm10e’, ‘arm1020e’, ‘arm1022e’, ‘arm1136j-s’, ‘arm1136jf-s’, ‘mpcore’, ‘mpcorenovfp’, ‘arm1156t2-s’, ‘arm1156t2f-s’, ‘arm1176jz-s’, ‘arm1176jzf-s’, ‘generic-armv7-a’, ‘cortex-a5’, ‘cortex-a7’, ‘cortex-a8’, ‘cortex-a9’, ‘cortex-a12’, ‘cortex-a15’, ‘cortex-a17’, ‘cortex-a32’, ‘cortex-a35’, ‘cortex-a53’, ‘cortex-a57’, ‘cortex-a72’, ‘cortex-a73’, ‘cortex-r4’, ‘cortex-r4f’, ‘cortex-r5’, ‘cortex-r7’, ‘cortex-r8’, ‘cortex-m33’, ‘cortex-m23’, ‘cortex-m7’, ‘cortex-m4’, ‘cortex-m3’, ‘cortex-m1’, ‘cortex-m0’, ‘cortex-m0plus’, ‘cortex-m1.small-multiply’, ‘cortex-m0.small-multiply’, ‘cortex-m0plus.small-multiply’, ‘exynos-m1’, ‘marvell-pj4’, ‘xscale’, ‘iwmmxt’, ‘iwmmxt2’, ‘ep9312’, ‘fa526’, ‘fa626’, ‘fa606te’, ‘fa626te’, ‘fmp626’, ‘fa726te’, ‘xgene1’.

此外,此选项可以指定GCC为big.LITTLE系统调整代码的性能。允许的名称为:cortex-a15.cortex-a7’, ‘cortex-a17.cortex-a7’, ‘cortex-a57.cortex-a53’, ‘cortex-a72.cortex-a53’, ‘cortex-a72.cortex-a35’, ‘cortex-a73.cortex-a53’.

-mtune=generic-arch 指定对GCC应该调整为建筑内的混合处理器的性能拱。目的是生成可在当前最流行的处理器上良好运行的代码,在使该范围内的某些CPU受益的优化之间取得平衡,并避免其他CPU的性能缺陷。随着CPU型号的出现,此选项的影响在将来的GCC版本中可能会改变。

-mtune=native 使编译器自动识别生成计算机的CPU。目前,仅GNU / Linux支持此功能,并且并非所有体系结构都可以识别。如果自动检测失败,则该选项无效。

-mcpu=name
这指定目标ARM处理器的名称。GCC使用此名称来派生目标ARM体系结构的名称(好像是由-march指定的)以及要针对其性能进行调整的ARM处理器类型(就像由-mtune指定的那样)。如果此选项与-march或-mtune一起使用,则这些选项优先于此选项的相应部分。

此选项的允许名称与 -mtune.

-mcpu=generic arch也是允许的,它相当于 -march=arch -mtune=generic-arch。有关详细信息,请参见-mtune。

-mcpu=native 使编译器自动检测生成计算机的CPU。目前,仅GNU / Linux支持此功能,并且并非所有体系结构都可以识别。如果自动检测失败,则该选项无效。

-mfpu=name
这指定目标上可用的浮点硬件(或硬件仿真)。允许的名称为:
‘vfpv2’, ‘vfpv3’, ‘vfpv3-fp16’, ‘vfpv3-d16’, ‘vfpv3-d16-fp16’, ‘vfpv3xd’, ‘vfpv3xd-fp16’, ‘neon-vfpv3’, ‘neon-fp16’, ‘vfpv4’, ‘vfpv4-d16’, ‘fpv4-sp-d16’, ‘neon-vfpv4’, ‘fpv5-d16’, ‘fpv5-sp-d16’, ‘fp-armv8’, ‘neon-fp-armv8’ 和 ‘crypto-neon-fp-armv8’.
请注意,“neon”是“neon-vfpv3”的别名,“vfp”是“vfpv2”的别名。

如果 -msoft-float 指定此选项可指定浮点值的格式。

如果所选浮点硬件包括NEON扩展名(例如, -mfpu=‘neon’),请注意,除非GCC的自动矢量化过程不会生成浮点运算,除非-funsafe-math-optimizations也被指定。这是因为NEON硬件没有完全实现用于浮点算术的IEEE 754标准(特别是将非正规值视为零),因此使用NEON指令可能会导致精度降低。

您还可以通过使用target(“fpu=”)函数属性(请参见ARM Function Attributes)或编译指示(请参见Function Specific Option Pragmas)在函数级别设置fpu名称。

-mfp16-format=name
指定__fp16半精度浮点类型的格式。允许的名称是‘none’, ‘ieee’, and ‘alternative’ 默认值为“none’,在这种情况下,该__fp16类型未定义。有关更多信息,请参见Half-Precision。

-mstructure-size-boundary=n
所有结构和联合的大小均四舍五入到此选项设置的位数的倍数。允许值为8、32和64。默认值因不同的工具链而异。对于以COFF为目标的工具链,默认值为8。仅在基础ABI支持时,才允许使用64。

指定更大的数字可以生成更快,更有效的代码,但也可以增加程序的大小。不同的值可能不兼容。如果使用结构或联合交换信息,则使用一个值编译的代码不一定期望与使用另一个值编译的代码或库一起工作。

-mabort-on-noreturn
在函数abort末尾生成对该函数的 noreturn调用。如果函数尝试返回,则执行该命令。

-mlong-calls
-mno-long-calls
通过首先将函数的地址加载到寄存器中,然后对该寄存器执行子例程调用,来告诉编译器执行函数调用。如果目标函数位于子例程调用指令的基于偏移版本的64 MB寻址范围之外,则需要此开关。

即使启用此开关,也不是所有的函数调用都变成长调用。启发式方法是,静态函数,具有short_call属性的函数,#pragma no_long_calls指令范围内的函数以及定义已在当前编译单元中编译的函数不会转换为长调用。此规则的例外是弱函数定义,具有一个long_call 或多个section属性的函数以及#pragma long_calls指令范围内的函数始终被转换为长调用。

默认情况下不启用此功能。指定 -mno长通话恢复默认行为,将函数调用置于#pragma long_calls_off指令范围内也是如此。请注意,这些开关对编译器如何生成代码以通过函数指针处理函数调用没有影响。

-msingle-pic-base
将用于PIC寻址的寄存器视为只读,而不是将其加载到每个功能的序言中。运行系统负责在执行开始之前使用适当的值初始化该寄存器。

-mpic-register=reg
指定用于PIC寻址的寄存器。对于标准PIC基本情况,默认值为编译器确定的任何合适的寄存器。对于单个PIC基本情况,默认值为’R9’如果目标基于EABI或启用了堆栈检查,则默认为’R10’。

-mpic-data-is-text-relative
假设文本段和数据段之间的位移在静态链接时间是固定的。这允许使用相对于PC的寻址操作来访问已知在数据段中的数据。对于non-VxWorks RTP目标,默认情况下启用此选项。在此类目标上禁用后,它将默认启用 -msingle-pic-base 。

-mpoke-function-name
将每个函数的名称写入文本部分,直接位于函数序言的前面。生成的代码类似于:

 00
     .ascii“ arm_poke_function_name”,0
     .align
 11
     .word 0xff000000 +(t1-t0)
 arm_poke_function_name
     mov ip,sp
     stmfd sp !, {fp,ip,lr,pc}
     sub fp,ip,#4

执行堆栈回溯时,代码可以检查处pc存储的值 fp + 0。如果跟踪函数然后查看位置pc - 12并且设置了高8位,那么我们知道在此位置之前嵌入了一个函数名,其长度为((pc[-3]) & 0xff000000)。

-mthumb
-marm
在生成以ARM和Thumb状态执行的代码之间进行选择。大多数配置的默认设置是生成在ARM状态下执行的代码,但是可以通过使用以下命令配置GCC来更改默认设置:–with-mode=状态 配置选项。

您还可以通过使用target(“thumb”)和target(“arm”)函数属性(请参见ARM Function Attributes)或编译指示(请参见Function Specific Option Pragmas)来覆盖每个功能的ARM和Thumb模式。

-mtpcs-frame
为所有非叶子函数生成一个符合Thumb过程调用标准的堆栈框架。(叶子函数是不调用任何其他函数的函数。)默认值为-mno-tpcs-frame。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/luoqingxi000/article/details/110430292

-mtpcs-leaf-frame
为所有叶子函数生成一个符合Thumb过程调用标准的堆栈框架。(叶子函数是不调用任何其他函数的函数。)默认值为-mno-apcs-leaf-frame.

-mcallee-super-interworking
为正在编译的文件中的所有外部可见函数提供ARM指令集标头,该标头在执行其余功能之前会切换到Thumb模式。这允许从非交互代码中调用这些功能。此选项在AAPCS配置中无效,因为默认情况下启用了互通。

-mcaller-super-interworking
允许通过函数指针(包括虚函数)进行的调用正确执行,而不管目标代码是否已为互通而编译。如果启用此选项,则执行函数所用到的系统开销很小。此选项在AAPCS配置中无效,因为默认情况下启用了互通。

-mtp=name
指定线程本地存储指针的访问模式。正确模式为‘soft’,会生成对 __aeabi_read_tp, ‘cp15’的调用,直接从CP15中获取线程指针(在arm6k架构中受支持),以及’auto”,它将针对所选处理器使用最佳可用方法。默认设置为“auto’。

-mtls-dialect=dialect
指定用于访问线程本地存储的方言。支持‘gnu’ 和 ‘gnu2’两种。'gnu’选择原始的GNU方案来支持本地和全局动态TLS模型。‘gnu2’选择GNU描述符方案,该方案为共享库提供更好的性能。GNU描述符方案与原始方案兼容,但确实需要新的编译器,链接器和库支持。初始和本地exec TLS模型不受此选项的影响,并且始终使用原始方案。

-mword-relocations
仅对字大小的值生成绝对重定位(i.e. R_ARM_ABS32)。默认情况下,在运行时加载程序施加此限制的目标(uClinux、SymbianOS)上,以及指定-fpic或-fpic时,都会启用此功能。

-mfix-cortex-m3-ldrd
当使用目标寄存器和基寄存器重叠的ldrd指令时,某些Cortex-M3内核可能会导致数据损坏。此选项可避免生成这些指令。当指定-mcpu=cortex-m3时,默认情况下启用此选项。

-munaligned-access
-mno-unaligned-access
启用(或禁用)从16位或32位对齐的地址读取和写入16位和32位值。默认情况下,对于所有pre-ARMv6、所有ARMv6-M和ARMv8-M基线体系结构,禁用未对齐访问,并为所有其他体系结构启用未对齐访问。如果未启用未对齐的访问,则压缩数据结构中的字一次访问一个字节。

根据此选项的设置,在生成的对象文件中将ARM属性标记Tag_CPU_unaligned_access设置为true或false。如果启用,则会定义预处理命令__ARM_FEATURE_UNALIGNED

-mneon-for-64bits
允许使用Neon处理标量64位操作。由于将数据从核心寄存器移动到Neon的成本很高,因此默认情况下禁用此功能。

-mslow-flash-data
假设从flash加载数据比获取指令慢。因此为了获得更好的性能,文本负载被最小化。此选项仅在为ARMv7 M-profile编译时受支持,默认情况下处于关闭状态。

-masm-syntax-unified
假定内联汇编器使用统一的asm语法。当前默认为关闭,这意味着语法分开。此选项对Thumb2没有影响。但是,这可能会在以后的GCC版本中发生变化。分开的语法应视为已弃用。

-mrestrict-it
限制生成符合ARMv8规则的IT块。它的块只能包含一条来自一组选择指令的16位指令。对于ARMv8 Thumb模式,此选项默认为打开。

-mprint-tune-info
将CPU调试信息打印为汇编文件中的注释。此选项仅用于编译器测试,不适用于编译代码中的常规用途。默认情况下禁用此选项。

-mpure-code
不允许在代码段中放置常量数据。此外,在为ELF对象格式编译时,为所有文本节指定ELF处理器特定的部分属性SHF_ARM_PURECODE。此选项仅在为ARMv7-M目标生成非pic代码时可用。

-mcmse
根据“ ARMv8-M扩展:开发工具工程规范的要求”生成安全代码,该代码PDF格式可在http://infocenter.arm.com/help/topic/com.arm.doc.ecm0359818/ECM0359818_armv8m_security_extensions_reqs_on_dev_tools_1_0
中找到。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值