1
SECTIONS {
.text 0 : { *(.text) }
.rodata : { *(.rodata) }
.data 0x30000000 : AT(0x800) { *(.data) } //这句话意思是 .data代码段数据放到 0x800这个地址,但是程序运行的时候要去 0x30000000去找。所以需要重定位把 0x800的数据移动到 0x30000000
.bss : { *(.bss) *(.COMMON) }
}
另一个
SECTIONS
{
. = 0×10000;
.text :
{
*(.text)
}

. = 0×8000000;
.data :
{
*(.data)
}
}
. = 0×10000;”该语句表示将当前地址设置为0x10000。如上代码中,意思是将所有目标文件的text段从0x10000地址开始存放。



2
SECTIONS
{
...
.data :
{
main.o(.data)
*(.data)
}
...
}
其中 *(.data) 表示将所有的目标的.data段链接到输出文件.data段中, 特别注意的是,之前链接的就不会再链接,这样做的目的是可以将某些特殊的目标文件链接到地址前面。


3
定位符号‘.’的使用
.’表示当前地址,它可以被赋值也可以赋值给某个变量。
如下为将当前地址赋值给某个变量(链接器链接是按照SECTIONS里的段顺序排列的,前面的排列完之后就能计算出当前地址)
RAM_START = .;


4
深入理解一下重定位跟链接文件
链接文件————————————————————————————————————对比 1 可以看出添加的三行都是为了方便重定位代码
SECTIONS {
.text 0 : { *(.text) }
.rodata : { *(.rodata) }
.data 0x30000000 : AT(0x800)
{
data_load_addr = LOADADDR(.data); //得到0x800 存储地址
data_start = . ; //得到0x30000000 内存开始的地址
*(.data)
data_end = . ; //得到内存结束地地址
}
.bss : { *(.bss) *(.COMMON) }
}
重定位汇编代码
/* 重定位data段 */
ldr r1, =data_load_addr /* data段在bin文件中的地址, 加载地址 */
ldr r2, =data_start /* data段在重定位地址, 运行时的地址 */
ldr r3, =data_end /* data段结束地址 */

cpy:
ldr r4, [r1] //一个一个字节迁移
str r4, [r2]
add r1, r1, #4
add r2, r2, #4
cmp r2, r3
ble cpy

5
SECTIONS 命令下的 .text .rodata .data 可以随便改成别的

6

```c
SECTIONS
{
.text :
{
*(.text*)
} > FLASH
}

.text段即代码段,* (.text*)指示将工程中所有目标文件的.text段链接到FLASH中
特别注意 写的是* (.text*)