当前位置:   article > 正文

主流编译器(armcc、iar、gcc for arm、LLVM(clang))详细介绍

llvm clang arm

    关注、星标公众号,直达精彩内容

b3538e08545c8fcb3ee05fcb86611d0e.png

整理:技术让梦想更伟大 | 李肖遥

链接:https://itexp.blog.csdn.net/article/details/89553323

必备

在讲解各编译器之前,必须先了解一下以下这些文件。这些文件在编译器目录下或者编译生成目标平台的可执行程序时经常见到。此外,还需要注意区分 Windows 平台 和 Linux 平台的文件。

  • .o 文件: 指的是 object 文件,俗称目标文件。在 Linux 下扩展名缩写为 .o,在 windows 下通常为 .obj 文件。

  • .a 文件: 指的是 archive 文件,俗称静态库文件。在 Linux 下扩展名缩写为 .a,在 windows 下通常为 .lib 文件。

  • .so 文件: 指的是 shared object 文件,用于动态连接的。在 Linux 下扩展名缩写为 .so,在 windows 下通常为 .dll 文件。

.o 文件是链接文件,.a 是静态库文件,需要 .o 文件生成,作为一个库为外部程序提供函数接口。详细的可以看一下博文   镜像文件(Image)/可执行文件/ELF文件/对象文件 详解

??在交叉编译工具链目录中,有大量的 .o.a 文件。这些文件在我们编译目标平台时会被用到!为什么在 Windows 下面的编译工具链中会有这么多的 .o 和 .a 文件呢?这是因为我们使用的这个编译工具链是在 Linux 系统中编译生成的! 。看下图:

434039e561e3d01b32f3bb699b92f0be.png

如果有亲自编译过交叉编译工具链,那么就一定会对 build、host 和 target 这几个参数非常熟悉:

  • –build=编译该软件(就是指的交叉编译工具链本身)所使用的平台

  • –host=该软件(就是指的交叉编译工具链本身)将运行的平台

  • –target=该软件(就是指的交叉编译工具链本身)所要处理的目标平台。即交叉编译工具链编译出来的程序运行的平台。

比较

目前,针对于 ARM 平台的主流编译器主要有以下三者:

比较ARMCCIARGCC for ARMLLVM(clang)
命令行工具随IDE发布,也独立提供仅随其IDE发布,不独立提供独立提供只有命令行工具
开发商ARMIARARM、Linaro、MentorLLVM
支持的平台Windows、LinuxWindowsWindows、Linux、Mac(部分)Windows、Linux、Mac
配套 IDEKeil MDK、ARM Development Studio 5、ADSIAR EMBEDDED WORKBENCH FOR ARM除以上两者外的其他支持ARM的IDE,例如:eclipse、Visual Studio除以上两者外的其他支持ARM的IDE,例如:eclipse、Visual Studio
官网https://developer.arm.com/tools-and-software/embedded/arm-compiler/downloadshttps://www.iar.com/iar-embedded-workbench/1. https://launchpad.net/gcc-arm-embedded 2. https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-rm/downloadshttps://llvm.org/

ARM

ARM 官网上除了提供了配套 IDE(参考博文《ARM 之 各集成开发环境(IDE)说明(Keil、RVDS、ADS、DS-5、MDK)》) 以外,每次都会提供编译器的独立下载。用户可以单独安装编译器,编译器采用命令行形式使用。

也就是说,ARM 的 IDE 和编译器是相互独立的,使用者可以为同一个 IDE 配置不同版本的编译器!目前,ARM 官方提供两个版本的编译器,如下图所示:

a1a17e794f09fb347e33c5f266b2e93d.png

其中,Arm Compiler 6 被 ARM 称为是 Arm Compiler 5 的替代者!相比于 Arm Compiler 5 的使用的 Edison Design Group 编译器前端,Arm Compiler 6 将编译器前端换为了基于 LLVM 的 Clang!

d8ddcacfdf852853427290527b693e62.png在 ARM 官网的介绍中,有如下一段话

General update releases on the last branch, version 5.06, ended in H2 2017 with 5.06u6. After this, further support and maintenance will be available through Arm Compiler Long Term Maintenance releases with maintenance continuing until at least summer 2020. Arm Compiler 5.06 for Certification and Arm Compiler 5.06 Long Term Maintenance releases will each be supported by an Arm Compiler Qualification Kit.

大意就是,Arm Compiler 5 以后就要退出舞台了!在 ARM 内核的支持上,Arm Compiler 6 也要比 Arm Compiler 5 完善的多!目前,ARM 官方的 IDE 都会包含这两个版本的编译器。例如,在 Keil MDK 的安装目录下面会有如下两个目录,分别对应了 Arm Compiler 5 和 Arm Compiler 6f9194134ae39c02c7add5236662a71b1.png

上面说了,以上编译器 ARM 也提供独立下载安装,具体见上文的官网地址即可!我本身安装了多个版本的 ARM编译器,如下:

0c035f5899d1046a3fdbf05833ef1796.png

  1. Edison Design Group 是一家公司,靠卖产品给卖编译器的公司生存,它卖的是前端,包括 C++、Java 和 Fortran 前端,全世界几乎所有商用编译器,都会用这家公司的前端。最重要的,这家公司只有 5 个人。这五个人依次是:Mike Miller, Daveed Vandevoorde, Steve Adamczyk, John Spicer, Mike Herricl。Daveed Vandevoorde 写过两本书《C++ Templates》和《C++ Solutions》,Mike Miller是C++专家,实现部分C++的功能。Mike Herrick在Bell实验室呆了19年。Steve Adamczyk 和 John Spicer 是 EDG 的创建者。

  2. 在最早期,ARM 的编译器也是随 IDE 发布的,如 ADS 时代!

armcc.exe

ARM 指令和 Thumb? 指令编译器。用来编译 C 和 C++代码。它支持内联和嵌入式汇编程序,还包括高级 SIMD 矢量化编译器。??编译器支持将符合以下标准的 C 和 C ++ 源代码编译为 ARM 和 Thumb? 代码:

  • ISO Standard C:1990 source.

  • ISO Standard C:1999 source.

  • ISO Standard C++:2003 source.

  • ISO Standard C++:2011 source.

armcc 符合 Base Standard Application Binary Interface for the ARM Architectur(ARM体系结构的基本标准应用程序二进制接口,BSABI):

  • 生成 ELF 格式的对象文件。参考博文《ARM 之 镜像文件(Image)/可执行文件/ELF文件/对象文件 详解》。

  • 生成基于 Debug With Arbitrary Record Format Debugging Standard Version 3 (DWARF 3) 的调试信息 并且包含对于 DWARF 2 debug tables 的支持。

  • 使用 Edison Design Group (EDG) 编译器前端!

  1. D:\ARM\ARM_Compiler_5.06u4>armcc
  2. Product: ARM Compiler 5.06
  3. Component: ARM Compiler 5.06 update 4 (build 422)
  4. Tool: armcc [4d3604]
  5. Usage:         armcc [options] file1 file2 ... filen
  6. Main options:
  7. --arm          Generate ARM code 创建 ARM 代码
  8. --thumb        Generate Thumb code 创建 Thumb 代码
  9. --c90          Switch to C mode (default for .c files) 切换到C模式 (默认是 .c 文件)
  10. --cpp          Switch to C++ mode (default for .cpp files) 切换到C++模式 (默认 .cpp 文件)
  11. -O0            Minimum optimization 最小优化级别
  12. -O1            Restricted optimization for debugging 受限的调试级别优化
  13. -O2            High optimization 高优化
  14. -O3            Maximum optimization 最大优化
  15. -Ospace        Optimize for codesize 对代码大小进行优化
  16. -Otime         Optimize for maximum performance 优化最大优化级别的运行时间
  17. --cpu <cpu>    Select CPU to generate code for 选择CPU
  18. --cpu list     Output a list of all the selectable CPUs 输出所有被选中的CPU列表
  19. -o <file>      Name the final output file of the compilation 最终输出文件的名字
  20. -c             Compile only, do not link 只进行编译,不链接
  21. --asm          Output assembly code as well as object code 输出汇编以及obj文件
  22. -S             Output assembly code instead of object code 只输出汇编文件
  23. --interleave   Interleave source with disassembly (use with --asm or -S) 交叉反汇编 (use with --asm or -S)
  24. -E             Preprocess the C source code only 仅仅预处理C代码
  25. -D<symbol>     Define <symbol> on entry to the compiler 定义 <symbol> 符号并且传入编译过程
  26. -g             Generate tables for high-level debugging 为高级别调试创建表
  27. -I<directory>  Include <directory> on the #include search path 在编译的时候包含 <directory> 作为头文件搜索目录
  28. 1234567891011121314151617181920212223242526272829

其默认的头文件搜索路径如下图所示:596aa03769208ce9ec7d506606ef9001.png

armasm.exe

