GCC编译器中链接器脚本文件(.ld文件)

最近在看嵌入式C编程时,用到GCC编译器的IDE直接在链接器脚本文件中定义变量, 一开始有些摸不着头脑,毕竟不经常使用这种GCC编译器的IDE,在网上查到相关资料。具体原文链接如下:

STM32中的链接器脚本文件(.ld文件)

摘要部分内容如下: 一、链接器脚本文件.ld文件的作用

设置堆空间大小、栈空间大小、然后根据应用的请求设置栈的位置如果使用了外部内存,则设置内存块的区域和大小

二、 .ld文件讲解

/* Entry Point */

ENTRY(Reset_Handler)

//1、设置了用户ram的最高地址

/* Highest address of the user mode stack */

_estack = 0x20020000; /* end of RAM */

//2、设置用户栈空间以及堆空间的大小

/* Generate a link error if heap and stack don't fit into RAM */

_Min_Heap_Size = 0x4000; /* required amount of heap */

_Min_Stack_Size = 0x1000; /* required amount of stack */

//3、指定了RAM与ROM的起始地址,以及大小

/* Specify the memory areas */

MEMORY

{

RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 128K

CCMRAM (rw) : ORIGIN = 0x10000000, LENGTH = 64K

FLASH (rx) : ORIGIN = 0x8000000, LENGTH = 1024K

}

//4、将相关内容放到对应段中

/* Define output sections */

SECTIONS

{

//中断向量表放在.isr_vector段中

/* The startup code goes first into FLASH */

.isr_vector :

{

. = ALIGN(4);

KEEP(*(.isr_vector)) /* Startup code */

. = ALIGN(4);

} >FLASH

//程序代码和其他部分数据存放在.text段中

/* The program code and other data goes into FLASH */

.text :

{

. = ALIGN(4);

*(.text) /* .text sections (code) */

*(.text*) /* .text* sections (code) */

*(.glue_7) /* glue arm to thumb code */

*(.glue_7t) /* glue thumb to arm code */

*(.eh_frame)

KEEP (*(.init))

KEEP (*(.fini))

. = ALIGN(4);

_etext = .; /* define a global symbols at end of code */

} >FLASH

//.rodata 存放常量(只读数据)

/* Constant data goes into FLASH */

.rodata :

{

. = ALIGN(4);

*(.rodata) /* .rodata sections (constants, strings, etc.) */

*(.rodata*) /* .rodata* sections (constants, strings, etc.) */

. = ALIGN(4);

} >FLASH

.ARM.extab : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH

.ARM : {

__exidx_start = .;

*(.ARM.exidx*)

__exidx_end = .;

} >FLASH

//.preinit_array 和 .init_array 保存程序或共享对象加载时的初始化函数指针

.preinit_array :

{

PROVIDE_HIDDEN (__preinit_array_start = .);

KEEP (*(.preinit_array*))

PROVIDE_HIDDEN (__preinit_array_end = .);

} >FLASH

.init_array :

{

PROVIDE_HIDDEN (__init_array_start = .);

KEEP (*(SORT(.init_array.*)))

KEEP (*(.init_array*))

PROVIDE_HIDDEN (__init_array_end = .);

} >FLASH

//.fini_array 保存程序或共享对象退出时的退出函数地址

.fini_array :

{

PROVIDE_HIDDEN (__fini_array_start = .);

KEEP (*(SORT(.fini_array.*)))

KEEP (*(.fini_array*))

PROVIDE_HIDDEN (__fini_array_end = .);

} >FLASH

/* used by the startup to initialize data */

_sidata = LOADADDR(.data);

//.data 存放了经过初始化的全局变量和静态变量

/* Initialized data sections goes into RAM, load LMA copy after code */

.data :

{

. = ALIGN(4);

_sdata = .; /* create a global symbol at data start */

*(.data) /* .data sections */

*(.data*) /* .data* sections */

. = ALIGN(4);

_edata = .; /* define a global symbol at data end */

} >RAM AT> FLASH

_siccmram = LOADADDR(.ccmram);

/* CCM-RAM section

*

* IMPORTANT NOTE!

* If initialized variables will be placed in this section,

* the startup code needs to be modified to copy the init-values.

*/

//.ccmram 是STM32中只允许内核访问的空间,可以将一些内核放在这里使用

.ccmram :

{

. = ALIGN(4);

_sccmram = .; /* create a global symbol at ccmram start */

*(.ccmram)

*(.ccmram*)

. = ALIGN(4);

_eccmram = .; /* create a global symbol at ccmram end */

} >CCMRAM AT> FLASH

//.bss 保存了那些用到但未被初始化的数据

/* Uninitialized data section */

. = ALIGN(4);

.bss :

{

/* This is used by the startup in order to initialize the .bss secion */

_sbss = .; /* define a global symbol at bss start */

__bss_start__ = _sbss;

*(.bss)

*(.bss*)

*(COMMON)

. = ALIGN(4);

_ebss = .; /* define a global symbol at bss end */

__bss_end__ = _ebss;

} >RAM

//._user_heap_stack 用户的堆栈段

/* User_heap_stack section, used to check that there is enough RAM left */

._user_heap_stack :

{

. = ALIGN(4);

PROVIDE ( end = . );

PROVIDE ( _end = . );

. = . + _Min_Heap_Size;

. = . + _Min_Stack_Size;

. = ALIGN(4);

} >RAM

/* Remove information from the standard libraries */

/DISCARD/ :

{

libc.a ( * )

libm.a ( * )

libgcc.a ( * )

}

.ARM.attributes 0 : { *(.ARM.attributes) }

}