链接脚本总结
https://blog.csdn.net/Gagaaaaaa/article/details/140288305
链接脚本介绍
链接脚本的作用:将多个目标文件(.o)和库文件(.a)链接成一个可执行文件(输出文件),并控制输出文件的内存布局(地址分配)。
ENTRY命令
ENTRY(symbol) 设置入口点
MEMORY块
MEMORY为链接器提供系统内存的布局信息,并确定内存区域的访问权限。链接器根据MEMORY的信息,将编译生成的.o目标文件中的代码、数据、符号等分配到不同的内存区域。
MEMORY
{/*标准格式如下*/mem_name [(attr)] : ORIGIN = origin, LENGTH = lenRAM0 (xrw) : ORIGION = (0x00000000), LENGTH = 2MRAM1 (xrw) : ORIGION = (0x30000000), LENGTH = 128M
}
SECTIONS块
链接脚本可声明将指定的代码放到对应的memory区域——以下链接脚本代码将.text段存放到标号为RAM的内存区域,将.data段存放到标号为FLASH的内存区域:
SECTIONS
{.text >RAM /*.text也可以后面再细分*/.data >FLASH
}
‘.’ 表示当前地址,它可以被赋值,也可以赋值给某个变量。
SECTIONS
{ /*标准格式如下*/section-name [address] [(type)] :[AT(lma)][ALIGN(section_align)][SUBALIGN(subsection_align)][constraint]{contentscontents...} [>region] [AT>lma_region] [:phdr :phdr ...] [=fillexp]
}
链接脚本的本质是描述输入和输出的关系。section-name表示输出文件的段,即输出文件中有哪些段,而contents就是描述输出文件的这个段从哪些文件里抽取出来的,即输入文件。
PROVIDE命令
https://blog.csdn.net/weixin_44919664/article/details/146303669
作用: 定义一个’输入文件内被引用但没定义’的符号,相当于在符号表中定义一个全局变量,其他源文件可以操作这个符号来读写对应的内存(这个符号本身不占用内存|地址,链接脚本中的声明一个PROVIDE不会使地址计数器增加)
KEEP命令
保证链接器不优化指定的段(section)
attribute((section(" "))
将函数或变量放到指定的段里,然后可以在链接脚本内指定这个段的地址。
/* C file start */
Void MyFunction(void) __attribute__((section(".text.myfunci")));
Void MyFunction(void){//implement
};
/* C file end */
#define RTEMS_SECTION( _section ) __attribute__(( __section__( _section ) ))