?? ARM 和 Thumb 汇编器。用来汇编 ARM 和 Thumb 汇编语言源文件。

  1. D:\ARM\ARM_Compiler_5.06u4>armasm
  2. Product: ARM Compiler 5.06
  3. Component: ARM Compiler 5.06 update 4 (build 422)
  4. Tool: armasm [4d35cf]
  5. For Educational purposes only
  6. Software supplied by: ARM Limited
  7. Usage:      armasm [options] sourcefile
  8. Options:
  9. --list       listingfile   Write a listing file (see manual for options)    生成列表文件
  10. -o          outputfile    Name the final output file   命名最终输出文件名
  11. --depend     dependfile    Save 'make' source file dependencies 保留 'make' 源文件依赖
  12. --errors     errorsfile    Put stderr diagnostics to errorsfile 把标准错误判断放入errorsfile
  13. -I          dir[,dir]     Add dirs to source file search path  添加源文件的搜索目录
  14. --pd
  15. --predefine  directive     Pre-execute a SET{L,A,S} directive   预执行 SET{L,A,S} 指令
  16. --maxcache   <n>           Maximum cache size   (default 8MB)  最大闪存空间 (default 8MB)
  17. --no_esc                   Ignore C-style (\c) escape sequences 忽略C风格(\ c)转义序列
  18. --no_warn                  Turn off Warning messages    关闭警告信息
  19. -g                        Output debugging tables  输出调试表
  20. --apcs       /<quals>      Make pre-definitions to match the
  21.                           chosen procedure-call standard 进行预定义以匹配选择的程序调用标准
  22. --checkreglist             Warn about out of order LDM/STM register lists   警告LDM/STM寄存器列表出现故障
  23. --help                     Print this information   打印帮助信息
  24. --li                       Little-endian ARM    小端模式的 ARM
  25. --bi                       Big-endian ARM   大端模式的 ARM
  26. -M                        Write source file dependency lists to stdout 将源文件依赖关系列表写入stdout
  27. --MD                       Write source file dependency lists to inputfile.d 将源文件依赖关系列表写入inputfile.d
  28. --keep                     Keep local labels in symbol table of object file 将本地标签保存在目标文件的符号表中
  29. --regnames none            Do not predefine register names 不预定义寄存器名称
  30. --split_ldm                Fault long LDM/STM
  31. --unsafe                   Downgrade certain errors to warnings 将某些错误降级为警告
  32. --via        <file>        Read further arguments from <file> 从<file>中读取更多参数
  33. --cpu        <target-cpu>  Set the target ARM core type 设置目标ARM核心类型
  34. --cpu list                 Output a list of all the selectable CPUs 输出所有可选CPU的列表
  35. --fpu        <target-arch> Set target FP architecture version 设置目标FP架构版本
  36. --fpu list                 Output a list of all selectable FP architectures 输出所有可选FP架构的列表
  37. --thumb                    Assemble Thumb instructions  汇编 Thumb 指令
  38. --arm                      Assemble ARM instructions    汇编 ARM 指令
  39. 12345678910111213141516171819202122232425262728293031323334353637383940

armlink.exe

The linker. This combines the contents of one or more object files with selected parts of one ormore object libraries to produce an executable program.A 64-bit version of armlink is also provided that can access the greater amount of memoryavailable on 64-bit machines. It supports all the features that are supported by the 32-bit versionof armlink in this release. 连接器。用于将一个或多个目标文件的内容与一个或多个对象库的选定部分组合在一起,以生成可执行程序。还提供了 64 位版本的 armlink,可以访问 64 位计算机上可用的更大内存量。它支持此版本中 32 位版本的 armlink 支持的所有功能。

If you are using ARM Compiler as a standalone product, then the 32-bit version is used bydefault. 如果您使用 ARM 编译器作为独立产品,则默认使用 32 位版本。

For ARM Compiler in DS-5, the linker version depends on the host platform. 32-bit tools havethe 32-bit linker and 64-bit tools have the 64-bit linker. You do not get both versions.For the Microcontroller Developer Kit (MDK), only the 32-bit linker is provided. 对于 DS-5 中的 ARM 编译器,链接器版本取决于主机平台。32 位工具具有32位链接器,64 位工具具有 64 位链接器。您没有获得这两个版本。对于微控制器开发工具包(MDK),仅提供 32 位链接器。

  1. D:\ARM\ARM_Compiler_5.06u4>armlink
  2. Product: ARM Compiler 5.06
  3. Component: ARM Compiler 5.06 update 4 (build 422)
  4. Tool: armlink [4d35d2]
  5. For Educational purposes only
  6. Software supplied by: ARM Limited
  7. Usage: armlink option-list input-file-list
  8. where
  9.    option-list      is a list of case-insensitive options. 不区分大小写的选项列表。
  10.    input-file-list  is a list of input object and library files. 输入对象或者库文件列表。
  11. General options (abbreviations shown capitalised):
  12.   --help          Print this summary. 显示帮助信息。
  13.   --output file   Specify the name of the output file. 指定输出文件名。
  14.   --via file      Read further arguments from file.
  15. Options for specifying memory map information:
  16.   --partial       Generate a partially linked object. 创建一个被分散链接的对象文件。
  17.   --scatter file  Create the memory map as described in file. 按文件(分散加载文件)中的描述创建内存映射。
  18.   --ro-base n     Set exec addr of region containing RO sections. 设置执行地址空间域,包含RO段(只读数据段)。
  19.   --rw-base n     Set exec addr of region containing RW/ZI sections. 设置执行地址空间域,包含RW/ZI段。
  20. Options for controlling image contents:
  21.   --bestdebug     Add debug information giving best debug view to image.  添加调试信息,为镜像提供最佳调试视图。
  22.   --datacompressor off
  23.                   Do not compress RW data sections. 不要压缩RW数据段。
  24.   --no_debug      Do not add debug information to image. 不添加调试信息。
  25.   --entry         Specify entry sections and entry point. 指定输入段与输入点。
  26.   --libpath       Specify path to find system libraries from. 指定系统库文件路径。
  27.   --userlibpath   Specify path to find user libraries from. 指定用户库文件路径。
  28.   --no_locals     Do not add local symbols to image symbol table. 不要添加局部标号到image的标号列表。
  29.   --no_remove     Do not remove unused sections from image. 不要移除image的未使用段。
  30. Options for controlling image related information:
  31.   --callgraph     Create a static callgraph of functions. 创建一个函数静态调用图。
  32.   --feedback file Generate feedback that can be used by the compiler in file.
  33.   --info topic    List misc. information about image.
  34.                    Available topics: (separate multiple topics with comma)
  35.                     common   List common sections eliminated from the image.
  36.                     debug    List eliminated input debug sections.
  37.                     sizes    List code and data sizes for objects in image.
  38.                     totals   List total sizes of all objects in image.
  39.                     veneers  List veneers that have been generated.
  40.                     unused   List sections eliminated from the image.
  41.   --map           Display memory map of image. 显示image内存映射。
  42.   --symbols       List symbols in image. 列出image符号。
  43.   --xref          List all cross-references between input sections. 列出输入的段之间所有的交叉引用.最终输出会放在.map文件里面。
  44. 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748

armar.exe

The librarian. This enables sets of ELF object files to be collected together and maintained inarchives or libraries. You can pass such a library or archive to the linker in place of several ELFfiles. You can also use the archive for distribution to a third party for further applicationdevelopment. 库文件管理工具。这使得 ELF 对象文件集可以一起收集并维护在原始文件或库中。您可以将此类库或存档传递给链接器以代替多个ELF文件。您还可以使用存档分发给第三方以进行进一步的应用程序开发。

  1. D:\ARM\ARM_Compiler_5.06u4>armar
  2. Product: ARM Compiler 5.06
  3. Component: ARM Compiler 5.06 update 4 (build 422)
  4. Tool: armar [4d35c8]
  5. Archive creation and maintenance tool
  6. Command format:
  7. armar options archive [ file_list ]
  8. Wildcards '?' and '*' may be used in file_list
  9. Options:-
  10. -r         Insert files in <file_list>, replace existing members of the same name. 在 <file_list> 中插入文件, 替换掉已经存在的同名成员。
  11. -d         Delete the members in <file_list>. 从 <file_list> 中删除成员。
  12. -x         Extract members in <file_list> placing in files of the same name. 从 <file_list> 中提取同名的成员。
  13. -m         Move files in <file_list>. 在 <file_list> 中移动文件。
  14. -p         Print files to stdout. 打印文件到标准输出设备。
  15. -a pos     Insert/move files after file named <pos>. 插入/删除 <pos> 后面的文件。
  16. -b pos     Insert/move files before file named <pos>. 插入/删除 <pos> 前面的文件。
  17. -u         Update older files only, used with -r. 只更新旧的文件, 与 -r 一起使用。
  18. -n         Do not add a symbol table to an object archive. 不要向 object 文件中添加符号表。
  19. -s         Force regeneration of archive symbol table. 强制重新生成文档符号表。
  20. -t         Print table of contents of archive. 打印文档的内容表。
  21. --zs        Show the symbol table. 显示符号表。
  22. --zt        Summarize the archive contents (sizes + entries). 汇总文档内容 (大小和输入)。
  23. -c         Suppress warning when a new archive is created. 当一个新文档被创建的时候不显示警告。
  24. -C         Do not overwrite existing files when extracting. 提取的时候不要覆盖一个已经存在的文件。
  25. -T         Truncate file names to system maximum length. 截取系统最大长度文件名。
  26. -v         Give verbose output. 提供详细输出。
  27. --create    Force creation of a new archive. 强制创建一个新文档。
  28. --via file  Take additional arguments from via file. 从 via 文件中获取额外参数。
  29. --sizes     List the size of each member and the library total. 列出所有成员大小与库的总大小。
  30. --entries   List sections containing ENTRY points. 列出包括入口点的部分。
  31. --vsn       Print the current Armar Version. 打印最新的armar版本。
  32. --help      Print this message. 打印帮助信息。
  33. Examples:-
  34.        armar -r  mylib.a obj1 obj2 obj3...
  35.        armar -x  mylib.a ?sort*
  36.        armar -d  mylib.a hash.o
  37.        armar -tv ansilib.a

