ld链接脚本一些随笔

发布时间 2023-06-02 18:18:40作者: 周星星7290


链接:将多个目标文件(xx.o)、库文件(xx.a)、动态库(.so)等等链接成一个可执行文件。


常见段含义:
.text 代码段 存放程序执行代码区域
.data 初始化数据段 存放程序中已初始化的全局变量
.bss 未初始化的数据段 存放程序中未初始化的全局变量
.rodata 只读数据段 存放C中的字符串和#define定义的常量
(存放被初始化的数据)
.heap 堆 存放进程运行中被动态分配的内存段(malloc)
.stack 栈 存放程序临时创建的局部变量及函数调用压栈入栈(static 变量存放在数据段) 

 

输入部分是目标文件中的一段数据,它们通常由编译器或汇编器从源代码文件生成。在链接脚本中,可以使用 *(section_name) 语法来选择特定的输入部分并将它们放置在链接脚本中定义的输出部分中。

在链接过程中,链接器会根据链接脚本中的指令,将多个目标文件中的输入部分合并在一起,并确定它们在内存中的位置。最终生成的可执行文件或库文件包含了所有必要的信息,可以被操作系统加载并执行。

因此,输入部分是从目标文件中输入到链接脚本定义的输出部分中。最终,它们将被放置在内存中的相应位置。

 

 


那就是最后结束的地方>MALLOC要加上AT> FLASH,如果不加上的话,bin文件将连续生成,由于我们外部sram的地址在0x68000000,因此,gcc将会把这部分当做flash的地址一部分,也就是说将会生成一个超大的bin文件!

 

>RAM AT>FLASH
解释:

  >RAM:指出区间而不是具体地址:运行时的虚拟地址

  AT>FLASH:指出区间:装载时的装载地址

 

 

CPU执行每条指令,本质上包含5步:取指、译码、执行、访存、写回

Load$$LOAD_AP_FIRAM_ASMB$$Base 的值为 .load_ap_firam_asmb 区域的加载地址。加载地址是指内存区域在可执行文件中的位置。
Image$$LOAD_AP_FIRAM_ASMB$$Base 的值为当前位置。当前位置是指链接器在处理链接脚本时,当前所处的位置。
这两个符号通常用于计算内存区域在运行时的地址。例如,如果你知道某个变量在 .load_ap_firam_asmb 区域中的偏移量,那么你可以使用这两个符号来计算该变量在运行时的地址。

 

在许多嵌入式系统中,程序可以在Flash(非易失性存储器)或SRAM(静态随机访问存储器)中运行。通常,Flash中的代码执行速度较慢,但具有较大的存储容量,而SRAM中的代码执行速度更快,但存储容量较小。

 

该脚本定义了两个符号:Load$$LOAD_DRAM_SHARED$$Base 和 Image$$LOAD_DRAM_SHARED$$Base。这些符号分别表示该内存区域在加载时和运行时的起始地址。

然后,该脚本将所有 .data 段的内容放入该内存区域中。最后,该脚本再次对齐地址。

>MSMB_AREA AT>FLASH_AREA 指定了该内存区域的位置和加载地址。这意味着该内存区域将被放置在 MSMB_AREA 中,并且在加载时将被放置在 FLASH_AREA 中。

链接脚本中的 >MSMB_AREA AT>FLASH_AREA 指定了内存区域的位置和加载地址。>MSMB_AREA 指定了该内存区域在运行时的位置,即该内存区域将被放置在 MSMB_AREA 中。AT>FLASH_AREA 指定了该内存区域在加载时的位置,即该内存区域在加载时将被放置在 FLASH_AREA 中。

这意味着,在程序运行时,该内存区域中的数据将位于 MSMB_AREA 中。但是,在程序加载时,该内存区域中的数据将被临时放置在 FLASH_AREA 中。一旦程序加载完成,数据将被复制到 MSMB_AREA 中。