MEMORY { TEXTMEM (ARX) : ORIGIN = 0x100, LENGTH = 32K DATAMEM (AW) : org = 0x1000, l = (64 * 1024) } SECTIONS { . = 0; .text : { /* The value returned by the ORIGIN operator is a constant. However it is being assigned to a symbol declared within a section. Therefore the symbol is section-relative and its value will include the offset of that section from the start of memory. ie the declaration: text_start = ORIGIN (TEXTMEM); here will result in text_start having a value of 0x200. Hence we need to subtract the absolute value of the location counter at this point in order to give text_start a value that is truely absolute, and which coincidentally will allow the tests in script.exp to work. */ text_start = ORIGIN(TEXTMEM) - ABSOLUTE (.); *(.text) *(.pr) text_end = .; } > TEXTMEM data_start = ORIGIN (DATAMEM); .data : { *(.data) *(.rw) data_end = .; } >DATAMEM fred = ORIGIN(DATAMEM) + LENGTH(DATAMEM); }