fromelf.exe

The image conversion utility. This can also generate textual information about the input image,such as its disassembly and its code and data size.镜像转换实用程序。这还可以生成有关输入图像的文本信息,例如其反汇编及其代码和数据大小。

  1. D:\ARM\ARM_Compiler_5.06u4>fromelf
  2. Product: ARM Compiler 5.06
  3. Component: ARM Compiler 5.06 update 4 (build 422)
  4. Tool: fromelf [4d35cb]
  5. ARM image conversion utility. ARM 镜像转换工具
  6. fromelf [options] input_file
  7. Options:
  8.       --help         display this help screen 显示帮助信息
  9.       --vsn          display version information 显示版本信息
  10.       --output file  the output file. (defaults to stdout for -text format) 输出文件名. (默认输出 -text 格式)
  11.       --nodebug      do not put debug areas in the output image 不要输出调试信息到映像文件中
  12.       --nolinkview   do not put sections in the output image 不要输出段信息到映像文件中
  13. Binary Output Formats:
  14.       --bin          Plain Binary 普通二进制
  15.       --m32          Motorola 32 bit Hex 摩托罗拉32位Hex码
  16.       --i32          Intel 32 bit Hex 英特尔32位Hex码
  17.       --vhx          Byte Oriented Hex format 定向字节的 Hex 格式
  18.       --base addr    Optionally set base address for m32,i32 为 m32,i32设置基地址(可选的)
  19. Output Formats Requiring Debug Information 输出格式要求的调试信息
  20.       --fieldoffsets Assembly Language Description of Structures/Classes. Structures/Classes的汇编描述
  21.       --expandarrays Arrays inside and outside structures are expanded. 展开内部和外部结构的数组
  22. Other Output Formats:
  23.       --elf         ELF ELF格式
  24.       --text        Text Information 文本信息
  25.                Flags for Text Information 文本信息的标志
  26.                -v          verbose 详细信息
  27.                -a          print data addresses (For images built with debug) 打印数据的地址信息 (得到的.axf映像文件)
  28.                -c          disassemble code 汇编码
  29.                -d          print contents of data section 打印数据的段内容
  30.                -e          print exception tables 打印异常表
  31.                -g          print debug tables 打印调试表
  32.                -r          print relocation information 打印重定位信息
  33.                -s          print symbol table 打印符号表
  34.                -t          print string table 打印字符表
  35.                -y          print dynamic segment contents 打印动态段内容
  36.                -z          print code and data size information 打印代码与数据的大小信息

IAR

相比于 ARM 对于编译器的灵活安装,IAR 的编译器则只跟随其 IDE 发布,编译器不独立提供。IAR 安装后,目录就是下面这个样子了:

2704661f87b185d217eea28cd83e5859.png

这里我们重点关注一下arm目录下的相关内容。其中内容有很多,这里主要介绍一下编译器相关的那些,首先看下图f905e507d64e41bf53ae9b2a826f2939.png我们可以手动提取其编译器,来作为命令行工具使用。但是对于 IAR 还是不建议这么用,个人感觉 IAR 在设计时,估计没考虑过让用户使用命令行模式来独立使用编译套件,因为其编译套件和其他好多东西都放在了一个目录中,不像ARM 将编译套件独立存放。

但是,IAR 的编译套件是支持命令行使用的 ,在其介绍文档中有这么一句话:The compiler, assembler, and linker can also be run from a command line environment,if you want to use them as external tools in an already established project environment. 官方的介绍文档主要就是《 IAR C/C++ Development Guide Compiling and Linking》。

  1. IAR 我用的比较少,主要内容来自于官方文档。管方文档更加详细,如有疑问直接去官方文档查看即可!官方文档目录为

  2. IAR安装目录\arm\doc

    。具体如下:

    1. 《 IAR C/C++ Development Guide Compiling and Linking》,文档名为 EWARM_DevelopmentGuide.ENU.pdf

    2. 《IAR Assembler Reference Guide》,文档名为 EWARM_AssemblerReference.ENU.pdf

    3. 《C-STAT? Static Analysis Guide》,文档名为 EW_MisraC1998Reference.ENU.pdf

  3. 还可以直接从 IAR 的 IDE 的菜单进入:菜单 -> helpe215b6ff275138010c823cdc81d73ccc.png

iasmarm.exe

这个是 IAR 的汇编语言的编译器。官方文档是这么介绍的:The IAR Assembler for Arm is a powerful relocating macro assembler with a versatile set of directives and expression operators. The assembler features a built-in C language preprocessor and supports conditional assembly. 大意就是:IAR Assembler for Arm 是一个功能强大的重定位宏汇编程序,具有多种指令和表达式运算符。汇编程序具有内置的 C 语言预处理程序,并支持条件汇编。该工具官方有个独立的说明文档《IAR Assembler Reference Guide》,里面有该工具的详细使用说明。

  1. E:\Program Files (x86)\IAR Systems\Embedded Workbench 8.2\arm\bin>iasmarm
  2.    IAR Assembler V8.32.3.193/W32 for ARM
  3.    Copyright 1999-2019 IAR Systems AB.
  4. Usage:        iasmarm {<options>} <sourcefile> {<options>}
  5. Sourcefile:   source file with default extension: .msa, , .asm, or .s
  6. Environment:  IASMARM
  7. Options (specified order is of no importance):
  8. -B            Print debug info for assembler macros
  9. -c{DEAOM}     Listing options
  10.                 D: Disable listing,             E: Disable macro expansion
  11.                 A: List only assembled part     O: List several lines of code
  12.                 M: List Macro definition
  13. -DSYMB        Equivalent to: #define SYMB 1
  14. -DSYMB=xx     Equivalent to: #define SYMB xx
  15. -e            Use big-endian byte order
  16. -Enumber      Allow <number> errors
  17. -f file       Extend command line with <file> <.xcl>
  18. -g            No system include
  19. -G            Open standard input as source
  20. -i            List #included files
  21. -Ipath        Add #include search path
  22. -j            Enable alternative register names, operators and mnemonics
  23. -l file       Generate a list on: <file> <.lst>
  24. -Lpath        Generate a list on: <path> \ <source> <.lst>
  25. -Mab          Change asm.macro argument quote chars,
  26.                  where a is start-of-quote and b is end-of-quote char.
  27.                  default is a == < and b == >.
  28. -N            No header in listing
  29. -o file       Put object  on: <file> <.o>
  30. -Opath        Put object on: <path> \ <source> <.o>
  31. -pnn          Page listing with 'nn' lines/page (10-150)
  32. -r            Enable debugger output in object
  33. -S            Silent operation of assembler
  34. -s{+|-}       Set case sensitivity for user symbols
  35.                 -s and -s+ enables sensitivity, -s- disables it.
  36. -tn           Set tab spacing between 2 and 9 (default 8)
  37. -USYMB        Equivalent to: #undef SYMB
  38. -ws           To make warnings generate exit code 1
  39. -wstring      Disable warnings
  40.                 string: <+|-,><+|-range><,+|-range>...
  41.                 range: low_warning_nr<-high_warning_nr>
  42.                 example: -w turns all warnings off
  43.                          -w-,+10-12,+20 turns all but 10,11,12 and 20 off
  44. -x{DI2}       Generate cross-reference list
  45.                 D: Show all #defines, I: Show Internal table
  46.                 2: Dual line space listing
  47. --aarch64     Generate code for AArch64, same as --cpu_mode A64
  48. --abi {lp64|ilp32}
  49.              Specify ABI for AArch64: ilp32 or lp64.
  50. --arm         Generate code in arm mode, same as --cpu_mode arm
  51. --cmse
  52.              Target secure mode in CMSE (ARMv8-M security extensions)
  53. --cpu core    Specify target core
  54.                 Valid options are core names such as Cortex-M3
  55.                 and architecture names such as 7M
  56.                 Default is Cortex-M3
  57. --cpu_mode {arm|a|thumb|t}
  58.              Select default mode for CODE directive, ARM is default
  59. --endian {little|l|big|b}
  60.              Specify target byte order
  61. --fpu {VFPv1|VFPv2|VFPv3{_D16}{_FP16}|VFP9-S|none}
  62.              Specify target FPU coprocessor support
  63.                 Default is none, which selects the software
  64.                 floating-point library.
  65. --legacy {legacyOption}
  66.              Generate object files compatible with
  67.              older toolchains. Valid options are:
  68.              RVCT3.0
  69. --no_dwarf3_cfi
  70.              Suppress Dwarf 3 Call Frame Information instructions
  71. --no_it_verification
  72.              Do not verify that the instructions following
  73.              an IT instruction has the correct condition set
  74. --no_literal_pool
  75.              Use MOV32 for LDR Rd,=expr (requires ARMv7-M)
  76. --no_path_in_file_macros
  77.              Strip path from __FILE__ macros
  78. --source_encoding {locale|utf8}
  79. Encoding to use for source files with no BOM
  80. --suppress_vfe_header
  81.              Do not generate VFE header info
  82. --system_include_directory <path>
  83.              Set system header directory
  84. --thumb       Generate code in thumb mode, same as --cpu_mode thumb
  85. --version     Output version info and exit

