在講解各編譯器之前,必須先了解一下以下這些文件。這些文件在編譯器目錄下或者編譯生成目標(biāo)平臺的可執(zhí)行程序時經(jīng)常見到。此外,還需要注意區(qū)分 Windows 平臺 和 Linux 平臺的文件。
.o 文件: 指的是 object 文件,俗稱目標(biāo)文件。在 Linux 下擴展名縮寫為 .o,在 windows 下通常為 .obj 文件。
.a 文件: 指的是 archive 文件,俗稱靜態(tài)庫文件。在 Linux 下擴展名縮寫為 .a,在 windows 下通常為 .lib 文件。
.so 文件: 指的是 shared object 文件,用于動態(tài)連接的。在 Linux 下擴展名縮寫為 .so,在 windows 下通常為 .dll 文件。
.o 文件是鏈接文件,.a 是靜態(tài)庫文件,需要 .o 文件生成,作為一個庫為外部程序提供函數(shù)接口。詳細(xì)的可以看一下博文 ? 鏡像文件(Image)/可執(zhí)行文件/ELF文件/對象文件 詳解。
??在交叉編譯工具鏈目錄中,有大量的 .o 和 .a 文件。這些文件在我們編譯目標(biāo)平臺時會被用到!為什么在 Windows 下面的編譯工具鏈中會有這么多的 .o 和 .a 文件呢?這是因為我們使用的這個編譯工具鏈?zhǔn)窃?Linux 系統(tǒng)中編譯生成的! 。看下圖:
如果有親自編譯過交叉編譯工具鏈,那么就一定會對 build、host 和 target 這幾個參數(shù)非常熟悉:
–build=編譯該軟件(就是指的交叉編譯工具鏈本身)所使用的平臺
–host=該軟件(就是指的交叉編譯工具鏈本身)將運行的平臺
–target=該軟件(就是指的交叉編譯工具鏈本身)所要處理的目標(biāo)平臺。即交叉編譯工具鏈編譯出來的程序運行的平臺。
比較
目前,針對于 ARM 平臺的主流編譯器主要有以下三者:
比較 | ARMCC | IAR | GCC for ARM | LLVM(clang) |
---|---|---|---|---|
命令行工具 | 隨IDE發(fā)布,也獨立提供 | 僅隨其IDE發(fā)布,不獨立提供 | 獨立提供 | 只有命令行工具 |
開發(fā)商 | ARM | IAR | ARM、Linaro、Mentor | LLVM |
支持的平臺 | Windows、Linux | Windows | Windows、Linux、Mac(部分) | Windows、Linux、Mac |
配套 IDE | Keil MDK、ARM Development Studio 5、ADS | IAR EMBEDDED WORKBENCH FOR ARM | 除以上兩者外的其他支持ARM的IDE,例如:eclipse、Visual Studio | 除以上兩者外的其他支持ARM的IDE,例如:eclipse、Visual Studio |
官網(wǎng) | https://developer.arm.com/tools-and-software/embedded/arm-compiler/downloads | https://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/downloads | https://llvm.org/ |
ARM
ARM 官網(wǎng)上除了提供了配套 IDE(參考博文《ARM 之 各集成開發(fā)環(huán)境(IDE)說明(Keil、RVDS、ADS、DS-5、MDK)》) 以外,每次都會提供編譯器的獨立下載。用戶可以單獨安裝編譯器,編譯器采用命令行形式使用。
也就是說,ARM 的 IDE 和編譯器是相互獨立的,使用者可以為同一個 IDE 配置不同版本的編譯器!目前,ARM 官方提供兩個版本的編譯器,如下圖所示:
其中,Arm Compiler 6 被 ARM 稱為是 Arm Compiler 5 的替代者!相比于 Arm Compiler 5 的使用的 Edison Design Group 編譯器前端,Arm Compiler 6 將編譯器前端換為了基于 LLVM 的 Clang!
在 ARM 官網(wǎng)的介紹中,有如下一段話
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 內(nèi)核的支持上,Arm Compiler 6 也要比 Arm Compiler 5 完善的多!目前,ARM 官方的 IDE 都會包含這兩個版本的編譯器。例如,在 Keil MDK 的安裝目錄下面會有如下兩個目錄,分別對應(yīng)了 Arm Compiler 5 和 Arm Compiler 6
上面說了,以上編譯器 ARM 也提供獨立下載安裝,具體見上文的官網(wǎng)地址即可!我本身安裝了多個版本的 ARM編譯器,如下:
Edison Design Group 是一家公司,靠賣產(chǎn)品給賣編譯器的公司生存,它賣的是前端,包括 C++、Java 和 Fortran 前端,全世界幾乎所有商用編譯器,都會用這家公司的前端。最重要的,這家公司只有 5 個人。這五個人依次是:Mike Miller, Daveed Vandevoorde, Steve Adamczyk, John Spicer, Mike Herricl。Daveed Vandevoorde 寫過兩本書《C++ Templates》和《C++ Solutions》,Mike Miller是C++專家,實現(xiàn)部分C++的功能。Mike Herrick在Bell實驗室呆了19年。Steve Adamczyk 和 John Spicer 是 EDG 的創(chuàng)建者。
在最早期,ARM 的編譯器也是隨 IDE 發(fā)布的,如 ADS 時代!
armcc.exe
ARM 指令和 Thumb? 指令編譯器。用來編譯 C 和 C++代碼。它支持內(nèi)聯(lián)和嵌入式匯編程序,還包括高級 SIMD 矢量化編譯器。??編譯器支持將符合以下標(biāo)準(zhǔn)的 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體系結(jié)構(gòu)的基本標(biāo)準(zhǔn)應(yīng)用程序二進(jìn)制接口,BSABI):
生成 ELF 格式的對象文件。參考博文《ARM 之 鏡像文件(Image)/可執(zhí)行文件/ELF文件/對象文件 詳解》。
生成基于 Debug With Arbitrary Record Format Debugging Standard Version 3 (DWARF 3) 的調(diào)試信息 并且包含對于 DWARF 2 debug tables 的支持。
使用 Edison Design Group (EDG) 編譯器前端!
D:ARMARM_Compiler_5.06u4>armcc Product: ARM Compiler 5.06 Component: ARM Compiler 5.06 update 4 (build 422) Tool: armcc [4d3604] Usage: ? ? ? ? armcc [options] file1 file2 ... filen Main options: --arm ? ? ? ? ?Generate ARM code 創(chuàng)建 ARM 代碼 --thumb ? ? ? ?Generate Thumb code 創(chuàng)建 Thumb 代碼 --c90 ? ? ? ? ?Switch to C mode (default for .c files) 切換到C模式 (默認(rèn)是 .c 文件) --cpp ? ? ? ? ?Switch to C++ mode (default for .cpp files) 切換到C++模式 (默認(rèn) .cpp 文件) -O0 ? ? ? ? ? ?Minimum optimization 最小優(yōu)化級別 -O1 ? ? ? ? ? ?Restricted optimization for debugging 受限的調(diào)試級別優(yōu)化 -O2 ? ? ? ? ? ?High optimization 高優(yōu)化 -O3 ? ? ? ? ? ?Maximum optimization 最大優(yōu)化 -Ospace ? ? ? ?Optimize for codesize 對代碼大小進(jìn)行優(yōu)化 -Otime ? ? ? ? Optimize for maximum performance 優(yōu)化最大優(yōu)化級別的運行時間 --cpu? ?Select CPU to generate code for 選擇CPU --cpu list ? ? Output a list of all the selectable CPUs 輸出所有被選中的CPU列表 -o ? ? ?Name the final output file of the compilation 最終輸出文件的名字 -c ? ? ? ? ? ? Compile only, do not link 只進(jìn)行編譯,不鏈接 --asm ? ? ? ? ?Output assembly code as well as object code 輸出匯編以及obj文件 -S ? ? ? ? ? ? Output assembly code instead of object code 只輸出匯編文件 --interleave ? Interleave source with disassembly (use with --asm or -S) 交叉反匯編 (use with --asm or -S) -E ? ? ? ? ? ? Preprocess the C source code only 僅僅預(yù)處理C代碼 -D ? ? Define on entry to the compiler 定義 符號并且傳入編譯過程 -g ? ? ? ? ? ? Generate tables for high-level debugging 為高級別調(diào)試創(chuàng)建表 -I ?Include on the #include search path 在編譯的時候包含 作為頭文件搜索目錄 1234567891011121314151617181920212223242526272829
其默認(rèn)的頭文件搜索路徑如下圖所示:
armasm.exe
?? ARM 和 Thumb 匯編器。用來匯編 ARM 和 Thumb 匯編語言源文件。
D:ARMARM_Compiler_5.06u4>armasm Product: ARM Compiler 5.06 Component: ARM Compiler 5.06 update 4 (build 422) Tool: armasm [4d35cf] For Educational purposes only Software supplied by: ARM Limited Usage: ? ? ?armasm [options] sourcefile Options: --list ? ? ? listingfile ? Write a listing file (see manual for options) ? ?生成列表文件 -o ? ? ? ? ?outputfile ? ?Name the final output file ? 命名最終輸出文件名 --depend ? ? dependfile ? ?Save 'make' source file dependencies 保留 'make' 源文件依賴 --errors ? ? errorsfile ? ?Put stderr diagnostics to errorsfile 把標(biāo)準(zhǔn)錯誤判斷放入errorsfile -I ? ? ? ? ?dir[,dir] ? ? Add dirs to source file search path ?添加源文件的搜索目錄 --pd --predefine ?directive ? ? Pre-execute a SET{L,A,S} directive ? 預(yù)執(zhí)行 SET{L,A,S} 指令 --maxcache ?? ? ? ? ? Maximum cache size ? (default 8MB) ?最大閃存空間 (default 8MB) --no_esc ? ? ? ? ? ? ? ? ? Ignore C-style (c) escape sequences 忽略C風(fēng)格( c)轉(zhuǎn)義序列 --no_warn ? ? ? ? ? ? ? ? ?Turn off Warning messages ? ?關(guān)閉警告信息 -g ? ? ? ? ? ? ? ? ? ? ? ?Output debugging tables ?輸出調(diào)試表 --apcs ? ? ? / ? ? ?Make pre-definitions to match the ? ? ? ? ? ? ? ? ? ? ? ? ? chosen procedure-call standard 進(jìn)行預(yù)定義以匹配選擇的程序調(diào)用標(biāo)準(zhǔn) --checkreglist ? ? ? ? ? ? Warn about out of order LDM/STM register lists ? 警告LDM/STM寄存器列表出現(xiàn)故障 --help ? ? ? ? ? ? ? ? ? ? Print this information ? 打印幫助信息 --li ? ? ? ? ? ? ? ? ? ? ? Little-endian ARM ? ?小端模式的 ARM --bi ? ? ? ? ? ? ? ? ? ? ? Big-endian ARM ? 大端模式的 ARM -M ? ? ? ? ? ? ? ? ? ? ? ?Write source file dependency lists to stdout 將源文件依賴關(guān)系列表寫入stdout --MD ? ? ? ? ? ? ? ? ? ? ? Write source file dependency lists to inputfile.d 將源文件依賴關(guān)系列表寫入inputfile.d --keep ? ? ? ? ? ? ? ? ? ? Keep local labels in symbol table of object file 將本地標(biāo)簽保存在目標(biāo)文件的符號表中 --regnames none ? ? ? ? ? ?Do not predefine register names 不預(yù)定義寄存器名稱 --split_ldm ? ? ? ? ? ? ? ?Fault long LDM/STM --unsafe ? ? ? ? ? ? ? ? ? Downgrade certain errors to warnings 將某些錯誤降級為警告 --via ? ? ? ? ? ? ? ?Read further arguments from 從 中讀取更多參數(shù) --cpu ? ? ? ? ?Set the target ARM core type 設(shè)置目標(biāo)ARM核心類型 --cpu list ? ? ? ? ? ? ? ? Output a list of all the selectable CPUs 輸出所有可選CPU的列表 --fpu ? ? ? ? Set target FP architecture version 設(shè)置目標(biāo)FP架構(gòu)版本 --fpu list ? ? ? ? ? ? ? ? Output a list of all selectable FP architectures 輸出所有可選FP架構(gòu)的列表 --thumb ? ? ? ? ? ? ? ? ? ?Assemble Thumb instructions ?匯編 Thumb 指令 --arm ? ? ? ? ? ? ? ? ? ? ?Assemble ARM instructions ? ?匯編 ARM 指令 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. 連接器。用于將一個或多個目標(biāo)文件的內(nèi)容與一個或多個對象庫的選定部分組合在一起,以生成可執(zhí)行程序。還提供了 64 位版本的 armlink,可以訪問 64 位計算機上可用的更大內(nèi)存量。它支持此版本中 32 位版本的 armlink 支持的所有功能。
If you are using ARM Compiler as a standalone product, then the 32-bit version is used bydefault. 如果您使用 ARM 編譯器作為獨立產(chǎn)品,則默認(rèn)使用 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 位鏈接器。您沒有獲得這兩個版本。對于微控制器開發(fā)工具包(MDK),僅提供 32 位鏈接器。
D:ARMARM_Compiler_5.06u4>armlink Product: ARM Compiler 5.06 Component: ARM Compiler 5.06 update 4 (build 422) Tool: armlink [4d35d2] For Educational purposes only Software supplied by: ARM Limited Usage: armlink option-list input-file-list where ? ?option-list ? ? ?is a list of case-insensitive options. 不區(qū)分大小寫的選項列表。 ? ?input-file-list ?is a list of input object and library files. 輸入對象或者庫文件列表。 General options (abbreviations shown capitalised): ? --help ? ? ? ? ?Print this summary. 顯示幫助信息。 ? --output file ? Specify the name of the output file. 指定輸出文件名。 ? --via file ? ? ?Read further arguments from file. Options for specifying memory map information: ? --partial ? ? ? Generate a partially linked object. 創(chuàng)建一個被分散鏈接的對象文件。 ? --scatter file ?Create the memory map as described in file. 按文件(分散加載文件)中的描述創(chuàng)建內(nèi)存映射。 ? --ro-base n ? ? Set exec addr of region containing RO sections. 設(shè)置執(zhí)行地址空間域,包含RO段(只讀數(shù)據(jù)段)。 ? --rw-base n ? ? Set exec addr of region containing RW/ZI sections. 設(shè)置執(zhí)行地址空間域,包含RW/ZI段。 Options for controlling image contents: ? --bestdebug ? ? Add debug information giving best debug view to image. ?添加調(diào)試信息,為鏡像提供最佳調(diào)試視圖。 ? --datacompressor off ? ? ? ? ? ? ? ? ? Do not compress RW data sections. 不要壓縮RW數(shù)據(jù)段。 ? --no_debug ? ? ?Do not add debug information to image. 不添加調(diào)試信息。 ? --entry ? ? ? ? Specify entry sections and entry point. 指定輸入段與輸入點。 ? --libpath ? ? ? Specify path to find system libraries from. 指定系統(tǒng)庫文件路徑。 ? --userlibpath ? Specify path to find user libraries from. 指定用戶庫文件路徑。 ? --no_locals ? ? Do not add local symbols to image symbol table. 不要添加局部標(biāo)號到image的標(biāo)號列表。 ? --no_remove ? ? Do not remove unused sections from image. 不要移除image的未使用段。 Options for controlling image related information: ? --callgraph ? ? Create a static callgraph of functions. 創(chuàng)建一個函數(shù)靜態(tài)調(diào)用圖。 ? --feedback file Generate feedback that can be used by the compiler in file. ? --info topic ? ?List misc. information about image. ? ? ? ? ? ? ? ? ? ?Available topics: (separate multiple topics with comma) ? ? ? ? ? ? ? ? ? ? common ? List common sections eliminated from the image. ? ? ? ? ? ? ? ? ? ? debug ? ?List eliminated input debug sections. ? ? ? ? ? ? ? ? ? ? sizes ? ?List code and data sizes for objects in image. ? ? ? ? ? ? ? ? ? ? totals ? List total sizes of all objects in image. ? ? ? ? ? ? ? ? ? ? veneers ?List veneers that have been generated. ? ? ? ? ? ? ? ? ? ? unused ? List sections eliminated from the image. ? --map ? ? ? ? ? Display memory map of image. 顯示image內(nèi)存映射。 ? --symbols ? ? ? List symbols in image. 列出image符號。 ? --xref ? ? ? ? ?List all cross-references between input sections. 列出輸入的段之間所有的交叉引用.最終輸出會放在.map文件里面。 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 對象文件集可以一起收集并維護(hù)在原始文件或庫中。您可以將此類庫或存檔傳遞給鏈接器以代替多個ELF文件。您還可以使用存檔分發(fā)給第三方以進(jìn)行進(jìn)一步的應(yīng)用程序開發(fā)。
D:ARMARM_Compiler_5.06u4>armar Product: ARM Compiler 5.06 Component: ARM Compiler 5.06 update 4 (build 422) Tool: armar [4d35c8] Archive creation and maintenance tool Command format: armar options archive [ file_list ] Wildcards '?' and '*' may be used in file_list Options:- -r ? ? ? ? Insert files in, replace existing members of the same name. 在 中插入文件, 替換掉已經(jīng)存在的同名成員。 -d ? ? ? ? Delete the members in . 從 中刪除成員。 -x ? ? ? ? Extract members in placing in files of the same name. 從 中提取同名的成員。 -m ? ? ? ? Move files in . 在 中移動文件。 -p ? ? ? ? Print files to stdout. 打印文件到標(biāo)準(zhǔn)輸出設(shè)備。 -a pos ? ? Insert/move files after file named . 插入/刪除 后面的文件。 -b pos ? ? Insert/move files before file named . 插入/刪除 前面的文件。 -u ? ? ? ? Update older files only, used with -r. 只更新舊的文件, 與 -r 一起使用。 -n ? ? ? ? Do not add a symbol table to an object archive. 不要向 object 文件中添加符號表。 -s ? ? ? ? Force regeneration of archive symbol table. 強制重新生成文檔符號表。 -t ? ? ? ? Print table of contents of archive. 打印文檔的內(nèi)容表。 --zs ? ? ? ?Show the symbol table. 顯示符號表。 --zt ? ? ? ?Summarize the archive contents (sizes + entries). 匯總文檔內(nèi)容 (大小和輸入)。 -c ? ? ? ? Suppress warning when a new archive is created. 當(dāng)一個新文檔被創(chuàng)建的時候不顯示警告。 -C ? ? ? ? Do not overwrite existing files when extracting. 提取的時候不要覆蓋一個已經(jīng)存在的文件。 -T ? ? ? ? Truncate file names to system maximum length. 截取系統(tǒng)最大長度文件名。 -v ? ? ? ? Give verbose output. 提供詳細(xì)輸出。 --create ? ?Force creation of a new archive. 強制創(chuàng)建一個新文檔。 --via file ?Take additional arguments from via file. 從 via 文件中獲取額外參數(shù)。 --sizes ? ? List the size of each member and the library total. 列出所有成員大小與庫的總大小。 --entries ? List sections containing ENTRY points. 列出包括入口點的部分。 --vsn ? ? ? Print the current Armar Version. 打印最新的armar版本。 --help ? ? ?Print this message. 打印幫助信息。 Examples:- ? ? ? ?armar -r ?mylib.a obj1 obj2 obj3... ? ? ? ?armar -x ?mylib.a ?sort* ? ? ? ?armar -d ?mylib.a hash.o ? ? ? ?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.鏡像轉(zhuǎn)換實用程序。這還可以生成有關(guān)輸入圖像的文本信息,例如其反匯編及其代碼和數(shù)據(jù)大小。
D:ARMARM_Compiler_5.06u4>fromelf Product: ARM Compiler 5.06 Component: ARM Compiler 5.06 update 4 (build 422) Tool: fromelf [4d35cb] ARM image conversion utility. ARM 鏡像轉(zhuǎn)換工具 fromelf [options] input_file Options: ? ? ? --help ? ? ? ? display this help screen 顯示幫助信息 ? ? ? --vsn ? ? ? ? ?display version information 顯示版本信息 ? ? ? --output file ?the output file. (defaults to stdout for -text format) 輸出文件名. (默認(rèn)輸出 -text 格式) ? ? ? --nodebug ? ? ?do not put debug areas in the output image 不要輸出調(diào)試信息到映像文件中 ? ? ? --nolinkview ? do not put sections in the output image 不要輸出段信息到映像文件中 Binary Output Formats: ? ? ? --bin ? ? ? ? ?Plain Binary 普通二進(jìn)制 ? ? ? --m32 ? ? ? ? ?Motorola 32 bit Hex 摩托羅拉32位Hex碼 ? ? ? --i32 ? ? ? ? ?Intel 32 bit Hex 英特爾32位Hex碼 ? ? ? --vhx ? ? ? ? ?Byte Oriented Hex format 定向字節(jié)的 Hex 格式 ? ? ? --base addr ? ?Optionally set base address for m32,i32 為 m32,i32設(shè)置基地址(可選的) Output Formats Requiring Debug Information 輸出格式要求的調(diào)試信息 ? ? ? --fieldoffsets Assembly Language Description of Structures/Classes. Structures/Classes的匯編描述 ? ? ? --expandarrays Arrays inside and outside structures are expanded. 展開內(nèi)部和外部結(jié)構(gòu)的數(shù)組 Other Output Formats: ? ? ? --elf ? ? ? ? ELF ELF格式 ? ? ? --text ? ? ? ?Text Information 文本信息 ? ? ? ? ? ? ? ?Flags for Text Information 文本信息的標(biāo)志 ? ? ? ? ? ? ? ?-v ? ? ? ? ?verbose 詳細(xì)信息 ? ? ? ? ? ? ? ?-a ? ? ? ? ?print data addresses (For images built with debug) 打印數(shù)據(jù)的地址信息 (得到的.axf映像文件) ? ? ? ? ? ? ? ?-c ? ? ? ? ?disassemble code 匯編碼 ? ? ? ? ? ? ? ?-d ? ? ? ? ?print contents of data section 打印數(shù)據(jù)的段內(nèi)容 ? ? ? ? ? ? ? ?-e ? ? ? ? ?print exception tables 打印異常表 ? ? ? ? ? ? ? ?-g ? ? ? ? ?print debug tables 打印調(diào)試表 ? ? ? ? ? ? ? ?-r ? ? ? ? ?print relocation information 打印重定位信息 ? ? ? ? ? ? ? ?-s ? ? ? ? ?print symbol table 打印符號表 ? ? ? ? ? ? ? ?-t ? ? ? ? ?print string table 打印字符表 ? ? ? ? ? ? ? ?-y ? ? ? ? ?print dynamic segment contents 打印動態(tài)段內(nèi)容 ? ? ? ? ? ? ? ?-z ? ? ? ? ?print code and data size information 打印代碼與數(shù)據(jù)的大小信息
IAR
相比于 ARM 對于編譯器的靈活安裝,IAR 的編譯器則只跟隨其 IDE 發(fā)布,編譯器不獨立提供。IAR 安裝后,目錄就是下面這個樣子了:
這里我們重點關(guān)注一下arm目錄下的相關(guān)內(nèi)容。其中內(nèi)容有很多,這里主要介紹一下編譯器相關(guān)的那些,首先看下圖
我們可以手動提取其編譯器,來作為命令行工具使用。但是對于 IAR 還是不建議這么用,個人感覺 IAR 在設(shè)計時,估計沒考慮過讓用戶使用命令行模式來獨立使用編譯套件,因為其編譯套件和其他好多東西都放在了一個目錄中,不像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》。
IAR 我用的比較少,主要內(nèi)容來自于官方文檔。管方文檔更加詳細(xì),如有疑問直接去官方文檔查看即可!官方文檔目錄為
IAR安裝目錄armdoc
。具體如下:
《 IAR C/C++ Development Guide Compiling and Linking》,文檔名為 EWARM_DevelopmentGuide.ENU.pdf
《IAR Assembler Reference Guide》,文檔名為 EWARM_AssemblerReference.ENU.pdf
《C-STAT? Static Analysis Guide》,文檔名為 EW_MisraC1998Reference.ENU.pdf
還可以直接從 IAR 的 IDE 的菜單進(jìn)入:菜單 -> help
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 是一個功能強大的重定位宏匯編程序,具有多種指令和表達(dá)式運算符。匯編程序具有內(nèi)置的 C 語言預(yù)處理程序,并支持條件匯編。該工具官方有個獨立的說明文檔《IAR Assembler Reference Guide》,里面有該工具的詳細(xì)使用說明。
E:Program Files (x86)IAR SystemsEmbedded Workbench 8.2armin>iasmarm ? ?IAR Assembler V8.32.3.193/W32 for ARM ? ?Copyright 1999-2019 IAR Systems AB. Usage: ? ? ? ?iasmarm {} { } Sourcefile: ? source file with default extension: .msa, , .asm, or .s Environment: ?IASMARM Options (specified order is of no importance): -B ? ? ? ? ? ?Print debug info for assembler macros -c{DEAOM} ? ? Listing options ? ? ? ? ? ? ? ? D: Disable listing, ? ? ? ? ? ? E: Disable macro expansion ? ? ? ? ? ? ? ? A: List only assembled part ? ? O: List several lines of code ? ? ? ? ? ? ? ? M: List Macro definition -DSYMB ? ? ? ?Equivalent to: #define SYMB 1 -DSYMB=xx ? ? Equivalent to: #define SYMB xx -e ? ? ? ? ? ?Use big-endian byte order -Enumber ? ? ?Allow errors -f file ? ? ? Extend command line with <.xcl> -g ? ? ? ? ? ?No system include -G ? ? ? ? ? ?Open standard input as source -i ? ? ? ? ? ?List #included files -Ipath ? ? ? ?Add #include search path -j ? ? ? ? ? ?Enable alternative register names, operators and mnemonics -l file ? ? ? Generate a list on: <.lst> -Lpath ? ? ? ?Generate a list on:
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是一個最先進(jìn)的編譯器,提供 C 和 C++ 語言的標(biāo)準(zhǔn)功能,以及旨在利用 Arm 特定功能的擴展。??默認(rèn)使用的頭文件目錄.arminc
E:Program Files (x86)IAR SystemsEmbedded Workbench 8.2armin>iccarm ? IAR ANSI C/C++ Compiler V8.32.3.193/W32 for ARM ? Copyright 1999-2019 IAR Systems AB. ? PC-locked license - IAR Embedded Workbench for ARM Available command line options: --aapcs {std|vfp} ? ? ? ? ? ? ? ?Specify calling convention. --aeabi ? ? ? ? Generate aeabi compliant code --align_sp_on_irq ? ? ? ? ? ? ? ?Generate code to align SP on entry to __irq functions --arm ? ? ? ? ? Generate code in arm mode, same as --cpu_mode arm --c++ ? ? ? ? ? C++ --c89 ? ? ? ? ? Use C89 standard --char_is_signed ? ? ? ? ? ? ? ?'Plain' char is treated as signed char --char_is_unsigned ? ? ? ? ? ? ? ?'plain' char is treated as unsigned char --cmse ? ? ? ? ?Enable CMSE secure object generation --cpu core ? ? ?Specify target core ? ? ? ? ? ? ? ?Valid options are core names such as Cortex-M3 ? ? ? ? ? ? ? ?and architecture names such as 7M ? ? ? ? ? ? ? ?Cortex-M3 is default --cpu_mode {arm|a|thumb|t} ? ? ? ? ? ? ? ?Select default mode for functions, arm is default -D symbol[=value] ? ? ? ? ? ? ? ?Define macro (same as #define symbol [value]) --debug -r ? ? ? ? ? ? ?Insert debug info in object file --dependencies=[i|m|n][s][lw][b] file|directory|+ ? ? ? ? ? ? ? ?List file dependencies ? ? ? ? ? ? ? ? ? i ? ? Include filename only (default) ? ? ? ? ? ? ? ? ? m ? ? Makefile style (multiple rules) ? ? ? ? ? ? ? ? ? n ? ? Makefile style (one rule) ? ? ? ? ? ? ? ? ? s ? ? Don't include system file dependencies ? ? ? ? ? ? ? ? ? l ? ? Use locale encoding instead of UTF-8 ? ? ? ? ? ? ? ? ? w ? ? Use little endian UTF-16 instead of UTF-8 ? ? ? ? ? ? ? ? ? b ? ? Use a Byte Order Mark in UTF-8 output ? ? ? ? ? ? ? (+: output same as -o, only with .d extension) --deprecated_feature_warnings [+|-]feature,[+|-]feature,... ? ? ? ? ? ? ? ?Enable (+) or disable (-) warnings about deprecated features: ? ? ? ? ? ? ? ? ? attribute_syntax ? ? ? ? Warn about attribute syntax that ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?will change ? ? ? ? ? ? ? ? ? preprocessor_extensions ?Warn about use of migration ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?preprocessor extensions ? ? ? ? ? ? ? ? ? segment_pragmas ? ? ? ? ?Warn about use of #pragma constseg/ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?dataseg/memory --diagnostics_tables file|directory ? ? ? ? ? ? ? ?Dump diagnostic message tables to file --diag_error tag,tag,... ? ? ? ? ? ? ? ?Treat the list of tags as error diagnostics --diag_remark tag,tag,... ? ? ? ? ? ? ? ?Treat the list of tags as remark diagnostics --diag_suppress tag,tag,... ? ? ? ? ? ? ? ?Suppress the list of tags as diagnostics --diag_warning tag,tag,... ? ? ? ? ? ? ? ?Treat the list of tags as warning diagnostics --discard_unused_publics ? ? ? ? ? ? ? ?Discard unused public functions and variables --dlib_config name|path ? ? ? ? ? ? ? ?Specify DLib library configuration --do_explicit_zero_opt_in_named_sections ? ? ? ? ? ? ? ?Allow zero init optimization for variables in named ? ? ? ? ? ? ? ?sections/segments -e ? ? ? ? ? ? ?Enable IAR C/C++ language extensions --enable_hardware_workaround waid[,waid[...]] ? ? ? ? ? ? ? ?Generate hardware workaround for specified problem --enable_restrict ? ? ? ? ? ? ? ?Enable the restrict keyword --endian {little|l|big|b} ? ? ? ? ? ? ? ?Select byte order, little-endian is default --enum_is_int ? Force the size of all enumeration types to be at least 4 bytes --error_limit limit ? ? ? ? ? ? ? ?Stop after this many errors (0 = no limit) -f file ? ? ? ? Read command line options from file --f file ? ? ? ?Read command line options from file and report dependency --fpu {VFPv2|VFPv3{_D16}{_FP16}|VFPv4{_sp}|VFP9-S|none} ? ? ? ? ? ? ? ?Specify target FPU coprocessor support ? ? ? ? ? ? ? ?Default is none, which selects the software ? ? ? ? ? ? ? ?floating-point library. --generate_entries_without_bounds ? ? ? ? ? ? ? ?Generate functions for use from non-instrumented code --guard_calls ? Use a guard call for a function static initialization --header_context ? ? ? ? ? ? ? ?Adds include file context to diagnostics -I directory ? ?Add #include search directory --ignore_uninstrumented_pointers ? ? ? ? ? ? ? ?Disable checking of accesses via pointers from uninstrumented ? ? ? ? ? ? ? ?functions -l[c|C|D|E|a|A|b|B][N][H] file|directory ? ? ? ? ? ? ? ?Output list file ? ? ? ? ? ? ? ? ? c ? ? C source listing ? ? ? ? ? ? ? ? ? C ? ? ? ?with assembly code ? ? ? ? ? ? ? ? ? D ? ? ? ?with pure assembly code ? ? ? ? ? ? ? ? ? E ? ? ? ?with non-sequential assembly code ? ? ? ? ? ? ? ? ? a ? ? Assembler file ? ? ? ? ? ? ? ? ? A ? ? ? ?with C source ? ? ? ? ? ? ? ? ? b ? ? Basic assembler file ? ? ? ? ? ? ? ? ? B ? ? ? ?with C source ? ? ? ? ? ? ? ? ? N ? ? Do not include diagnostics ? ? ? ? ? ? ? ? ? H ? ? Include header file source lines --lock_regs registers ? ? ? ? ? ? ? ?Prevent compiler from using specified registers (R4-R11). --macro_positions_in_diagnostics ? ? ? ? ? ? ? ?Use positions inside macros in diagnostics --make_all_definitions_weak ? ? ? ? ? ? ? ?Make all variable and function definitions weak --max_cost_constexpr_call limit ? ? ? ? ? ? ? ?Maximum cost (number of calls/number of loop iterations) when ? ? ? ? ? ? ? ?evaluating a top-level constexpr call --max_depth_constexpr_call limit ? ? ? ? ? ? ? ?Maximum depth of recursion when evaluating a top-level ? ? ? ? ? ? ? ?constexpr call --mfc ? ? ? ? ? Enable multiple file compilation --misrac1998[=arg,arg,...] ? ? ? ? ? ? ? ?Enable MISRA-C 1998 diagnostics ? ? ? ? ? ? ? ? ? ?all ? ? ? Enable all rules ? ? ? ? ? ? ? ? ? ?required ?Enable all required rules ? ? ? ? ? ? ? ? ? ?i ? ? ? ? Enable rule i ? ? ? ? ? ? ? ? ? ?i-j ? ? ? Enable rule i through j ? ? ? ? ? ? ? ? ? ?~i ? ? ? ?Disable rule i ? ? ? ? ? ? ? ? ? ?~i-j ? ? ?Disable rule i through j --misrac2004[=arg,arg,...] ? ? ? ? ? ? ? ?Enable MISRA-C 2004 diagnostics ? ? ? ? ? ? ? ? ? ?all ? ? ? Enable all rules ? ? ? ? ? ? ? ? ? ?required ?Enable all required rules ? ? ? ? ? ? ? ? ? ?X ? ? ? ? Enable rule or chapter ? ? ? ? ? ? ? ? ? ?X-Y ? ? ? Enable range ? ? ? ? ? ? ? ? ? ?~X ? ? ? ?Disable rule or chapter ? ? ? ? ? ? ? ? ? ?~X-Y ? ? ?Disable range ? ? ? ? ? ? ? ? ?where X and Y is one of: ? ? ? ? ? ? ? ? ? ?i ? ? ? ? All rules in chapter i ? ? ? ? ? ? ? ? ? ?i.j ? ? ? Rule i.j --misrac_verbose ? ? ? ? ? ? ? ?Enable verbose MISRA C messages --nonportable_path_warnings ? ? ? ? ? ? ? ?Enable warning for non-matching case in paths --no_alignment_reduction ? ? ? ? ? ? ? ?Disable alignment reduction of simple thumb functions --no_bom ? ? ? ?Don't use a Byte Order Mark in Unicode output --no_call_frame_info ? ? ? ? ? ? ? ?Suppress output of call frame information --no_clustering Disable static clustering for static and global variables --no_code_motion ? ? ? ? ? ? ? ?Disable code motion --no_const_align ? ? ? ? ? ? ? ?Turn off the alignment optimization for constants --no_cse ? ? ? ?Disable common sub-expression elimination --no_exceptions Disable C++ exception support --no_fragments ?Do not generate section fragments --no_inline ? ? Disable function inlining --no_literal_pool ? ? ? ? ? ? ? ?Generate code that does not issue read request to .text --no_loop_align Disable alignment of labels in loops (Thumb2) --no_mem_idioms Disable idiom recognition for memcpy/memset/memclr --no_path_in_file_macros ? ? ? ? ? ? ? ?Strip path from __FILE__ and __BASE_FILE__ macros --no_rtti ? ? ? Disable C++ runtime type information support --no_rw_dynamic_init ? ? ? ? ? ? ? ?Don't allow C-object to be initialized at runtime --no_scheduling Disable instruction scheduling --no_size_constraints ? ? ? ? ? ? ? ?Remove limits for code expansion --no_static_destruction ? ? ? ? ? ? ? ?Do not emit code to destroy C++ static variables --no_system_include ? ? ? ? ? ? ? ?Do not search in the default system header directory --no_tbaa ? ? ? Disable type based alias analysis --no_typedefs_in_diagnostics ? ? ? ? ? ? ? ?Do not use typedefs when printing types --no_unaligned_access ? ? ? ? ? ? ? ?Don't generate unaligned accesses --no_uniform_attribute_syntax ? ? ? ? ? ? ? ?Use old meaning for IAR type attributes before initial type --no_unroll ? ? Disable loop unrolling --no_var_align ?Turn off the alignment optimization for variables --no_warnings ? Disable generation of warnings --no_wrap_diagnostics ? ? ? ? ? ? ? ?Don't wrap long lines in diagnostic messages -O[n|l|m|h|hs|hz] ? ? ? ? ? ? ? ?Select level of optimization: ? ? ? ? ? ? ? ? ? n ? No optimizations ? ? ? ? ? ? ? ? ? l ? Low optimizations (default) ? ? ? ? ? ? ? ? ? m ? Medium optimizations ? ? ? ? ? ? ? ? ? h ? High optimizations ? ? ? ? ? ? ? ? ? hz ?High optimizations, tuned for small code size ? ? ? ? ? ? ? ? ? hs ?High optimizations, tuned for high speed ? ? ? ? ? ? ? ? ? ? ? (-O without argument) The same setting as -Oh --only_stdout ? Use stdout only (no console output on stderr) --output file|path -o file|path ? ?Specify object file --pending_instantiations limit ? ? ? ? ? ? ? ?Maximum number of instantiations of a given template in ? ? ? ? ? ? ? ?progress at a time (0 -> no limit) --predef_macros file|directory ? ? ? ? ? ? ? ?Output predefined macros --preinclude filename ? ? ? ? ? ? ? ?Include file before normal source --preprocess=[c][n][s] file|directory ? ? ? ? ? ? ? ?Preprocessor output ? ? ? ? ? ? ? ? ? c ? ? Include comments ? ? ? ? ? ? ? ? ? n ? ? Preprocess only ? ? ? ? ? ? ? ? ? s ? ? Suppress #line directives --public_equ symbol[=value] ? ? ? ? ? ? ? ?Define public assembler symbol (EQU) --relaxed_fp ? ?Enable floating point optimizations that may affect the result --remarks ? ? ? Enable generation of remarks --require_prototypes ? ? ? ? ? ? ? ?Require prototypes for all called or public functions --ropi ? ? ? ? ?Generate read-only position independent code --runtime_checking check,check,... ? ? ? ? ? ? ? ?Instrument code to do runtime checks for the selected problems: ? ? ? ? ? ? ? ? ? bounds ? ? ? ? ? ? ?Check pointer bounds ? ? ? ? ? ? ? ? ? bounds_no_checks ? ?Track pointer bounds, but emit no checks ? ? ? ? ? ? ? ? ? div_by_zero ? ? ? ? Check division by zero ? ? ? ? ? ? ? ? ? implicit_integer_conversion ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Check only implicit integer conversion ? ? ? ? ? ? ? ? ? integer_conversion ?Check any integer conversion ? ? ? ? ? ? ? ? ? signed_overflow ? ? Check for signed integer overflow ? ? ? ? ? ? ? ? ? signed_shift ? ? ? ?Check for overflow in signed shift ? ? ? ? ? ? ? ? ? switch ? ? ? ? ? ? ?Check for unhandled cases in switch ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? statements ? ? ? ? ? ? ? ? ? unsigned_overflow ? Check for unsigned integer overflow ? ? ? ? ? ? ? ? ? unsigned_shift ? ? ?Check for overflow in unsigned shift --rwpi ? ? ? ? ?Generate read-write position independent code --rwpi_near ? ? Generate read-write position independent code --section section-name=new section-name ? ? ? ? ? ? ? ?Rename section --silent ? ? ? ?Silent operation --source_encoding {locale|utf8} ? ? ? ? ? ? ? ?Encoding to use for source files with no BOM --stack_protection ? ? ? ? ? ? ? ?Insert stack smash protection --strict ? ? ? ?Strict C/C++ standard language rules --system_include_dir directory ? ? ? ? ? ? ? ?Set system header directory --text_out encoding ? ? ? ? ? ? ? ?Encoding to use for text output files ? ? ? ? ? ? ? ? ? utf8 ? ? ? ? ? ? ? ?UTF-8 ? ? ? ? ? ? ? ? ? utf16le ? ? ? ? ? ? Little-endian UTF-16 ? ? ? ? ? ? ? ? ? utf16be ? ? ? ? ? ? Big-endian UTF-16 ? ? ? ? ? ? ? ? ? locale ? ? ? ? ? ? ?Locale specific encoding --thumb ? ? ? ? Generate code in thumb mode, same as --cpu_mode thumb --uniform_attribute_syntax ? ? ? ? ? ? ? ?Same syntax for IAR type attributes as for const/volatile --use_c++_inline ? ? ? ? ? ? ? ?Use C++ inline semantics in C mode --use_paths_as_written ? ? ? ? ? ? ? ?Use paths as written in debug information ? ? ? ? ? ? ? (normally absolute paths are used) --use_unix_directory_separators ? ? ? ? ? ? ? ?Use forward slashes in paths in debug information --utf8_text_in ?Non-source text input files with no BOM use UTF-8 encoding --vectorize ? ? Perform autovectorization --version ? ? ? Output version information and exit --vla ? ? ? ? ? Allow variable length arrays --warnings_affect_exit_code ? ? ? ? ? ? ? ?Warnings affect exit code --warnings_are_errors ? ? ? ? ? ? ? ?All warnings are errors --warn_about_c_style_casts ? ? ? ? ? ? ? ?Warn about uses of C-style casts in EC++/C++
IDE中有兩個工具可將應(yīng)用程序源文件轉(zhuǎn)換為中間文件目標(biāo)文件。IAR C / C ++編譯器和IAR匯編器。兩者都產(chǎn)生行業(yè)標(biāo)準(zhǔn)格式ELF中的可重定位目標(biāo)文件,包括DWARF調(diào)試信息的格式。下圖顯示了編譯過程:
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 是一款功能強大,靈活的軟件工具,可用于嵌入式控制器應(yīng)用程序的開發(fā)。它同樣適用于鏈接小型,單文件,絕對匯編程序,因為它用于鏈接大型可重定位輸入,多模塊,C/C++ 或混合 C/ C++ 和匯編程序。??ilinkarm 使用并生成行業(yè)標(biāo)準(zhǔn)的 ELF 和 DWARF 作為對象格式文件。在.armconfig目錄下,包含了針對各平臺的連接器使用的配置文件。
E:Program Files (x86)IAR SystemsEmbedded Workbench 8.2armin>ilinkarm ? IAR ELF Linker V8.32.3.193/W32 for ARM ? Copyright 2007-2019 IAR Systems AB. Available command line options: --advanced_heap Use an advanced heap manager. --basic_heap ? ?Use a basic heap manager --BE32 ? ? ? ? ?Use old type big-endian mode. --BE8 ? ? ? ? ? Use byte invariant mode. --bounds_table_size number_of_records[:number_of_buckets]|(number_of_bytes) ? ? ? ? ? ? ? ?Specify size of bounds checking tables --call_graph file|directory ? ? ? ? ? ? ? ?Produce an XML call graph file --config file ? Read linker configuration from file --config_def symbol=value ? ? ? ? ? ? ? ?Define a config symbol --config_search directory ? ? ? ? ? ? ? ?Look for config files in directory --cpp_init_routine symbol ? ? ? ? ? ? ? ?Specify C++ dynamic init routine name --cpu core ? ? ?Specify target core ? ? ? ? ? ? ? ?Valid options are core names such as Cortex-M3 ? ? ? ? ? ? ? ?and architecture names such as 7M ? ? ? ? ? ? ? ?default is extracted from objects --debug_heap ? ?Use heap with runtime checks --default_to_complex_ranges ? ? ? ? ? ? ? ?Make "complex ranges" the default in initialize directives --define_symbol symbol=value ? ? ? ? ? ? ? ?Define absolute symbol --dependencies=[i|m|n][s][lw][b] file|directory|+ ? ? ? ? ? ? ? ?List file dependencies ? ? ? ? ? ? ? ? ? i ? ? Include filename only (default) ? ? ? ? ? ? ? ? ? m ? ? Makefile style (multiple rules) ? ? ? ? ? ? ? ? ? n ? ? Makefile style (one rule) ? ? ? ? ? ? ? ? ? s ? ? Don't include system file dependencies ? ? ? ? ? ? ? ? ? l ? ? Use locale encoding instead of UTF-8 ? ? ? ? ? ? ? ? ? w ? ? Use little endian UTF-16 instead of UTF-8 ? ? ? ? ? ? ? ? ? b ? ? Use a Byte Order Mark in UTF-8 output ? ? ? ? ? ? ? (+: output same as -o, only with .d extension) --diagnostics_tables file|directory ? ? ? ? ? ? ? ?Dump diagnostic message tables to file --diag_error tag,tag,... ? ? ? ? ? ? ? ?Treat the list of tags as error diagnostics --diag_remark tag,tag,... ? ? ? ? ? ? ? ?Treat the list of tags as remark diagnostics --diag_suppress tag,tag,... ? ? ? ? ? ? ? ?Suppress the list of tags as diagnostics --diag_warning tag,tag,... ? ? ? ? ? ? ? ?Treat the list of tags as warning diagnostics --do_segment_pad ? ? ? ? ? ? ? ?Pad segments to 4 byte alignment --enable_hardware_workaround waid[,waid[...]] ? ? ? ? ? ? ? ?Generate hardware workaround for specified problem --enable_stack_usage ? ? ? ? ? ? ? ?Enable stack usage analysis --entry symbol ?Set program entry point --error_limit limit ? ? ? ? ? ? ? ?Stop after this many errors (0 = no limit) --exception_tables action ? ? ? ? ? ? ? ?Generate exception tables for modules lacking them ? ? ? ? ? ? ? ? ?nocreate ? ?Do not generate entries (default) ? ? ? ? ? ? ? ? ?unwind ? ? ?Generate unwind entries ? ? ? ? ? ? ? ? ?cantunwind ?Generate nounwind entries --export_builtin_config file|directory ? ? ? ? ? ? ? ?Export the builtin configuration --extra_init routine ? ? ? ? ? ? ? ?Call extra init routine if defined -f file ? ? ? ? Read command line options from file --f file ? ? ? ?Read command line options from file and report dependency --force_exceptions ? ? ? ? ? ? ? ?Always include exception code --force_output ?Produce an output file in spite of errors --fpu {VFPv1|VFPv2|VFPv3{_D16}{_FP16}|VFP9-S|none} ? ? ? ? ? ? ? ?Specify target FPU coprocessor support ? ? ? ? ? ? ? ?Default is extracted from objects. --ignore_uninstrumented_pointers ? ? ? ? ? ? ? ?Disable checking of accesses via pointers in memory with ? ? ? ? ? ? ? ?no bounds --image_input file[,symbol[,section[,alignment]]] ? ? ? ? ? ? ? ?Put image file in section --import_cmse_lib_in file ? ? ? ? ? ? ? ?Read previous version of import library for building non-secure image --import_cmse_lib_out file|directory ? ? ? ? ? ? ? ?Produce import library for building non-secure image --inline ? ? ? ?Try to inline small functions. --keep symbol ? Require global symbol --log topic,topic,... ? ? ? ? ? ? ? ?Do log output for the selected topics ? ? ? ? ? ? ? ? ? call_graph ? ? ? ?Call graph with stack usage ? ? ? ? ? ? ? ? ? crt_routine_selection ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? CRT routine implementation selection ? ? ? ? ? ? ? ? ? demangle ? ? ? ? ?Demangle symbols in log output ? ? ? ? ? ? ? ? ? fragment_info ? ? Supplementary info for --log sections ? ? ? ? ? ? ? ? ? initialization ? ?Initialization decisions ? ? ? ? ? ? ? ? ? inlining ? ? ? ? ?Small function inlining ? ? ? ? ? ? ? ? ? libraries ? ? ? ? Automatic library selection ? ? ? ? ? ? ? ? ? merging ? ? ? ? ? Results of --merge_duplicate_sections ? ? ? ? ? ? ? ? ? modules ? ? ? ? ? Module selection ? ? ? ? ? ? ? ? ? redirects ? ? ? ? Redirected symbols ? ? ? ? ? ? ? ? ? sections ? ? ? ? ?Section fragment selection ? ? ? ? ? ? ? ? ? unused_fragments ?Unused section fragments ? ? ? ? ? ? ? ? ? veneers ? ? ? ? ? Veneer statistics --log_file file Specify file for log output --mangled_names_in_messages ? ? ? ? ? ? ? ?Include mangled symbol names in diagnostics --manual_dynamic_initialization ? ? ? ? ? ? ? ?Don't perform dynamic initialization during startup --map file|directory ? ? ? ? ? ? ? ?Produce a linker list file --merge_duplicate_sections ? ? ? ? ? ? ? ?Merge equivalent read-only sections --misrac1998[=arg,arg,...] ? ? ? ? ? ? ? ?Enable MISRA-C 1998 diagnostics ? ? ? ? ? ? ? ? ? ?all ? ? ? Enable all rules ? ? ? ? ? ? ? ? ? ?required ?Enable all required rules ? ? ? ? ? ? ? ? ? ?i ? ? ? ? Enable rule i ? ? ? ? ? ? ? ? ? ?i-j ? ? ? Enable rule i through j ? ? ? ? ? ? ? ? ? ?~i ? ? ? ?Disable rule i ? ? ? ? ? ? ? ? ? ?~i-j ? ? ?Disable rule i through j --misrac2004[=arg,arg,...] ? ? ? ? ? ? ? ?Enable MISRA-C 2004 diagnostics ? ? ? ? ? ? ? ? ? ?all ? ? ? Enable all rules ? ? ? ? ? ? ? ? ? ?required ?Enable all required rules ? ? ? ? ? ? ? ? ? ?X ? ? ? ? Enable rule or chapter ? ? ? ? ? ? ? ? ? ?X-Y ? ? ? Enable range ? ? ? ? ? ? ? ? ? ?~X ? ? ? ?Disable rule or chapter ? ? ? ? ? ? ? ? ? ?~X-Y ? ? ?Disable range ? ? ? ? ? ? ? ? ?where X and Y is one of: ? ? ? ? ? ? ? ? ? ?i ? ? ? ? All rules in chapter i ? ? ? ? ? ? ? ? ? ?i.j ? ? ? Rule i.j --misrac_verbose ? ? ? ? ? ? ? ?Enable verbose MISRA C messages --no_bom ? ? ? ?Don't use a Byte Order Mark in Unicode output --no_dynamic_rtti_elimination ? ? ? ? ? ? ? ?Disable dynamic rtti elimination --no_entry ? ? ?This program has no entry point --no_exceptions Signal an error if exceptions are used --no_fragments ?Always link entire sections --no_free_heap ?Use a heap manager with no 'free' --no_inline func,func,... ? ? ? ? ? ? ? ?Do not inline any of the specified functions --no_library_search ? ? ? ? ? ? ? ?Disable automatic runtime library search --no_literal_pool ? ? ? ? ? ? ? ?Don't generate literal pool in code memory --no_locals ? ? Do not include local symbols in output symbol table --no_range_reservations ? ? ? ? ? ? ? ?Do not reserve address ranges for absolute symbols --no_remove ? ? Do not remove unused sections --no_vfe ? ? ? ?Disable Virtual Fuction Elimination --no_warnings ? Disable generation of warnings --no_wrap_diagnostics ? ? ? ? ? ? ? ?Don't wrap long lines in diagnostic messages --only_stdout ? Use stdout only (no console output on stderr) --output file -o file ? ? ? ? Specify output file --pi_veneers ? ?Generate position independent veneers. --place_holder symbol[,size[,section[,alignment]]] ? ? ? ? ? ? ? ?Reserve a place in ROM for later use --preconfig file ? ? ? ? ? ? ? ?Read before normal linker configuration file --printf_multibytes ? ? ? ? ? ? ? ?Enable multibyte support in printf & friends --redirect orig=replacement ? ? ? ? ? ? ? ?Redirect symbol refs to replacement symbol --remarks ? ? ? Enable generation of remarks --scanf_multibytes ? ? ? ? ? ? ? ?Enable multibyte support in scanf & friends --search directory -L directory ? ?Look for object and library files in directory --semihosting[=iar_breakpoint] ? ? ? ? ? ? ? ?Link with debug interface. ? ? ? ? ? ? ? ?Specify interface to override default. --silent ? ? ? ?Silent operation --stack_usage_control file ? ? ? ? ? ? ? ?Read stack usage control file --strip ? ? ? ? Do not include debug information --text_out encoding ? ? ? ? ? ? ? ?Encoding to use for text output files ? ? ? ? ? ? ? ? ? utf8 ? ? ? ? ? ? ? ?UTF-8 ? ? ? ? ? ? ? ? ? utf16le ? ? ? ? ? ? Little-endian UTF-16 ? ? ? ? ? ? ? ? ? utf16be ? ? ? ? ? ? Big-endian UTF-16 ? ? ? ? ? ? ? ? ? locale ? ? ? ? ? ? ?Locale specific encoding --threaded_lib ?Configure runtime library for use with threads --timezone_lib ?Enable timezone and daylight savings support --treat_rvct_modules_as_softfp ? ? ? ? ? ? ? ?link softfp versions of math function for modules ? ? ? ? ? ? ? ?compiled with RVCT even though they are built with ? ? ? ? ? ? ? ?vfp calling-convention --use_full_std_template_names ? ? ? ? ? ? ? ?Don't use short names for standard C++ templates --use_optimized_variants no|auto|small|fast ? ? ? ? ? ? ? ?Use optimized variants of DLIB library functions ? ? ? ? ? ? ? ? ?no ? ? Do not use redirects to use optimized variants ? ? ? ? ? ? ? ? ?auto ? Use redirects based on attributes in object files ? ? ? ? ? ? ? ? ? ? ? ? (default) ? ? ? ? ? ? ? ? ?small ?Always use a small variant if available ? ? ? ? ? ? ? ? ?fast ? Always use a fast variant if available --utf8_text_in ?Non-source text input files with no BOM use UTF-8 encoding --version ? ? ? Output version information and exit --vfe=[forced] ?Perform Virtual Function Elimination ? ? ? ? ? ? ? ? ?forced ? ? ?Force the use of VFE for all modules ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?with VFE information. --warnings_affect_exit_code ? ? ? ? ? ? ? ?Warnings affect exit code --warnings_are_errors ? ? ? ? ? ? ? ?All warnings are errors --whole_archive archive ? ? ? ? ? ? ? ?Link all modules in archive
IAR ILINK鏈接器(ilinkarm.exe)用于構(gòu)建最終應(yīng)用程序。通常,鏈接器需要以下信息作為輸入:
幾個目標(biāo)文件,可能還有某些庫
程序開始標(biāo)簽(默認(rèn)設(shè)置)
鏈接器配置文件,用于描述目標(biāo)系統(tǒng)內(nèi)存中代碼和數(shù)據(jù)的放置
下圖顯示了鏈接過程:
IAR ILINK鏈接器生成ELF格式的絕對目標(biāo)文件,其中包含可執(zhí)行鏡像。鏈接后,可以使用生成的絕對可執(zhí)行映像
加載到IAR C-SPY調(diào)試器或任何其他兼容的外部調(diào)試器讀取ELF和DWARF。
使用flash / PROM編程器對flash / PROM進(jìn)行編程。在此之前可能必須使用ielftool將鏡像中的實際字節(jié)轉(zhuǎn)換為標(biāo)準(zhǔn)的Motorola 32-bit S-record 格式或Intel Hex-32格式。
iarchive.exe
??檔案管理工具,類似于 ARM 的 armar 和 GCC 的 ar。用于創(chuàng)建和操作幾個ELF目標(biāo)文件的庫(存檔)。庫文件包含多個可重定位的 ELF 對象模塊,每個模塊都可以由鏈接器獨立使用。與直接指定給鏈接器的對象模塊相比,只有在需要時才包含庫中的每個模塊。
E:Program Files (x86)IAR SystemsEmbedded Workbench 8.2armin>iarchive ? IAR Archive Tool V10.4.14.1149 ? Copyright 2008-2019 IAR Systems AB. Usage: ? ? ? ? ?iarchive [command] archive obj1 ... objN ? ? ? ? ? ? ? ?iarchive [command] obj1 ... objN -o archive ? ? ? ? ? ? ? ?iarchive [command] archive Available command line options: --create ? ? ? ?Create new archive --delete -d ? ? ? ? ? ? ?Delete module(s) from archive --extract -x ? ? ? ? ? ? ?Extract module(s) from archive -f file ? ? ? ? Read command line options from file --f file ? ? ? ?Read command line options from file and report dependency --no_bom ? ? ? ?Don't use a Byte Order Mark in Unicode output --output archive -o archive ? ? ?Name of archive file --replace -r ? ? ? ? ? ? ?Replace or add module(s) to archive --symbols ? ? ? List symbol table of archive --text_out encoding ? ? ? ? ? ? ? ?Encoding to use for text output files ? ? ? ? ? ? ? ? ? utf8 ? ? ? ? ? ? ? ?UTF-8 ? ? ? ? ? ? ? ? ? utf16le ? ? ? ? ? ? Little-endian UTF-16 ? ? ? ? ? ? ? ? ? utf16be ? ? ? ? ? ? Big-endian UTF-16 ? ? ? ? ? ? ? ? ? locale ? ? ? ? ? ? ?Locale specific encoding --toc -t ? ? ? ? ? ? ?List archive table of content --utf8_text_in ?Non-source text input files with no BOM use UTF-8 encoding --verbose -V ? ? ? ? ? ? ?verbose operation --version ? ? ? Output version information and exit --vtoc ? ? ? ? ?List archive table of content (verbose) 123456789101112131415161718192021222324252627282930313233343536
使用示例:
使用源對象文件module1.o、module.2.o和module3.o 創(chuàng)建了一個名為mylibrary.a的庫文件:iarchive mylibrary.a module1.o module2.o module3.o
列出 mylibrary.a中的內(nèi)容:iarchive --toc mylibrary.a
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 可執(zhí)行映像執(zhí)行各種轉(zhuǎn)換(例如,填充,校驗和,格式轉(zhuǎn)換等)。安裝目錄.arm srcelfutils下提供了 ielftool 源代碼(Microsoft VisualStudio項目)。如果對如何生成校驗和或格式轉(zhuǎn)換要求有特定要求,則可以相應(yīng)地修改源代碼。
E:Program Files (x86)IAR SystemsEmbedded Workbench 8.2armin>iarchive ? IAR Archive Tool V10.4.14.1149 ? Copyright 2008-2019 IAR Systems AB. Usage: ? ? ? ? ?iarchive [command] archive obj1 ... objN ? ? ? ? ? ? ? ?iarchive [command] obj1 ... objN -o archive ? ? ? ? ? ? ? ?iarchive [command] archive Available command line options: --create ? ? ? ?Create new archive --delete -d ? ? ? ? ? ? ?Delete module(s) from archive --extract -x ? ? ? ? ? ? ?Extract module(s) from archive -f file ? ? ? ? Read command line options from file --f file ? ? ? ?Read command line options from file and report dependency --no_bom ? ? ? ?Don't use a Byte Order Mark in Unicode output --output archive -o archive ? ? ?Name of archive file --replace -r ? ? ? ? ? ? ?Replace or add module(s) to archive --symbols ? ? ? List symbol table of archive --text_out encoding ? ? ? ? ? ? ? ?Encoding to use for text output files ? ? ? ? ? ? ? ? ? utf8 ? ? ? ? ? ? ? ?UTF-8 ? ? ? ? ? ? ? ? ? utf16le ? ? ? ? ? ? Little-endian UTF-16 ? ? ? ? ? ? ? ? ? utf16be ? ? ? ? ? ? Big-endian UTF-16 ? ? ? ? ? ? ? ? ? locale ? ? ? ? ? ? ?Locale specific encoding --toc -t ? ? ? ? ? ? ?List archive table of content --utf8_text_in ?Non-source text input files with no BOM use UTF-8 encoding --verbose -V ? ? ? ? ? ? ?verbose operation --version ? ? ? Output version information and exit --vtoc ? ? ? ? ?List archive table of content (verbose) E:Program Files (x86)IAR SystemsEmbedded Workbench 8.2armin>ielftool ? IAR ELF Tool V10.4.14.1149 [BUILT at IAR] ? Copyright 2007-2019 IAR Systems AB. Usage: ? ? ? ielftool input_file output_file Available command line options: --bin ? ? ? ? ? Save as raw binary --checksum sym:size,algo[:[1|2][a|m|z][r][R][o][x][i|p][W|L]][,start] ? ? ? ? ? ;range[;range...] ? ? ? ? ? ? ? ?Generate checksum ? ? ? ? ? ? ? ? ? sym ? ? ? Checksum symbol ? ? ? ? ? ? ? ? ? size ? ? ?Length of the symbol in bytes ? ? ? ? ? ? ? ? ? algo ? ? ?Algorithm: sum, sum8wide, sum32, crc16, crc32 ? ? ? ? ? ? ? ? ? ? ? ? ? ? crc64iso, crc64ecma or crc=poly ? ? ? ? ? ? ? ? ? 1|2 ? ? ? Complement: 1 or 2 ? ? ? ? ? ? ? ? ? a|m|z ? ? Reverse the bit order for: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? input bytes only: a ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? input bytes and final checksum: m ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? final checksum only: z ? ? ? ? ? ? ? ? ? o ? ? ? ? Output the Rocksoft model specification ? ? ? ? ? ? ? ? ? r ? ? ? ? Reverse the byte order within each word ? ? ? ? ? ? ? ? ? R ? ? ? ? Traverse the range(s) in reverse order ? ? ? ? ? ? ? ? ? x ? ? ? ? Toggle the endianess of the checksum ? ? ? ? ? ? ? ? ? i|p ? ? ? Use initial value normally: i ? ? ? ? ? ? ? ? ? ? ? ? ? ? Prefix input data with the start value: p ? ? ? ? ? ? ? ? ? W|L ? ? ? Use a checksum unit length of 2 bytes: W ? ? ? ? ? ? ? ? ? ? ? ? ? ? Use a checksum unit length of 4 bytes: L ? ? ? ? ? ? ? ? ? start ? ? Initial checksum value (defaults to 0) ? ? ? ? ? ? ? ? ? range ? ? Do checksum of bytes in range --fill [v;]pattern;range[;range...] ? ? ? ? ? ? ? ?Specify fill ? ? ? ? ? ? ? ? ? v ? ? ? ? Virtual fill, do not generate actual filler bytes. ? ? ? ? ? ? ? ? ? ? ? ? ? ? This can be used for checksums and parities. ? ? ? ? ? ? ? ? ? pattern ? Sequence of filler bytes ? ? ? ? ? ? ? ? ? range ? ? Fill range --front_headers Move program and section headers to the front of the ELF file. --ihex ? ? ? ? ?Save as 32-bit linear Intel Extended hex --offset [-]offset ? ? ? ? ? ? ? ?Add (subtract if - is used) offset to all address records. ? ? ? ? ? ? ? ?This only works for the output formats: Motorola S-records, ? ? ? ? ? ? ? ?Intel Hex, Simple-Code and TI-TXT --parity sym:size,algo:flashbase[:[r][[B|W|L]];range[;range...] ? ? ? ? ? ? ? ?Generate parity bits ? ? ? ? ? ? ? ? ? sym ? ? ? Parity symbol ? ? ? ? ? ? ? ? ? size ? ? ?Length of the symbol in bytes ? ? ? ? ? ? ? ? ? algo ? ? ?Parity algorithm: odd, even ? ? ? ? ? ? ? ? ? flashbase Ignore bytes before this address ? ? ? ? ? ? ? ? ? r ? ? ? ? Traverse the range(s) in reverse order ? ? ? ? ? ? ? ? ? B ? ? ? ? Use a parity unit length of 1 byte ? ? ? ? ? ? ? ? ? W ? ? ? ? Use a parity unit length of 2 bytes ? ? ? ? ? ? ? ? ? L ? ? ? ? Use a parity unit length of 4 bytes ? ? ? ? ? ? ? ? ? range ? ? Perform parity on bytes in this range --self_reloc relocator[,jtc] ? ? ? ? ? ? ? ?Create self-relocating image with relocator ? ? ? ? ? ? ? ? ? jtc ? ? ? Number of jump table entries --silent ? ? ? ?Silent operation --simple ? ? ? ?Save as Simple-code --simple-ne ? ? Save as Simple-code without entry record --srec ? ? ? ? ?Save as Motorola S-records --srec-len length ? ? ? ? ? ? ? ?Restrict the length of S-records --srec-s3only ? Restrict the type of S-records to S3 (and S7) --strip ? ? ? ? Remove all section headers and non-program sections --titxt ? ? ? ? Save as Texas Instruments TI-TXT --verbose ? ? ? Print all performed operations --version ? ? ? Output tool version
使用示例:
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,用于創(chuàng)建ELF可重定位或可執(zhí)行映像內(nèi)容的文本表示。主要用于以下三個方面:
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.生成輸入文件的常規(guī)屬性列表以及它包含的ELF段和ELF節(jié)。當(dāng)沒有使用命令行選項時,這是默認(rèn)行為。
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部分內(nèi)容的文本表示。要指定此行為,請使用命令行選項–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節(jié)的文本表示。要指定此行為,請使用命令行選項–section
E:Program Files (x86)IAR SystemsEmbedded Workbench 8.2armin>ielfdumparm ? IAR ELF Dumper V8.32.3.193 for ARM ? Copyright 2007-2019 IAR Systems AB. Usage: ? ? ? ? ?IElfDump input_file [output_file] Available command line options: -a ? ? ? ? ? ? ?All sections, except strtab sections --aarch64 ? ? ? Disassemble in Aarch64 mode if mode cannot be deduced by the image. --all ? ? ? ? ? Dump all sections --arm ? ? ? ? ? Disassemble in Arm mode if mode cannot be deduced by the image. --code ? ? ? ? ?Dump only code sections --disasm_data ? Use disassembly format for data sections -f file ? ? ? ? Read command line options from file --f file ? ? ? ?Read command line options from file and report dependency --no_bom ? ? ? ?Don't use a Byte Order Mark in Unicode output --no_header ? ? Do not produce a list header --no_rel_sections ? ? ? ? ? ? ? ?Do not output associated .rel sections --no_strtab ? ? Do not include strtab sections --no_utf8_in ? ?Non-IAR input files are by default assumed to use UTF-8 ? ? ? ? ? ? ? ?encoding unless this option is used. --output file -o file ? ? ? ? Name of text file to create --range A-B ? ? Disassemble only addresses in the specified range ? ? ? ? ? ? ? (from A to B). --raw ? ? ? ? ? Use raw text format --section #|name[,...] -s #|name[,...] Dump only section(s) with given numbers/names --source ? ? ? ?Include source in disassembled code in executables --text_out encoding ? ? ? ? ? ? ? ?Encoding to use for text output files ? ? ? ? ? ? ? ? ? utf8 ? ? ? ? ? ? ? ?UTF-8 ? ? ? ? ? ? ? ? ? utf16le ? ? ? ? ? ? Little-endian UTF-16 ? ? ? ? ? ? ? ? ? utf16be ? ? ? ? ? ? Big-endian UTF-16 ? ? ? ? ? ? ? ? ? locale ? ? ? ? ? ? ?Locale specific encoding --thumb ? ? ? ? Disassemble in thumb mode if mode cannot be deduced by the image. --use_full_std_template_names ? ? ? ? ? ? ? ?Don't use short names for standard C++ templates --utf8_text_in ?Non-source text input files with no BOM use UTF-8 encoding --version ? ? ? Output version information and exit
iobjmanip.exe
針對 ARM ELF 格式的 Object 文件的操作工具。用于執(zhí)行ELF目標(biāo)文件的低級操作。
E:Program Files (x86)IAR SystemsEmbedded Workbench 8.2armin>iobjmanip ? IAR Object File Manipulator V10.4.14.1149 ? Copyright 2009-2019 IAR Systems AB. Usage: ? ? ? ? ?iobjmanip[,... ] Available command line options: -f file ? ? ? ? Read command line options from file --f file ? ? ? ?Read command line options from file and report dependency --no_bom ? ? ? ?Don't use a Byte Order Mark in Unicode output --remove_file_path ? ? ? ? ? ? ? ?remove path information from file symbol --remove_section #|name ? ? ? ? ? ? ? ?remove matching section(s) --rename_section (#|name)=name ? ? ? ? ? ? ? ?rename matching section(s) --rename_symbol name=name ? ? ? ? ? ? ? ?rename matching symbol --strip ? ? ? ? strip debug information --text_out encoding ? ? ? ? ? ? ? ?Encoding to use for text output files ? ? ? ? ? ? ? ? ? utf8 ? ? ? ? ? ? ? ?UTF-8 ? ? ? ? ? ? ? ? ? utf16le ? ? ? ? ? ? Little-endian UTF-16 ? ? ? ? ? ? ? ? ? utf16be ? ? ? ? ? ? Big-endian UTF-16 ? ? ? ? ? ? ? ? ? locale ? ? ? ? ? ? ?Locale specific encoding --utf8_text_in ?Non-source text input files with no BOM use UTF-8 encoding --version ? ? ? Output version information and exit 1234567891011121314151617181920212223242526272829
使用示例:
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
絕對符號導(dǎo)出器。從ROM映像文件中導(dǎo)出絕對符號,以便在鏈接附加應(yīng)用程序時使用它們。
E:Program Files (x86)IAR SystemsEmbedded Workbench 8.2armin>isymexport ? IAR Absolute Symbol Exporter V10.4.14.1149 ? Copyright 2008-2019 IAR Systems AB. Usage: ? ? ? ? ?ISymExport input_file output_file Available command line options: --edit steering_file ? ? ? ? ? ? ? ?Show/hide/rename symbols --export_locals[=symbol_prefix] ? ? ? ? ? ? ? ?Export local variable and function symbols -f file ? ? ? ? Read command line options from file --f file ? ? ? ?Read command line options from file and report dependency --generate_vfe_header ? ? ? ? ? ? ? ?Generate vfe header section --no_bom ? ? ? ?Don't use a Byte Order Mark in Unicode output --ram_reserve_ranges[=symbol_prefix] ? ? ? ? ? ? ? ?Generate symbols to reserve all occupied RAM ranges --reserve_ranges[=symbol_prefix] ? ? ? ? ? ? ? ?Generate symbols to reserve all occupied ranges --show_entry_as[=name] ? ? ? ? ? ? ? ?Export the entry point of the program as name --text_out encoding ? ? ? ? ? ? ? ?Encoding to use for text output files ? ? ? ? ? ? ? ? ? utf8 ? ? ? ? ? ? ? ?UTF-8 ? ? ? ? ? ? ? ? ? utf16le ? ? ? ? ? ? Little-endian UTF-16 ? ? ? ? ? ? ? ? ? utf16be ? ? ? ? ? ? Big-endian UTF-16 ? ? ? ? ? ? ? ? ? locale ? ? ? ? ? ? ?Locale specific encoding --utf8_text_in ?Non-source text input files with no BOM use UTF-8 encoding --version ? ? ? Output version information and exit
iexe2obj.exe
IAR ELF可重定位對象創(chuàng)建器。從可執(zhí)行的ELF目標(biāo)文件創(chuàng)建可重定位的ELF目標(biāo)文件。
E:Program Files (x86)IAR SystemsEmbedded Workbench 8.2armin>iexe2obj ? IAR ELF Exe to Object Tool V10.4.14.1149 ? Copyright 2008-2019 IAR Systems AB. Usage: ? ? ? ? ?IExe2Obj input_file output_file Available command line options: -f file ? ? ? ? Read command line options from file --f file ? ? ? ?Read command line options from file and report dependency --hide_symbols ?Hide all symbols in the image --keep_mode_symbols ? ? ? ? ? ? ? ?Keep mode symbols in the image --no_bom ? ? ? ?Don't use a Byte Order Mark in Unicode output --prefix prefix Set section/symbol name prefix --text_out encoding ? ? ? ? ? ? ? ?Encoding to use for text output files ? ? ? ? ? ? ? ? ? utf8 ? ? ? ? ? ? ? ?UTF-8 ? ? ? ? ? ? ? ? ? utf16le ? ? ? ? ? ? Little-endian UTF-16 ? ? ? ? ? ? ? ? ? utf16be ? ? ? ? ? ? Big-endian UTF-16 ? ? ? ? ? ? ? ? ? locale ? ? ? ? ? ? ?Locale specific encoding --utf8_text_in ?Non-source text input files with no BOM use UTF-8 encoding --version ? ? ? Output version information and exit --wrap function Create wrapper for function
GCC for ARM
GCC 原名為 GNU C 語言編譯器(GNU C Compiler),因為它原本只能處理 C 語言。不過,后來 GCC 被進(jìn)行了擴展,變得可處理 C++。后來又?jǐn)U展能夠支持更多編程語言,如 Fortran、Pascal、Objective-C、Java、Ada、Go 以及各類處理器架構(gòu)上的匯編語言等,所以改名 GNU 編譯器套件(GNU Compiler Collection)。更名之后,原來的針對于 C 語言的編譯器名字還叫 gcc,針對 C++ 的編譯器叫做 g++ 。
GCC for ARM(這個名字是我自己起的,用來代指所有基于 GCC 的針對 ARM 平臺的編譯套件) 是基于 GCC 開發(fā)的,用來編譯生成 ARM 內(nèi)核可執(zhí)行文件的編譯套件,也叫 ARM 交叉編譯工具鏈。 相比于以上兩個巨貴的編譯器,GCC for ARM 因為是基于開源的 GCC 的,因此是免費的。目前主要由三大主流工具商提供,第一是 ARM,第二是 Codesourcery,第三是 Linora。目前我們用的針對 ARM 芯片的集成開發(fā)環(huán)境(IDE),除了 IAR 和 ARM 自己的 Keil、DS ,大多都是使用 GCC for ARM 的編譯器!
首先,看看 ARM 交叉編譯工具鏈的命名規(guī)則:arch [-vendor] [-os] [-(gnu)eabi] [-gcc]
arch:體系架構(gòu),如 ARM,MIPS
vendor:工具鏈提供商,沒有 vendor 時,用 none 代替;
os:目標(biāo)操作系統(tǒng),沒有 os 支持時,也用 none 代替
eabi:嵌入式應(yīng)用二進(jìn)制接口(Embedded Application Binary Interface)
如果同時沒有 vendor 和 os 支持,則只用一個 none 代替。例如 arm-none-eabi 中的 none 表示既沒有 vendor 也沒有 os 支持。 前面說過,GCC for ARM 是基于 GCC 開發(fā)的。因此,其和 GCC 一樣是一套命令行工具的集合,理論上可以將它集成到其他任何集成開發(fā)環(huán)境中,從而不直接使用命令行。GCC for ARM 中的各命令行工具與 GCC 中的各命令行工具都是對應(yīng)的,功能基本一致,僅僅是名字有些改變!
基于 GCC 的 ARM 編譯工具鏈提供商有 ARM、Codesourcery、Linaro 這三家,但其中使用最多還是 ARM 提供的 GCC 編譯器。下面我們分別簡單來介紹一下這三家的編譯工具鏈。
Arm GNU Toolchain
ARM 除了有自己的專用編譯器之外,還維護(hù)了一套基于 GCC 的交叉編譯工具鏈,被稱為 Arm GNU Toolchain。估計是為了能更有效的占有市場吧!絕大多數(shù)第三方的 IDE 都是使用這一套交叉編譯工具鏈。
注意,在 2022 年之前,Arm GNU Toolchain 被分為了 A-profile(GNU Toolchain for A-profile processors) 和 R & M profiles(GNU Arm Embedded Toolchain)兩大類,但是從 2022 年開始統(tǒng)一為了一個,之前的已經(jīng)停止開發(fā)。2022 年第一版叫做 Arm GNU Toolchain Version 11.2-2022.02。
在 2022 年以前 R & M profiles 編譯工具鏈的名字只有 arm-none-eabi,只能編譯裸機平臺,Cortex-A 則有裸機和 Linux 版之分的多種編譯工具鏈;在 2022 年開始,則根據(jù)架構(gòu)及是否支持 Linux 系統(tǒng)進(jìn)行了大一統(tǒng),我們可以根據(jù)需要選擇合適的版本。
下面這兩個章節(jié)還是 2022 年以前的 Arm GNU Toolchain 的介紹。2022 年以前的 Arm GNU Toolchain 官網(wǎng)還提供下載,只是不再進(jìn)行更新。
arm-none-eabi
用于編譯 ARM 架構(gòu)的裸機系統(tǒng)(包括 ARM Linux 的 boot、kernel,不適用編譯 Linux 應(yīng)用 Application),所以不支持那些跟操作系統(tǒng)關(guān)系密切的函數(shù),比如 fork,它使用的是 newlib 這個專用于嵌入式系統(tǒng)的 C 庫。這是目前我們編寫 ARM 裸機程序時,使用最多的交采編譯工具鏈! 安裝/解壓 之后,目錄如下圖所示:
??編譯器工具中的各工具,與標(biāo)準(zhǔn)的 GCC 沒有太多區(qū)別,主要就是針對的平臺變了。各工具的功能是一樣的!比如:arm-none-eabi-gcc.exe 是C 語言編譯器、arm-none-eabi-g++.exe 是 C++ 編譯器、arm-none-eabi-ld.exe 是連接器、arm-none-eabi-gdb.exe 是調(diào)試器等等。
?? 在很久以前,ARM 使用 launchpad 來維護(hù)該項目源碼。但是根據(jù)之前的公告,launchpad 上不發(fā)布編譯好的程序和源碼包(“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 官網(wǎng):https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/downloads 進(jìn)行下載,launchpad 僅用于 BUG 提交等。
Cortex-A 專用
??以上交叉編譯工具鏈只支持 ARM Cortex-M/R 等系列的核,ARM 官網(wǎng)還提供了針對于 ARM Cortex-A 系列內(nèi)核的交叉編譯工具鏈,可以從以下地址下載https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-a/downloads。具體如下所示:
需要注意的是,上圖中紅框全稱的就是編譯工具鏈的名字。各命令行工具與標(biāo)準(zhǔn) GCC 也沒啥區(qū)別!再一個需要注意的是,編譯器的目標(biāo)平臺。
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推出的產(chǎn)品叫 Sourcery G++ Lite Edition,其中基于 command-line 的編譯器是免費的,在官網(wǎng)上可以下載,而其中包含的 IDE 和 debug 工具是收費的。Codesourcery 公司(目前已經(jīng)被 Mentor 收購)基于 GCC 推出的 ARM 交叉編譯工具。可用于交叉編譯 ARM MCU 芯片,如 ARM7、ARM9、Cortex-M/R 芯片程序。??目前 CodeSourcery 已經(jīng)由明導(dǎo)國際 (Mentor Graphics) 收購,所以原本的網(wǎng)站風(fēng)格已經(jīng)全部變?yōu)?Mentor 樣式,這貨被收之后,不知道怎么下載其編譯工具鏈。。。
arm-none-linux-gnueabi-gcc: 用于交叉編譯 ARM(32位)系統(tǒng)中所有環(huán)節(jié)的代碼,包括裸機程序、u-boot、Linux kernel、filesystem和App應(yīng)用程序。
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 基礎(chǔ)架構(gòu)軟件研發(fā)商。其基于 GCC 推出的 ARM 交叉編譯工具如下圖所示:
下載地址為:https://www.linaro.org/downloads/ 。從上圖不難看出,Linaro 提供的交叉編譯環(huán)境,僅針對于 Cortex-A 內(nèi)核,其他 ARM 內(nèi)核則需要去 ARM 官網(wǎng)下載!
aarch64-linux-gnu: 針對于目標(biāo)平臺是 Linux 系統(tǒng),用于交叉編譯 ARMv8 64 位目標(biāo)中的裸機程序、u-boot、Linux kernel、filesystem 和 App 應(yīng)用程序。
arm-linux-gnueabihf: 針對于目標(biāo)平臺是 Linux 系統(tǒng),用于交叉編譯ARM(32位)系統(tǒng)中所有環(huán)節(jié)的代碼,包括裸機程序、u-boot、Linux kernel、filesystem和 App 應(yīng)用程序。
arm-eabi-gcc: 用于編譯 ARM 架構(gòu)的裸機系統(tǒng),包括 ARM Linux 的 boot、kernel,不適用編譯 Linux 應(yīng)用 Application
aarch64-elf: 用于編譯 ARM v8 64位架構(gòu)的裸機系統(tǒng),包括 ARM Linux 的 boot、kernel,不適用編譯 Linux 應(yīng)用 Application
??正如官網(wǎng)的說明,官方發(fā)布的編譯好二進(jìn)制可執(zhí)行編譯器文件,僅在 Linux 系統(tǒng)( Ubuntu LTS)進(jìn)行了測試。 目前,官方?jīng)]有提供其他平臺的可執(zhí)行程序!
參考
https://www.veryarm.com/
https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchai
編輯:黃飛
?
評論
查看更多