IAR 选项介绍和ILINK链接器配置文件介绍



- 连接器选项设置

- IAR程序启动执行顺序
有的工程会使用IAR官方的.a库文件, 先从官方库启动。__iar_program_start被定义在库文件中,可以从map文件看到。


__iar_program_start
cmain → __low_level_init → __iar_data_init3 → __iar_zero_init3→ __iar_copy_init3:(这些函数初始化了定义了变量的内存,不需要太关心)
_call_main:
main(你写的程序)
- ILINK链接文件名词解释
简单的归纳icf的文件,其主要包括如下几个内容,即:
(1)可编址的存储空间(memory);
(2)不一样的存储地址区域(region);
(3)不一样的地址块(block);
(4)section的初始化与否;
(5)section在存储空间的放置。
section就是通常说的段,按包含被包含排序:region > block > section
section段可在C程序中使用相应关键字定义
上面几点内容,若是你对照实际icf文件都会找获得,建议你们尝试下,会让你受益不浅的。
- icf链接文件示例
.intvec 中断向量表地址
1 | (1)define [ exported ] symbol name = expr; |
- 系统预定义变量

- map文件


Ambiq继续引领低功耗单片机,新款Apollo4将2MB MRAM作为Flash
- IAR Linker在执行链接时,如果library或目标文件中的某些函数及变量没有被引用,为了减小生成的二进制文件的尺寸,这些函数或者变量会被丢弃,并不会被链接到可执行文件中。但有的时候,用户出于某些原因需要保留未引用的函数或者变量,IAR也提供了相应的方法来实现。
如果有C/C++源码,可以使用“__root”关键字,在定义时强制保留函数或变量。例如,要保留程序中未调用的GenerateRandomNumber()函数。
使用“__root”关键字:
__root void GenerateRandomNumber ()
但如果要保留的是静态库中的函数,就没法使用“__root”关键字了。可以使用Linker选项“–keep symbol”指令强制链接程序中未使用的符号,它作用范围是整个工程,不论需要保留的符号是在源码文件中还是静态库中都适用。
在Linker选项中使用“–keep”命令,保留GenerateRandomNumber ()函数:

这种方法适用于保留的符号不多的情况,假如有成百上千的符号要强制保留,使用这种的方法就不合适了。这时可以使用“–no_remove”或“–no_fragments”命令。
“–no_remove”和“–no_fragments”的作用范围也是整个工程。
此外,如果只想保留某几个library或目标文件中的某几个段,其他的段不需要进行链接,以达到保留所需要的段的同时,尽量减少代码的尺寸,可以在ILink配置文件中使用keep命令。
icf文件keep命令格式如下:
1 | keep { section-selectors }[ except { section-selectors} ]; |
object {module|filename}:
匹配静态库中的模块或者目标文件中的section才会选中。
except{}是可选项,用于排除要不需保留的段。
示例:保留Lib_section.a库中除了.function2以外属性为只读的段。
\1. 从IAR EWARM的安装目录下将对应的链接器配置文件复制到工程目录,避免修改原始的icf配置文件。然后进入工程的Options选项,选择Linker -> config,勾选 “Override defualt”,单击旁边的按钮,选择工程目录的icf文件,推荐$PROJ_DIR$相对路径。


2.用文本编辑器打开icf文件,可以在后面加上keep指令:
此后,构建程序时Lib_section.a中的只读段,除了.function2以外,不论程序中是否引用,都会保留,链接结果可用通过map文件来确认。
IAR的一些选项说明

- 编译临时输出文件夹设置


1 |
|
- 本文作者: 龙兄嵌入式
- 本文链接: https://hexo.880755.xyz/2022/04/26/IAR 选项介绍和ILINK链接器配置文件介绍/