diff --git a/src/linker_script.ld b/src/linker_script.ld index fb0851a..04285fc 100644 --- a/src/linker_script.ld +++ b/src/linker_script.ld @@ -1,11 +1,27 @@ +/* Entry Point of program, interrupt vector table in this case.*/ +/* IVT: data structure that associates list of interrupt handlers with + * a list of interrupt requests in a table of interrupt vectors. + */ ENTRY( InterruptVector ) + +/* + * Memory Layout: + * Flash(read execute): + * Ram(read write execute) + */ MEMORY { FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 16K RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 2K } + + SECTIONS { + /* + * Initialization section: + * handles startup initialization routines stored in flash. + */ .init : { _sinit = .; @@ -14,6 +30,12 @@ SECTIONS . = ALIGN(4); _einit = .; } >FLASH AT>FLASH + + /* + * Text Section: + * Contains executable code and read-only data(rodata) + * Stored in flash. + */ .text : { . = ALIGN(4); @@ -22,15 +44,31 @@ SECTIONS *(.rodata) *(.rodata*) *(.gnu.linkonce.t.*) + + /* Include additional object files. */ + *(EXTERN(*)) /* Link against external symbols */ + . = ALIGN(4); } >FLASH AT>FLASH + + /* + * Finalization Section: + * Contains finalization routines, executed before exiting the program. + */ .fini : { KEEP(*(SORT_NONE(.fini))) . = ALIGN(4); } >FLASH AT>FLASH + + /*PROVODE: defines a symbol only if it is not already defined elsewhere.*/ PROVIDE( _etext = . ); PROVIDE( _eitcm = . ); + + /* + * The preinit_array and init_array handle static/global constructors and + * initalizers. + */ .preinit_array : { PROVIDE_HIDDEN (__preinit_array_start = .); @@ -51,6 +89,8 @@ SECTIONS KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors)) PROVIDE_HIDDEN (__fini_array_end = .); } >FLASH AT>FLASH + + /* Constructors Section: needed for C++ */ .ctors : { KEEP (*crtbegin.o(.ctors)) @@ -59,6 +99,8 @@ SECTIONS KEEP (*(SORT(.ctors.*))) KEEP (*(.ctors)) } >FLASH AT>FLASH + + /* Destructors Section: needed for C++ */ .dtors : { KEEP (*crtbegin.o(.dtors)) @@ -67,16 +109,27 @@ SECTIONS KEEP (*(SORT(.dtors.*))) KEEP (*(.dtors)) } >FLASH AT>FLASH + + + /* Likely for data alignment.*/ .dalign : { . = ALIGN(4); PROVIDE(_data_vma = .); } >RAM AT>FLASH + + /* Likely for dynamic loader alignment.*/ .dlalign : { . = ALIGN(4); PROVIDE(_data_lma = .); } >FLASH AT>FLASH + + /* + * Data section: Initialized Variables + * contains initialized variables copied from flash to ram at startup. + * `_sdata` and `_edata` mark the start and end of the `.data` section. + */ .data : { . = ALIGN(4); @@ -97,6 +150,11 @@ SECTIONS . = ALIGN(4); PROVIDE( _edata = .); } >RAM AT>FLASH + + /* BSS Section: Contains uninitialized variables. + * Holds uninited global/static vars. The runtime must zero out this + * section before main function. + */ .bss : { . = ALIGN(4);