链接脚本总结

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*)
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值