本文共 2252 字,大约阅读时间需要 7 分钟。
链接脚本(Linker Script)是用于控制链接过程的文件,主要用于指定如何将输入文件的section合并到输出文件中,以及输出文件中各section在程序地址空间中的布局。链接脚本能够执行静态链接和动态链接任务,还能完成一些高级操作,如符号赋值和内存区域管理。
目标文件的格式通常为ELF格式,包含多个section,如.text(代码)、.data(数据)、.bss(未初始化的全局变量)、.sym(符号表)、.note(注释信息)等。
链接脚本由一系列命令组成,每个命令由关键字(后接参数)或对符号的赋值语句组成,命令由分号;分隔。文件名或格式名中若包含分号;或其他分隔符,需用引号"引用。注释用/* */之间的内容表示。
赋值语句:SYMBOL = EXPRESSION
输入文件引用:
INPUT(files):将括号内文件作为链接输入文件。GROUP(files):指定需要重复搜索的文件组,常用于处理共享库的依赖。输出文件定义:OUTPUT(FILENAME)
-o选项。搜索路径:SEARCH_DIR(PATH)
启动文件:STARTUP(filename)
目标文件格式:OUTPUT_FORMAT(BFDNAME)
字节顺序设置:OUTPUT_FORMAT(DEFAULT,BIG,LITTLE)
输入文件的BFD格式:TARGET(BFDNAME)
断言:ASSERT(EXP, MESSAGE)
EXP不为真时终止连接过程。符号处理:
EXTERN(SYMBOL ...):在输出文件中增加未定义的符号。FORCE_COMMON_ALLOCATION:为通用符号分配空间。内存区域管理:MEMORY
覆盖图描述:OVERLAY
程序头描述:PHDRS
版本控制:VERSION
a = 3; /* 全局位置 */.text : { *(.text) }_bdata = (. + 3) & ~4; /* SECTIONS命令内 */.data : { *(.data) } SECTIONS { SECTION-NAME [ADDRESS] [(TYPE)] : [AT(LMA)] { OUTPUT-SECTION-COMMAND ... } ...} NOLOAD)。SECTIONS { .text : { *(.text) } .data : { *(.data) } .bss : { *(.bss) *(COMMON) }} COMMON用于存储输入文件的通用符号。SECTIONS { outputa : 0x10000 : { all.o } foo.o(.input1)} KEEP()命令可强制保留特定section。MEMORY { rom (rx) : ORIGIN = 0, LENGTH = 256K ram (!rx) : org = 0x40000000, l = 4M} rom区域用于只读section,ram区域用于可读写section。PHDRS { headers PT_PHDR PHDRS interp PT_INTERP text PT_LOAD FILEHDR PHDRS data PT_LOAD dynamic PT_DYNAMIC} PHDRS命令用于定义ELF目标文件的程序头信息。PT_类型对应一个程序段,FILEHDR和PHDRS可选。链接脚本是链接过程中的核心文件,通过合理配置可以实现对目标文件section的精确控制,完成高级链接任务。理解链接脚本的语法和用法是高级程序员的必备技能。
转载地址:http://tve.baihongyu.com/