iccarm.exe

这个是 IAR 的 C/C++ 编译器。官方文档是这么介绍的:The IAR C/C++ Compiler for Arm is a state-of-the-art compiler that offers the standard features of the C and C++ languages, plus extensions designed to take advantage of the Arm-specific facilities.

大意就是:IAR C / C ++ Compiler for Arm是一个最先进的编译器,提供 C 和 C++ 语言的标准功能,以及旨在利用 Arm 特定功能的扩展。??默认使用的头文件目录.\arm\inc\<vendor>

  1. E:\Program Files (x86)\IAR Systems\Embedded Workbench 8.2\arm\bin>iccarm
  2.   IAR ANSI C/C++ Compiler V8.32.3.193/W32 for ARM
  3.   Copyright 1999-2019 IAR Systems AB.
  4.   PC-locked license - IAR Embedded Workbench for ARM
  5. Available command line options:
  6. --aapcs {std|vfp}
  7.                Specify calling convention.
  8. --aeabi         Generate aeabi compliant code
  9. --align_sp_on_irq
  10.                Generate code to align SP on entry to __irq functions
  11. --arm           Generate code in arm mode, same as --cpu_mode arm
  12. --c++           C++
  13. --c89           Use C89 standard
  14. --char_is_signed
  15.                'Plain' char is treated as signed char
  16. --char_is_unsigned
  17.                'plain' char is treated as unsigned char
  18. --cmse          Enable CMSE secure object generation
  19. --cpu core      Specify target core
  20.                Valid options are core names such as Cortex-M3
  21.                and architecture names such as 7M
  22.                Cortex-M3 is default
  23. --cpu_mode {arm|a|thumb|t}
  24.                Select default mode for functions, arm is default
  25. -D symbol[=value]
  26.                Define macro (same as #define symbol [value])
  27. --debug
  28. -r              Insert debug info in object file
  29. --dependencies=[i|m|n][s][lw][b] file|directory|+
  30.                List file dependencies
  31.                   i     Include filename only (default)
  32.                   m     Makefile style (multiple rules)
  33.                   n     Makefile style (one rule)
  34.                   s     Don't include system file dependencies
  35.                   l     Use locale encoding instead of UTF-8
  36.                   w     Use little endian UTF-16 instead of UTF-8
  37.                   b     Use a Byte Order Mark in UTF-8 output
  38.               (+: output same as -o, only with .d extension)
  39. --deprecated_feature_warnings [+|-]feature,[+|-]feature,...
  40.                Enable (+) or disable (-) warnings about deprecated features:
  41.                   attribute_syntax         Warn about attribute syntax that
  42.                                            will change
  43.                   preprocessor_extensions  Warn about use of migration
  44.                                            preprocessor extensions
  45.                   segment_pragmas          Warn about use of #pragma constseg/
  46.                                            dataseg/memory
  47. --diagnostics_tables file|directory
  48.                Dump diagnostic message tables to file
  49. --diag_error tag,tag,...
  50.                Treat the list of tags as error diagnostics
  51. --diag_remark tag,tag,...
  52.                Treat the list of tags as remark diagnostics
  53. --diag_suppress tag,tag,...
  54.                Suppress the list of tags as diagnostics
  55. --diag_warning tag,tag,...
  56.                Treat the list of tags as warning diagnostics
  57. --discard_unused_publics
  58.                Discard unused public functions and variables
  59. --dlib_config name|path
  60.                Specify DLib library configuration
  61. --do_explicit_zero_opt_in_named_sections
  62.                Allow zero init optimization for variables in named
  63.                sections/segments
  64. -e              Enable IAR C/C++ language extensions
  65. --enable_hardware_workaround waid[,waid[...]]
  66.                Generate hardware workaround for specified problem
  67. --enable_restrict
  68.                Enable the restrict keyword
  69. --endian {little|l|big|b}
  70.                Select byte order, little-endian is default
  71. --enum_is_int   Force the size of all enumeration types to be at least 4 bytes
  72. --error_limit limit
  73.                Stop after this many errors (0 = no limit)
  74. -f file         Read command line options from file
  75. --f file        Read command line options from file and report dependency
  76. --fpu {VFPv2|VFPv3{_D16}{_FP16}|VFPv4{_sp}|VFP9-S|none}
  77.                Specify target FPU coprocessor support
  78.                Default is none, which selects the software
  79.                floating-point library.
  80. --generate_entries_without_bounds
  81.                Generate functions for use from non-instrumented code
  82. --guard_calls   Use a guard call for a function static initialization
  83. --header_context
  84.                Adds include file context to diagnostics
  85. -I directory    Add #include search directory
  86. --ignore_uninstrumented_pointers
  87.                Disable checking of accesses via pointers from uninstrumented
  88.                functions
  89. -l[c|C|D|E|a|A|b|B][N][H] file|directory
  90.                Output list file
  91.                   c     C source listing
  92.                   C        with assembly code
  93.                   D        with pure assembly code
  94.                   E        with non-sequential assembly code
  95.                   a     Assembler file
  96.                   A        with C source
  97.                   b     Basic assembler file
  98.                   B        with C source
  99.                   N     Do not include diagnostics
  100.                   H     Include header file source lines
  101. --lock_regs registers
  102.                Prevent compiler from using specified registers (R4-R11).
  103. --macro_positions_in_diagnostics
  104.                Use positions inside macros in diagnostics
  105. --make_all_definitions_weak
  106.                Make all variable and function definitions weak
  107. --max_cost_constexpr_call limit
  108.                Maximum cost (number of calls/number of loop iterations) when
  109.                evaluating a top-level constexpr call
  110. --max_depth_constexpr_call limit
  111.                Maximum depth of recursion when evaluating a top-level
  112.                constexpr call
  113. --mfc           Enable multiple file compilation
  114. --misrac1998[=arg,arg,...]
  115.                Enable MISRA-C 1998 diagnostics
  116.                    all       Enable all rules
  117.                    required  Enable all required rules
  118.                    i         Enable rule i
  119.                    i-j       Enable rule i through j
  120.                    ~i        Disable rule i
  121.                    ~i-j      Disable rule i through j
  122. --misrac2004[=arg,arg,...]
  123.                Enable MISRA-C 2004 diagnostics
  124.                    all       Enable all rules
  125.                    required  Enable all required rules
  126.                    X         Enable rule or chapter
  127.                    X-Y       Enable range
  128.                    ~X        Disable rule or chapter
  129.                    ~X-Y      Disable range
  130.                  where X and Y is one of:
  131.                    i         All rules in chapter i
  132.                    i.j       Rule i.j
  133. --misrac_verbose
  134.                Enable verbose MISRA C messages
  135. --nonportable_path_warnings
  136.                Enable warning for non-matching case in paths
  137. --no_alignment_reduction
  138.                Disable alignment reduction of simple thumb functions
  139. --no_bom        Don't use a Byte Order Mark in Unicode output
  140. --no_call_frame_info
  141.                Suppress output of call frame information
  142. --no_clustering Disable static clustering for static and global variables
  143. --no_code_motion
  144.                Disable code motion
  145. --no_const_align
  146.                Turn off the alignment optimization for constants
  147. --no_cse        Disable common sub-expression elimination
  148. --no_exceptions Disable C++ exception support
  149. --no_fragments  Do not generate section fragments
  150. --no_inline     Disable function inlining
  151. --no_literal_pool
  152.                Generate code that does not issue read request to .text
  153. --no_loop_align Disable alignment of labels in loops (Thumb2)
  154. --no_mem_idioms Disable idiom recognition for memcpy/memset/memclr
  155. --no_path_in_file_macros
  156.                Strip path from __FILE__ and __BASE_FILE__ macros
  157. --no_rtti       Disable C++ runtime type information support
  158. --no_rw_dynamic_init
  159.                Don't allow C-object to be initialized at runtime
  160. --no_scheduling Disable instruction scheduling
  161. --no_size_constraints
  162.                Remove limits for code expansion
  163. --no_static_destruction
  164.                Do not emit code to destroy C++ static variables
  165. --no_system_include
  166.                Do not search in the default system header directory
  167. --no_tbaa       Disable type based alias analysis
  168. --no_typedefs_in_diagnostics
  169.                Do not use typedefs when printing types
  170. --no_unaligned_access
  171.                Don't generate unaligned accesses
  172. --no_uniform_attribute_syntax
  173.                Use old meaning for IAR type attributes before initial type
  174. --no_unroll     Disable loop unrolling
  175. --no_var_align  Turn off the alignment optimization for variables
  176. --no_warnings   Disable generation of warnings
  177. --no_wrap_diagnostics
  178.                Don't wrap long lines in diagnostic messages
  179. -O[n|l|m|h|hs|hz]
  180.                Select level of optimization:
  181.                   n   No optimizations
  182.                   l   Low optimizations (default)
  183.                   m   Medium optimizations
  184.                   h   High optimizations
  185.                   hz  High optimizations, tuned for small code size
  186.                   hs  High optimizations, tuned for high speed
  187.                       (-O without argument) The same setting as -Oh
  188. --only_stdout   Use stdout only (no console output on stderr)
  189. --output file|path
  190. -o file|path    Specify object file
  191. --pending_instantiations limit
  192.                Maximum number of instantiations of a given template in
  193.                progress at a time (0 -> no limit)
  194. --predef_macros file|directory
  195.                Output predefined macros
  196. --preinclude filename
  197.                Include file before normal source
  198. --preprocess=[c][n][s] file|directory
  199.                Preprocessor output
  200.                   c     Include comments
  201.                   n     Preprocess only
  202.                   s     Suppress #line directives
  203. --public_equ symbol[=value]
  204.                Define public assembler symbol (EQU)
  205. --relaxed_fp    Enable floating point optimizations that may affect the result
  206. --remarks       Enable generation of remarks
  207. --require_prototypes
  208.                Require prototypes for all called or public functions
  209. --ropi          Generate read-only position independent code
  210. --runtime_checking check,check,...
  211.                Instrument code to do runtime checks for the selected problems:
  212.                   bounds              Check pointer bounds
  213.                   bounds_no_checks    Track pointer bounds, but emit no checks
  214.                   div_by_zero         Check division by zero
  215.                   implicit_integer_conversion
  216.                                       Check only implicit integer conversion
  217.                   integer_conversion  Check any integer conversion
  218.                   signed_overflow     Check for signed integer overflow
  219.                   signed_shift        Check for overflow in signed shift
  220.                   switch              Check for unhandled cases in switch
  221.                                       statements
  222.                   unsigned_overflow   Check for unsigned integer overflow
  223.                   unsigned_shift      Check for overflow in unsigned shift
  224. --rwpi          Generate read-write position independent code
  225. --rwpi_near     Generate read-write position independent code
  226. --section section-name=new section-name
  227.                Rename section
  228. --silent        Silent operation
  229. --source_encoding {locale|utf8}
  230.                Encoding to use for source files with no BOM
  231. --stack_protection
  232.                Insert stack smash protection
  233. --strict        Strict C/C++ standard language rules
  234. --system_include_dir directory
  235.                Set system header directory
  236. --text_out encoding
  237.                Encoding to use for text output files
  238.                   utf8                UTF-8
  239.                   utf16le             Little-endian UTF-16
  240.                   utf16be             Big-endian UTF-16
  241.                   locale              Locale specific encoding
  242. --thumb         Generate code in thumb mode, same as --cpu_mode thumb
  243. --uniform_attribute_syntax
  244.                Same syntax for IAR type attributes as for const/volatile
  245. --use_c++_inline
  246.                Use C++ inline semantics in C mode
  247. --use_paths_as_written
  248.                Use paths as written in debug information
  249.               (normally absolute paths are used)
  250. --use_unix_directory_separators
  251.                Use forward slashes in paths in debug information
  252. --utf8_text_in  Non-source text input files with no BOM use UTF-8 encoding
  253. --vectorize     Perform autovectorization
  254. --version       Output version information and exit
  255. --vla           Allow variable length arrays
  256. --warnings_affect_exit_code
  257.                Warnings affect exit code
  258. --warnings_are_errors
  259.                All warnings are errors
  260. --warn_about_c_style_casts
  261.                Warn about uses of C-style casts in EC++/C++

IDE中有两个工具可将应用程序源文件转换为中间文件目标文件。IAR C / C ++编译器和IAR汇编器。两者都产生行业标准格式ELF中的可重定位目标文件,包括DWARF调试信息的格式。下图显示了编译过程:2afe7fcb1af4b38609e2061ef732bf75.jpeg

ilinkarm.exe

这个是 IAR 的连接器。官方文档是这么介绍的:The IAR ILINK Linker for Arm is a powerful, flexible software tool for use in the development of embedded controller applications. It is equally well suited for linking small, single-file, absolute assembler programs as it is for linking large, relocatable input, multi-module, C/C++, or mixed C/C++ and assembler programs.

大意就是:IAR ILINK Linker for Arm 是一款功能强大,灵活的软件工具,可用于嵌入式控制器应用程序的开发。它同样适用于链接小型,单文件,绝对汇编程序,因为它用于链接大型可重定位输入,多模块,C/C++ 或混合 C/ C++ 和汇编程序。??ilinkarm 使用并生成行业标准的 ELF 和 DWARF 作为对象格式文件。在.\arm\config目录下,包含了针对各平台的连接器使用的配置文件。

  1. E:\Program Files (x86)\IAR Systems\Embedded Workbench 8.2\arm\bin>ilinkarm
  2.   IAR ELF Linker V8.32.3.193/W32 for ARM
  3.   Copyright 2007-2019 IAR Systems AB.
  4. Available command line options:
  5. --advanced_heap Use an advanced heap manager.
  6. --basic_heap    Use a basic heap manager
  7. --BE32          Use old type big-endian mode.
  8. --BE8           Use byte invariant mode.
  9. --bounds_table_size number_of_records[:number_of_buckets]|(number_of_bytes)
  10.                Specify size of bounds checking tables
  11. --call_graph file|directory
  12.                Produce an XML call graph file
  13. --config file   Read linker configuration from file
  14. --config_def symbol=value
  15.                Define a config symbol
  16. --config_search directory
  17.                Look for config files in directory
  18. --cpp_init_routine symbol
  19.                Specify C++ dynamic init routine name
  20. --cpu core      Specify target core
  21.                Valid options are core names such as Cortex-M3
  22.                and architecture names such as 7M
  23.                default is extracted from objects
  24. --debug_heap    Use heap with runtime checks
  25. --default_to_complex_ranges
  26.                Make "complex ranges" the default in initialize directives
  27. --define_symbol symbol=value
  28.                Define absolute symbol
  29. --dependencies=[i|m|n][s][lw][b] file|directory|+
  30.                List file dependencies
  31.                   i     Include filename only (default)
  32.                   m     Makefile style (multiple rules)
  33.                   n     Makefile style (one rule)
  34.                   s     Don't include system file dependencies
  35.                   l     Use locale encoding instead of UTF-8
  36.                   w     Use little endian UTF-16 instead of UTF-8
  37.                   b     Use a Byte Order Mark in UTF-8 output
  38.               (+: output same as -o, only with .d extension)
  39. --diagnostics_tables file|directory
  40.                Dump diagnostic message tables to file
  41. --diag_error tag,tag,...
  42.                Treat the list of tags as error diagnostics
  43. --diag_remark tag,tag,...
  44.                Treat the list of tags as remark diagnostics
  45. --diag_suppress tag,tag,...
  46.                Suppress the list of tags as diagnostics
  47. --diag_warning tag,tag,...
  48.                Treat the list of tags as warning diagnostics
  49. --do_segment_pad
  50.                Pad segments to 4 byte alignment
  51. --enable_hardware_workaround waid[,waid[...]]
  52.                Generate hardware workaround for specified problem
  53. --enable_stack_usage
  54.                Enable stack usage analysis
  55. --entry symbol  Set program entry point
  56. --error_limit limit
  57.                Stop after this many errors (0 = no limit)
  58. --exception_tables action
  59.                Generate exception tables for modules lacking them
  60.                  nocreate    Do not generate entries (default)
  61.                  unwind      Generate unwind entries
  62.                  cantunwind  Generate nounwind entries
  63. --export_builtin_config file|directory
  64.                Export the builtin configuration
  65. --extra_init routine
  66.                Call extra init routine if defined
  67. -f file         Read command line options from file
  68. --f file        Read command line options from file and report dependency
  69. --force_exceptions
  70.                Always include exception code
  71. --force_output  Produce an output file in spite of errors
  72. --fpu {VFPv1|VFPv2|VFPv3{_D16}{_FP16}|VFP9-S|none}
  73.                Specify target FPU coprocessor support
  74.                Default is extracted from objects.
  75. --ignore_uninstrumented_pointers
  76.                Disable checking of accesses via pointers in memory with
  77.                no bounds
  78. --image_input file[,symbol[,section[,alignment]]]
  79.                Put image file in section
  80. --import_cmse_lib_in file
  81.                Read previous version of import library for building non-secure image
  82. --import_cmse_lib_out file|directory
  83.                Produce import library for building non-secure image
  84. --inline        Try to inline small functions.
  85. --keep symbol   Require global symbol
  86. --log topic,topic,...
  87.                Do log output for the selected topics
  88.                   call_graph        Call graph with stack usage
  89.                   crt_routine_selection
  90.                                     CRT routine implementation selection
  91.                   demangle          Demangle symbols in log output
  92.                   fragment_info     Supplementary info for --log sections
  93.                   initialization    Initialization decisions
  94.                   inlining          Small function inlining
  95.                   libraries         Automatic library selection
  96.                   merging           Results of --merge_duplicate_sections
  97.                   modules           Module selection
  98.                   redirects         Redirected symbols
  99.                   sections          Section fragment selection
  100.                   unused_fragments  Unused section fragments
  101.                   veneers           Veneer statistics
  102. --log_file file Specify file for log output
  103. --mangled_names_in_messages
  104.                Include mangled symbol names in diagnostics
  105. --manual_dynamic_initialization
  106.                Don't perform dynamic initialization during startup
  107. --map file|directory
  108.                Produce a linker list file
  109. --merge_duplicate_sections
  110.                Merge equivalent read-only sections
  111. --misrac1998[=arg,arg,...]
  112.                Enable MISRA-C 1998 diagnostics
  113.                    all       Enable all rules
  114.                    required  Enable all required rules
  115.                    i         Enable rule i
  116.                    i-j       Enable rule i through j
  117.                    ~i        Disable rule i
  118.                    ~i-j      Disable rule i through j
  119. --misrac2004[=arg,arg,...]
  120.                Enable MISRA-C 2004 diagnostics
  121.                    all       Enable all rules
  122.                    required  Enable all required rules
  123.                    X         Enable rule or chapter
  124.                    X-Y       Enable range
  125.                    ~X        Disable rule or chapter
  126.                    ~X-Y      Disable range
  127.                  where X and Y is one of:
  128.                    i         All rules in chapter i
  129.                    i.j       Rule i.j
  130. --misrac_verbose
  131.                Enable verbose MISRA C messages
  132. --no_bom        Don't use a Byte Order Mark in Unicode output
  133. --no_dynamic_rtti_elimination
  134.                Disable dynamic rtti elimination
  135. --no_entry      This program has no entry point
  136. --no_exceptions Signal an error if exceptions are used
  137. --no_fragments  Always link entire sections
  138. --no_free_heap  Use a heap manager with no 'free'
  139. --no_inline func,func,...
  140.                Do not inline any of the specified functions
  141. --no_library_search
  142.                Disable automatic runtime library search
  143. --no_literal_pool
  144.                Don't generate literal pool in code memory
  145. --no_locals     Do not include local symbols in output symbol table
  146. --no_range_reservations
  147.                Do not reserve address ranges for absolute symbols
  148. --no_remove     Do not remove unused sections
  149. --no_vfe        Disable Virtual Fuction Elimination
  150. --no_warnings   Disable generation of warnings
  151. --no_wrap_diagnostics
  152.                Don't wrap long lines in diagnostic messages
  153. --only_stdout   Use stdout only (no console output on stderr)
  154. --output file
  155. -o file         Specify output file
  156. --pi_veneers    Generate position independent veneers.
  157. --place_holder symbol[,size[,section[,alignment]]]
  158.                Reserve a place in ROM for later use
  159. --preconfig file
  160.                Read before normal linker configuration file
  161. --printf_multibytes
  162.                Enable multibyte support in printf & friends
  163. --redirect orig=replacement
  164.                Redirect symbol refs to replacement symbol
  165. --remarks       Enable generation of remarks
  166. --scanf_multibytes
  167.                Enable multibyte support in scanf & friends
  168. --search directory
  169. -L directory    Look for object and library files in directory
  170. --semihosting[=iar_breakpoint]
  171.                Link with debug interface.
  172.                Specify interface to override default.
  173. --silent        Silent operation
  174. --stack_usage_control file
  175.                Read stack usage control file
  176. --strip         Do not include debug information
  177. --text_out encoding
  178.                Encoding to use for text output files
  179.                   utf8                UTF-8
  180.                   utf16le             Little-endian UTF-16
  181.                   utf16be             Big-endian UTF-16
  182.                   locale              Locale specific encoding
  183. --threaded_lib  Configure runtime library for use with threads
  184. --timezone_lib  Enable timezone and daylight savings support
  185. --treat_rvct_modules_as_softfp
  186.                link softfp versions of math function for modules
  187.                compiled with RVCT even though they are built with
  188.                vfp calling-convention
  189. --use_full_std_template_names
  190.                Don't use short names for standard C++ templates
  191. --use_optimized_variants no|auto|small|fast
  192.                Use optimized variants of DLIB library functions
  193.                  no     Do not use redirects to use optimized variants
  194.                  auto   Use redirects based on attributes in object files
  195.                         (default)
  196.                  small  Always use a small variant if available
  197.                  fast   Always use a fast variant if available
  198. --utf8_text_in  Non-source text input files with no BOM use UTF-8 encoding
  199. --version       Output version information and exit
  200. --vfe=[forced]  Perform Virtual Function Elimination
  201.                  forced      Force the use of VFE for all modules
  202.                              with VFE information.
  203. --warnings_affect_exit_code
  204.                Warnings affect exit code
  205. --warnings_are_errors
  206.                All warnings are errors
  207. --whole_archive archive
  208.                Link all modules in archive

IAR ILINK链接器(ilinkarm.exe)用于构建最终应用程序。通常,链接器需要以下信息作为输入:

  • 几个目标文件,可能还有某些库

  • 程序开始标签(默认设置)

  • 链接器配置文件,用于描述目标系统内存中代码和数据的放置

下图显示了链接过程:33f08b18fdd8c70d5c43e2f300a9fa87.jpegIAR ILINK链接器生成ELF格式的绝对目标文件,其中包含可执行镜像。链接后,可以使用生成的绝对可执行映像

  • 加载到IAR C-SPY调试器或任何其他兼容的外部调试器读取ELF和DWARF。

  • 使用flash / PROM编程器对flash / PROM进行编程。在此之前可能必须使用ielftool将镜像中的实际字节转换为标准的Motorola 32-bit S-record 格式或Intel Hex-32格式。

iarchive.exe

??档案管理工具,类似于 ARM 的 armar 和 GCC 的 ar。用于创建和操作几个ELF目标文件的库(存档)。库文件包含多个可重定位的 ELF 对象模块,每个模块都可以由链接器独立使用。与直接指定给链接器的对象模块相比,只有在需要时才包含库中的每个模块。

  1. E:\Program Files (x86)\IAR Systems\Embedded Workbench 8.2\arm\bin>iarchive
  2.   IAR Archive Tool V10.4.14.1149
  3.   Copyright 2008-2019 IAR Systems AB.
  4. Usage:          iarchive [command] archive obj1 ... objN
  5.                iarchive [command] obj1 ... objN -o archive
  6.                iarchive [command] archive
  7. Available command line options:
  8. --create        Create new archive
  9. --delete
  10. -d              Delete module(s) from archive
  11. --extract
  12. -x              Extract module(s) from archive
  13. -f file         Read command line options from file
  14. --f file        Read command line options from file and report dependency
  15. --no_bom        Don't use a Byte Order Mark in Unicode output
  16. --output archive
  17. -o archive      Name of archive file
  18. --replace
  19. -r              Replace or add module(s) to archive
  20. --symbols       List symbol table of archive
  21. --text_out encoding
  22.                Encoding to use for text output files
  23.                   utf8                UTF-8
  24.                   utf16le             Little-endian UTF-16
  25.                   utf16be             Big-endian UTF-16
  26.                   locale              Locale specific encoding
  27. --toc
  28. -t              List archive table of content
  29. --utf8_text_in  Non-source text input files with no BOM use UTF-8 encoding
  30. --verbose
  31. -V              verbose operation
  32. --version       Output version information and exit
  33. --vtoc          List archive table of content (verbose)
  34. 123456789101112131415161718192021222324252627282930313233343536

使用示例:

  1. 使用源对象文件module1.omodule.2.omodule3.o 创建了一个名为mylibrary.a的库文件:iarchive mylibrary.a module1.o module2.o module3.o

  2. 列出 mylibrary.a中的内容:iarchive --toc mylibrary.a

  3. This example replaces module3.o in the library with the content in the module3.o file and appends module4.o to mylibrary.a:iarchive --replace mylibrary.a module3.o module4.o

ielftool.exe

?ARM ELF 文件工具,类似于 ARM 的 fromelf 和 GCC 的 elfedit。对 ELF 可执行映像执行各种转换(例如,填充,校验和,格式转换等)。安装目录.\arm \ src\elfutils下提供了 ielftool 源代码(Microsoft VisualStudio项目)。如果对如何生成校验和或格式转换要求有特定要求,则可以相应地修改源代码。

  1. E:\Program Files (x86)\IAR Systems\Embedded Workbench 8.2\arm\bin>iarchive
  2.   IAR Archive Tool V10.4.14.1149
  3.   Copyright 2008-2019 IAR Systems AB.
  4. Usage:          iarchive [command] archive obj1 ... objN
  5.                iarchive [command] obj1 ... objN -o archive
  6.                iarchive [command] archive
  7. Available command line options:
  8. --create        Create new archive
  9. --delete
  10. -d              Delete module(s) from archive
  11. --extract
  12. -x              Extract module(s) from archive
  13. -f file         Read command line options from file
  14. --f file        Read command line options from file and report dependency
  15. --no_bom        Don't use a Byte Order Mark in Unicode output
  16. --output archive
  17. -o archive      Name of archive file
  18. --replace
  19. -r              Replace or add module(s) to archive
  20. --symbols       List symbol table of archive
  21. --text_out encoding
  22.                Encoding to use for text output files
  23.                   utf8                UTF-8
  24.                   utf16le             Little-endian UTF-16
  25.                   utf16be             Big-endian UTF-16
  26.                   locale              Locale specific encoding
  27. --toc
  28. -t              List archive table of content
  29. --utf8_text_in  Non-source text input files with no BOM use UTF-8 encoding
  30. --verbose
  31. -V              verbose operation
  32. --version       Output version information and exit
  33. --vtoc          List archive table of content (verbose)
  34. E:\Program Files (x86)\IAR Systems\Embedded Workbench 8.2\arm\bin>ielftool
  35.   IAR ELF Tool V10.4.14.1149 [BUILT at IAR]
  36.   Copyright 2007-2019 IAR Systems AB.
  37. Usage:       ielftool input_file output_file
  38. Available command line options:
  39. --bin           Save as raw binary
  40. --checksum sym:size,algo[:[1|2][a|m|z][r][R][o][x][i|p][W|L]][,start]
  41.           ;range[;range...]
  42.                Generate checksum
  43.                   sym       Checksum symbol
  44.                   size      Length of the symbol in bytes
  45.                   algo      Algorithm: sum, sum8wide, sum32, crc16, crc32
  46.                             crc64iso, crc64ecma or crc=poly
  47.                   1|2       Complement: 1 or 2
  48.                   a|m|z     Reverse the bit order for:
  49.                               input bytes only: a
  50.                               input bytes and final checksum: m
  51.                               final checksum only: z
  52.                   o         Output the Rocksoft model specification
  53.                   r         Reverse the byte order within each word
  54.                   R         Traverse the range(s) in reverse order
  55.                   x         Toggle the endianess of the checksum
  56.                   i|p       Use initial value normally: i
  57.                             Prefix input data with the start value: p
  58.                   W|L       Use a checksum unit length of 2 bytes: W
  59.                             Use a checksum unit length of 4 bytes: L
  60.                   start     Initial checksum value (defaults to 0)
  61.                   range     Do checksum of bytes in range
  62. --fill [v;]pattern;range[;range...]
  63.                Specify fill
  64.                   v         Virtual fill, do not generate actual filler bytes.
  65.                             This can be used for checksums and parities.
  66.                   pattern   Sequence of filler bytes
  67.                   range     Fill range
  68. --front_headers Move program and section headers to the front of the ELF file.
  69. --ihex          Save as 32-bit linear Intel Extended hex
  70. --offset [-]offset
  71.                Add (subtract if - is used) offset to all address records.
  72.                This only works for the output formats: Motorola S-records,
  73.                Intel Hex, Simple-Code and TI-TXT
  74. --parity sym:size,algo:flashbase[:[r][[B|W|L]];range[;range...]
  75.                Generate parity bits
  76.                   sym       Parity symbol
  77.                   size      Length of the symbol in bytes
  78.                   algo      Parity algorithm: odd, even
  79.                   flashbase Ignore bytes before this address
  80.                   r         Traverse the range(s) in reverse order
  81.                   B         Use a parity unit length of 1 byte
  82.                   W         Use a parity unit length of 2 bytes
  83.                   L         Use a parity unit length of 4 bytes
  84.                   range     Perform parity on bytes in this range
  85. --self_reloc relocator[,jtc]
  86.                Create self-relocating image with relocator
  87.                   jtc       Number of jump table entries
  88. --silent        Silent operation
  89. --simple        Save as Simple-code
  90. --simple-ne     Save as Simple-code without entry record
  91. --srec          Save as Motorola S-records
  92. --srec-len length
  93.                Restrict the length of S-records
  94. --srec-s3only   Restrict the type of S-records to S3 (and S7)
  95. --strip         Remove all section headers and non-program sections
  96. --titxt         Save as Texas Instruments TI-TXT
  97. --verbose       Print all performed operations
  98. --version       Output tool version

使用示例:

  1. This example fills a memory range with 0xFF and then calculates a checksum on the same range:ielftool my_input.out my_output.out --fill 0xFF;0–0xFF --checksum __checksum:4,crc32;0–0xFF

ielfdumparm.exe

针对 ARM ELF 格式的文件的 Dumper工具。类似于 GCC 的 objdump,用于创建ELF可重定位或可执行映像内容的文本表示。主要用于以下三个方面:

  • To produce a listing of the general properties of the input file and the ELF segments and ELF sections it contains. This is the default behavior when no command line options are used.生成输入文件的常规属性列表以及它包含的ELF段和ELF节。当没有使用命令行选项时,这是默认行为。

  • To also include a textual representation of the contents of each ELF section in the input file. To specify this behavior, use the command line option --all .还包括输入文件中每个ELF部分内容的文本表示。要指定此行为,请使用命令行选项–all。

  • To produce a textual representation of selected ELF sections from the input file. To specify this behavior, use the command line option --section 从输入文件生成所选ELF节的文本表示。要指定此行为,请使用命令行选项–section

  1. E:\Program Files (x86)\IAR Systems\Embedded Workbench 8.2\arm\bin>ielfdumparm
  2.   IAR ELF Dumper V8.32.3.193 for ARM
  3.   Copyright 2007-2019 IAR Systems AB.
  4. Usage:          IElfDump input_file [output_file]
  5. Available command line options:
  6. -a              All sections, except strtab sections
  7. --aarch64       Disassemble in Aarch64 mode if mode cannot be deduced by the image.
  8. --all           Dump all sections
  9. --arm           Disassemble in Arm mode if mode cannot be deduced by the image.
  10. --code          Dump only code sections
  11. --disasm_data   Use disassembly format for data sections
  12. -f file         Read command line options from file
  13. --f file        Read command line options from file and report dependency
  14. --no_bom        Don't use a Byte Order Mark in Unicode output
  15. --no_header     Do not produce a list header
  16. --no_rel_sections
  17.                Do not output associated .rel sections
  18. --no_strtab     Do not include strtab sections
  19. --no_utf8_in    Non-IAR input files are by default assumed to use UTF-8
  20.                encoding unless this option is used.
  21. --output file
  22. -o file         Name of text file to create
  23. --range A-B     Disassemble only addresses in the specified range
  24.               (from A to B).
  25. --raw           Use raw text format
  26. --section #|name[,...]
  27. -s #|name[,...] Dump only section(s) with given numbers/names
  28. --source        Include source in disassembled code in executables
  29. --text_out encoding
  30.                Encoding to use for text output files
  31.                   utf8                UTF-8
  32.                   utf16le             Little-endian UTF-16
  33.                   utf16be             Big-endian UTF-16
  34.                   locale              Locale specific encoding
  35. --thumb         Disassemble in thumb mode if mode cannot be deduced by the image.
  36. --use_full_std_template_names
  37.                Don't use short names for standard C++ templates
  38. --utf8_text_in  Non-source text input files with no BOM use UTF-8 encoding
  39. --version       Output version information and exit

iobjmanip.exe

针对 ARM ELF 格式的 Object 文件的操作工具。用于执行ELF目标文件的低级操作。

  1. E:\Program Files (x86)\IAR Systems\Embedded Workbench 8.2\arm\bin>iobjmanip
  2.   IAR Object File Manipulator V10.4.14.1149
  3.   Copyright 2009-2019 IAR Systems AB.
  4. Usage:          iobjmanip <op1>[,...<opN>] <src> <dest>
  5. Available command line options:
  6. -f file         Read command line options from file
  7. --f file        Read command line options from file and report dependency
  8. --no_bom        Don't use a Byte Order Mark in Unicode output
  9. --remove_file_path
  10.                remove path information from file symbol
  11. --remove_section #|name
  12.                remove matching section(s)
  13. --rename_section (#|name)=name
  14.                rename matching section(s)
  15. --rename_symbol name=name
  16.                rename matching symbol
  17. --strip         strip debug information
  18. --text_out encoding
  19.                Encoding to use for text output files
  20.                   utf8                UTF-8
  21.                   utf16le             Little-endian UTF-16
  22.                   utf16be             Big-endian UTF-16
  23.                   locale              Locale specific encoding
  24. --utf8_text_in  Non-source text input files with no BOM use UTF-8 encoding
  25. --version       Output version information and exit
  26. 1234567891011121314151617181920212223242526272829

使用示例:

  1. This example renames the section .example in input.o to .example2 and stores the result in output.o:iobjmanip --rename_section .example=.example2 input.o output.o

isymexport.exe

绝对符号导出器。从ROM映像文件中导出绝对符号,以便在链接附加应用程序时使用它们。

  1. E:\Program Files (x86)\IAR Systems\Embedded Workbench 8.2\arm\bin>isymexport
  2.   IAR Absolute Symbol Exporter V10.4.14.1149
  3.   Copyright 2008-2019 IAR Systems AB.
  4. Usage:          ISymExport input_file output_file
  5. Available command line options:
  6. --edit steering_file
  7.                Show/hide/rename symbols
  8. --export_locals[=symbol_prefix]
  9.                Export local variable and function symbols
  10. -f file         Read command line options from file
  11. --f file        Read command line options from file and report dependency
  12. --generate_vfe_header
  13.                Generate vfe header section
  14. --no_bom        Don't use a Byte Order Mark in Unicode output
  15. --ram_reserve_ranges[=symbol_prefix]
  16.                Generate symbols to reserve all occupied RAM ranges
  17. --reserve_ranges[=symbol_prefix]
  18.                Generate symbols to reserve all occupied ranges
  19. --show_entry_as[=name]
  20.                Export the entry point of the program as name
  21. --text_out encoding
  22.                Encoding to use for text output files
  23.                   utf8                UTF-8
  24.                   utf16le             Little-endian UTF-16
  25.                   utf16be             Big-endian UTF-16
  26.                   locale              Locale specific encoding
  27. --utf8_text_in  Non-source text input files with no BOM use UTF-8 encoding
  28. --version       Output version information and exit

iexe2obj.exe

IAR ELF可重定位对象创建器。从可执行的ELF目标文件创建可重定位的ELF目标文件。

  1. E:\Program Files (x86)\IAR Systems\Embedded Workbench 8.2\arm\bin>iexe2obj
  2.   IAR ELF Exe to Object Tool V10.4.14.1149
  3.   Copyright 2008-2019 IAR Systems AB.
  4. Usage:          IExe2Obj input_file output_file
  5. Available command line options:
  6. -f file         Read command line options from file
  7. --f file        Read command line options from file and report dependency
  8. --hide_symbols  Hide all symbols in the image
  9. --keep_mode_symbols
  10.                Keep mode symbols in the image
  11. --no_bom        Don't use a Byte Order Mark in Unicode output
  12. --prefix prefix Set section/symbol name prefix
  13. --text_out encoding
  14.                Encoding to use for text output files
  15.                   utf8                UTF-8
  16.                   utf16le             Little-endian UTF-16
  17.                   utf16be             Big-endian UTF-16
  18.                   locale              Locale specific encoding
  19. --utf8_text_in  Non-source text input files with no BOM use UTF-8 encoding
  20. --version       Output version information and exit
  21. --wrap function Create wrapper for function

GCC for ARM

GCC 原名为 GNU C 语言编译器(GNU C Compiler),因为它原本只能处理 C 语言。不过,后来 GCC 被进行了扩展,变得可处理 C++。后来又扩展能够支持更多编程语言,如 Fortran、Pascal、Objective-C、Java、Ada、Go 以及各类处理器架构上的汇编语言等,所以改名 GNU 编译器套件(GNU Compiler Collection)。更名之后,原来的针对于 C 语言的编译器名字还叫 gcc,针对 C++ 的编译器叫做 g++ 。

GCC for ARM(这个名字是我自己起的,用来代指所有基于 GCC 的针对 ARM 平台的编译套件) 是基于 GCC 开发的,用来编译生成 ARM 内核可执行文件的编译套件,也叫 ARM 交叉编译工具链。 相比于以上两个巨贵的编译器,GCC for ARM 因为是基于开源的 GCC 的,因此是免费的。目前主要由三大主流工具商提供,第一是 ARM,第二是 Codesourcery,第三是 Linora。目前我们用的针对 ARM 芯片的集成开发环境(IDE),除了 IAR 和 ARM 自己的 Keil、DS ,大多都是使用 GCC for ARM 的编译器!

首先,看看 ARM 交叉编译工具链的命名规则:arch [-vendor] [-os] [-(gnu)eabi] [-gcc]

  • arch:体系架构,如 ARM,MIPS

  • vendor:工具链提供商,没有 vendor 时,用 none 代替;

  • os:目标操作系统,没有 os 支持时,也用 none 代替

  • eabi:嵌入式应用二进制接口(Embedded Application Binary Interface)

如果同时没有 vendor 和 os 支持,则只用一个 none 代替。例如 arm-none-eabi 中的 none 表示既没有 vendor 也没有 os 支持。 前面说过,GCC for ARM 是基于 GCC 开发的。因此,其和 GCC 一样是一套命令行工具的集合,理论上可以将它集成到其他任何集成开发环境中,从而不直接使用命令行。GCC for ARM 中的各命令行工具与 GCC 中的各命令行工具都是对应的,功能基本一致,仅仅是名字有些改变!

基于 GCC 的 ARM 编译工具链提供商有 ARM、Codesourcery、Linaro 这三家,但其中使用最多还是 ARM 提供的 GCC 编译器。下面我们分别简单来介绍一下这三家的编译工具链。

Arm GNU Toolchain

ARM 除了有自己的专用编译器之外,还维护了一套基于 GCC 的交叉编译工具链,被称为 Arm GNU Toolchain。估计是为了能更有效的占有市场吧!绝大多数第三方的 IDE 都是使用这一套交叉编译工具链。

注意,在 2022 年之前,Arm GNU Toolchain 被分为了 A-profile(GNU Toolchain for A-profile processors) 和 R & M profiles(GNU Arm Embedded Toolchain)两大类,但是从 2022 年开始统一为了一个,之前的已经停止开发。2022 年第一版叫做 Arm GNU Toolchain Version 11.2-2022.02。

在 2022 年以前 R & M profiles 编译工具链的名字只有 arm-none-eabi,只能编译裸机平台,Cortex-A 则有裸机和 Linux 版之分的多种编译工具链;在 2022 年开始,则根据架构及是否支持 Linux 系统进行了大一统,我们可以根据需要选择合适的版本。

下面这两个章节还是 2022 年以前的 Arm GNU Toolchain 的介绍。2022 年以前的 Arm GNU Toolchain 官网还提供下载,只是不再进行更新。

arm-none-eabi

用于编译 ARM 架构的裸机系统(包括 ARM Linux 的 boot、kernel,不适用编译 Linux 应用 Application),所以不支持那些跟操作系统关系密切的函数,比如 fork,它使用的是 newlib 这个专用于嵌入式系统的 C 库。这是目前我们编写 ARM 裸机程序时,使用最多的交采编译工具链! 安装/解压 之后,目录如下图所示:ea0059ca6b9db8e75bef4d32ccb443c5.png??编译器工具中的各工具,与标准的 GCC 没有太多区别,主要就是针对的平台变了。各工具的功能是一样的!比如:arm-none-eabi-gcc.exe 是C 语言编译器、arm-none-eabi-g++.exe 是 C++ 编译器、arm-none-eabi-ld.exe 是连接器、arm-none-eabi-gdb.exe 是调试器等等。

?? 在很久以前,ARM 使用 launchpad 来维护该项目源码。但是根据之前的公告,launchpad 上不发布编译好的程序和源码包(“As previously announced all new binary and source packages will not be released on Launchpad henceforth, they can be found on:https://developer.arm.com/open-source/gnu-toolchain/gnu-rm.”),只能从 ARM 官网:https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/downloads 进行下载,launchpad 仅用于 BUG 提交等。

Cortex-A 专用

??以上交叉编译工具链只支持 ARM Cortex-M/R 等系列的核,ARM 官网还提供了针对于 ARM Cortex-A 系列内核的交叉编译工具链,可以从以下地址下载https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-a/downloads。具体如下所示:b764ea3e7ac2742093e3dc93e4972e6e.png需要注意的是,上图中红框全称的就是编译工具链的名字。各命令行工具与标准 GCC 也没啥区别!再一个需要注意的是,编译器的目标平台。

  • AArch32 bare-metal target:32 位纯裸机平台

  • AArch64 ELF bare-metal target:64 位纯裸机平台

  • AArch64 ELF bare-metal, big-endian target:64 位纯裸机平台(大端模式)

  • AArch64 GNU/Linux target:64 位 Linux 平台

  • AArch64 GNU/Linux big-endian target:64 位 Linux 平台(大端模式)

  • AArch32 target with soft float:32 位带软件模式浮点运算

  • AArch32 target with hard float:32 位带硬件模式浮点运算

Codesourcery Toolchain

??Codesourcery推出的产品叫 Sourcery G++ Lite Edition,其中基于 command-line 的编译器是免费的,在官网上可以下载,而其中包含的 IDE 和 debug 工具是收费的。Codesourcery 公司(目前已经被 Mentor 收购)基于 GCC 推出的 ARM 交叉编译工具。可用于交叉编译 ARM MCU 芯片,如 ARM7、ARM9、Cortex-M/R 芯片程序。??目前 CodeSourcery 已经由明导国际 (Mentor Graphics) 收购,所以原本的网站风格已经全部变为 Mentor 样式,这货被收之后,不知道怎么下载其编译工具链。。。

  • arm-none-linux-gnueabi-gcc: 用于交叉编译 ARM(32位)系统中所有环节的代码,包括裸机程序、u-boot、Linux kernel、filesystem和App应用程序。

  • arm-none-elf-gcc: 用于交叉编译 ARM MCU(32位)芯片,如 ARM7、ARM9、Cortex-M/R 芯片程序。

Linaro Toolchain

?? Linaro 是在 2010 年台北国际计算机展 ( COMPUTEX ) 期间,ARM、Freescale、Samsung、ST-Ericsson、德州仪器(TI)与 IBM 等 6 家大厂,宣布合资成立的非赢利 Linux 基础架构软件研发商。其基于 GCC 推出的 ARM 交叉编译工具如下图所示:c8669dc60ff7e7ca51ab0acd9a9eade9.png下载地址为:https://www.linaro.org/downloads/ 。从上图不难看出,Linaro 提供的交叉编译环境,仅针对于 Cortex-A 内核,其他 ARM 内核则需要去 ARM 官网下载!

  • aarch64-linux-gnu: 针对于目标平台是 Linux 系统,用于交叉编译 ARMv8 64 位目标中的裸机程序、u-boot、Linux kernel、filesystem 和 App 应用程序。

  • arm-linux-gnueabihf: 针对于目标平台是 Linux 系统,用于交叉编译ARM(32位)系统中所有环节的代码,包括裸机程序、u-boot、Linux kernel、filesystem和 App 应用程序。

  • arm-eabi-gcc: 用于编译 ARM 架构的裸机系统,包括 ARM Linux 的 boot、kernel,不适用编译 Linux 应用 Application

  • aarch64-elf: 用于编译 ARM v8 64位架构的裸机系统,包括 ARM Linux 的 boot、kernel,不适用编译 Linux 应用 Application

??正如官网的说明,官方发布的编译好二进制可执行编译器文件,仅在 Linux 系统( Ubuntu LTS)进行了测试。 目前,官方没有提供其他平台的可执行程序!

参考

  1. https://www.veryarm.com/

  2. https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchai

版权声明:本文来源网络,免费传达知识,版权归原作者所有。如涉及作品版权问题,请联系我进行删除。

‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧  END  ‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧

关注我的微信公众号,回复“加群”按规则加入技术交流群。
点击“阅读原文”查看更多分享,欢迎点分享、收藏、点赞、在看。
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/771038
推荐阅读
相关标签
  

闽ICP备14008679号