1. 基本的架构:由section关键字将各个程序段囊括起来
SECTION{ .text:{ *(.text) //这里指的是将所有文件的.data字段放在一起 } .rodata{ *(.rodata) } .data{ *(.data) } .bss{ *(.bss) } }2. PROVIDE(s_data = .);
使用PROVIDE关键字可以使得变量在其它c代码中被引用,从而获取当前位置(.)的地址3.
3. 在程序段后面加地址可以直接指定程序段加载的虚拟地址,AT关键字可以指定加载的物理地址
.data 0x2000: AT(0){ }4. 单独指定一部分代码自定义链接
.first_task : AT(e_data){ *first_task_entry*(.text .rodata .bss .data) *first_task*(.text .rodata .bss .data) } //使用*xxx* 会告诉编译器搜索文件xxx //*first_task_entry*(.text .rodata .bss .data) 指定将该文件的各个程序段放在一起5. 注意在链接脚本中直接声明的地址都默认是虚拟地址,如果没有明确指定物理地址,则认为物理地址与虚拟地址一致
6. 取加载地址
e_first_task = LOADADDR(.first_task) + SIZEOF(.first_task);