【方辉专栏】ARM嵌入式编译器(九) 链接时优化介绍
发布时间:2022-08-29

摘要: 本文主要对Arm Compiler 6编译器的链接时优化进行介绍。

关键字:Arm Compiler 6、编译器、LTO、链接时优化。


1. 链接时优化

链接时优化是指编译器在链接时将不同文件的代码放在一起进行优化,以获得更多的优化机会。

通常情况下,编译器仅会独立的优化每个源文件,将源代码转换为目标文件。在链接时,链接器通过解析符号引用和重定位将所有的目标文件合成一个可执行文件。单独编译源文件时有可能会丧失一些优化机会,例如跨模块内联。

当启用链接时优化编译,编译器会将每个文件转换为LLVM位码的中间形式。链接器将所有包含位码的文件收集到一起,并发送到链接时优化器,这样可以根据模块中间依赖关系的进行优化,优化完毕之后再发回链接器,链接器再创建一个可执行文件。



2. 启用链接时优化

要启用链接时优化 LTO,就需要在编译(armclang)和链接(armlink)时都需要启用。

在编译时,使用armclang选项-flto生成适合 LTO 的 ELF 文件.

在链接时,使用armlink选项--lto为指定的位码文件启用 LTO.


3. 链接时优化的限制

armlink  --partial选项仅适用于ELF 文件。如果链接器检测到包含位码的文件,则会报错。

Arm 建议仅对分散文件中不需要精确放置的代码和数据执行链接时优化。


4. 链接时优化举例

例1:armclang --target=arm-arm-none-eabi -march=armv8-a -flto src1.c src2.c src3.c -o output.axf

在此示例中,由于armclang自动调用armlink ,因此链接时优化器具有与armclang相同的优化级别。由于没有为armclang指定优化级别,因此它是默认优化级别-O0,并且--lto_level=O0.

例2:

armclang --target=arm-arm-none-eabi -march=armv8-a -c src1.c -o src1.o

armclang --target=arm-arm-none-eabi -march=armv8-a -c -flto src2.c -o src2.o

armclang --target=arm-arm-none-eabi -march=armv8-a -c -flto src3.c -o src3.o

armlink --lto src1.o src2.o src3.o -o output.axf

在此例中,因为 armclang和 armlink是分开调用的,所以它们有独立的优化级别。由于没有为 armclang或 armlink指定优化级别, 因此 armclang具有默认优化级别 -O0,链接时优化器具有默认优化级别 --lto_level=O2。


来源:《Arm® Compiler for Embedded User Guide Version 6.18》


+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++


关于凯发k8一触即发电子

凯发k8一触即发电子技术有限公司(英文名称:Emdoor Electronics Technology Co.,Ltd)是国内资深的研发工具软件提供商,公司成立于 2002 年,面向中国广大的制造业客户提供研发、设计、管理过程中使用的各种软件开发工具,致力于帮助客户提高研发管理效率、缩短产品设计周期,提升产品可靠性。

20 年来,先后与 Altium、ARM、Ansys、QT、Adobe、Visu-IT、Minitab、Testplant、EPLAN、HighTec、GreenHills、PLS、Ashling、MSC Software 、Autodesk、Source Insight、TeamEDA、MicroFocus等多家全球知名公司建立战略合作伙伴关系,并作为他们在中国区的主要分销合作伙伴服务了数千家中国本土客户,为客户提供从芯片级开发工具、EDA 设计工具、软件编译以及测试工具、结构设计工具、仿真工具、电气设计工具、以及嵌入式 GUI 工具等等。凯发k8一触即发电子凭借多年的经验积累,真正的帮助客户实现了让研发更简单、更可靠、更高效的目标。


欢迎关注“凯发k8一触即发电子”公众号

了解更多研发工具软件知识