You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
166 lines
4.1 KiB
166 lines
4.1 KiB
/* Example Linker Script for linking NS MD32 elf32 files. */ |
|
|
|
ENTRY(_start) |
|
|
|
|
|
OUTPUT_FORMAT("elf32-md32") |
|
OUTPUT_ARCH("md32") |
|
|
|
/* Define memory regions. */ |
|
MEMORY |
|
{ |
|
/* rom : ORIGIN = 16K, LENGTH = 496K*/ |
|
vector : ORIGIN = 0, LENGTH = 1K |
|
ram : ORIGIN = 16K, LENGTH = 1008K |
|
} |
|
|
|
/* Many sections come in three flavours. There is the 'real' section, |
|
like ".data". Then there are the per-procedure or per-variable |
|
sections, generated by -ffunction-sections and -fdata-sections in GCC, |
|
and useful for --gc-sections, which for a variable "foo" might be |
|
".data.foo". Then there are the linkonce sections, for which the linker |
|
eliminates duplicates, which are named like ".gnu.linkonce.d.foo". |
|
The exact correspondences are: |
|
|
|
Section Linkonce section |
|
.text .gnu.linkonce.t.foo |
|
.rdata .gnu.linkonce.r.foo |
|
.data .gnu.linkonce.d.foo |
|
.bss .gnu.linkonce.b.foo |
|
.debug_info .gnu.linkonce.wi.foo */ |
|
|
|
SECTIONS |
|
{ |
|
.md32_init : |
|
{ |
|
KEEP (*(.md32_init)) |
|
} > vector |
|
|
|
.init : |
|
{ |
|
/* __INIT_START = .; */ |
|
KEEP (*(.init)) |
|
/* __INIT_END = .; */ |
|
} > ram |
|
|
|
.fini : |
|
{ |
|
/* __FINI_START = .; */ |
|
KEEP (*(.fini)) |
|
/* __FINI_END = .; */ |
|
} > ram |
|
|
|
.jcr : |
|
{ |
|
KEEP (*(.jcr)) |
|
} > ram |
|
|
|
.text : |
|
{ |
|
/* __TEXT_START = .; */ |
|
*(.text) *(.text.*) *(.gnu.linkonce.t.*) |
|
/* __TEXT_END = .; */ |
|
} > ram |
|
|
|
.rdata : |
|
{ |
|
__RDATA_START = .; |
|
*(.rdata_4) *(.rdata_2) *(.rdata_1) *(.rdata.*) *(.gnu.linkonce.r.*) *(.rodata*) |
|
__RDATA_END = .; |
|
} > ram |
|
|
|
.ctor ALIGN(4) : |
|
{ |
|
__CTOR_START = .; |
|
/* The compiler uses crtbegin.o to find the start |
|
of the constructors, so we make sure it is |
|
first. Because this is a wildcard, it |
|
doesn't matter if the user does not |
|
actually link against crtbegin.o; the |
|
linker won't look for a file to match a |
|
wildcard. The wildcard also means that it |
|
doesn't matter which directory crtbegin.o |
|
is in. */ |
|
|
|
KEEP (*crtbegin*.o(.ctors)) |
|
|
|
/* We don't want to include the .ctor section from |
|
the crtend.o file until after the sorted ctors. |
|
The .ctor section from the crtend file contains the |
|
end of ctors marker and it must be last */ |
|
|
|
KEEP (*(EXCLUDE_FILE (*crtend*.o) .ctors)) |
|
KEEP (*(SORT(.ctors.*))) |
|
KEEP (*(.ctors)) |
|
__CTOR_END = .; |
|
} > ram |
|
|
|
.dtor ALIGN(4) : |
|
{ |
|
__DTOR_START = .; |
|
KEEP (*crtbegin*.o(.dtors)) |
|
KEEP (*(EXCLUDE_FILE (*crtend*.o) .dtors)) |
|
KEEP (*(SORT(.dtors.*))) |
|
KEEP (*(.dtors)) |
|
__DTOR_END = .; |
|
} > ram |
|
|
|
.data : |
|
{ |
|
__DATA_START = .; |
|
*(.data_4) *(.data_2) *(.data_1) *(.data) *(.data.*) *(.gnu.linkonce.d.*) |
|
__DATA_END = .; |
|
} > ram AT > ram |
|
|
|
.bss (NOLOAD) : |
|
{ |
|
__BSS_START = .; |
|
*(.bss_4) *(.bss_2) *(.bss_1) *(.bss) *(COMMON) *(.bss.*) *(.gnu.linkonce.b.*) |
|
__BSS_END = .; |
|
} > ram |
|
|
|
/* You may change the sizes of the following sections to fit the actual |
|
size your program requires. |
|
|
|
The heap and stack are aligned to the bus width, as a speed optimization |
|
for accessing data located there. */ |
|
|
|
.heap (NOLOAD) : |
|
{ |
|
. = ALIGN(4); |
|
__HEAP_START = .; |
|
. += 0x8000; __HEAP_MAX = .; |
|
} > ram |
|
|
|
.stack (NOLOAD) : |
|
{ |
|
__STACK_START = .; |
|
. = ALIGN(4); |
|
. += 0x2000; |
|
} > ram |
|
|
|
.comment 0 : { *(.comment) } |
|
|
|
/* DWARF debug sections. |
|
Symbols in the DWARF debugging sections are relative to the beginning |
|
of the section so we begin them at 0. */ |
|
|
|
.debug_aranges 0 : { *(.debug_aranges) } |
|
.debug_pubnames 0 : { *(.debug_pubnames) } |
|
.debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) } |
|
.debug_abbrev 0 : { *(.debug_abbrev) } |
|
.debug_line 0 : { *(.debug_line) } |
|
.debug_frame 0 : { *(.debug_frame) } |
|
.debug_str 0 : { *(.debug_str) } |
|
.debug_loc 0 : { *(.debug_loc) } |
|
.debug_macinfo 0 : { *(.debug_macinfo) } |
|
|
|
/* DWARF 3 */ |
|
.debug_pubtypes 0 : { *(.debug_pubtypes) } |
|
.debug_ranges 0 : { *(.debug_ranges) } |
|
|
|
/* DWARF Extension. */ |
|
.debug_macro 0 : { *(.debug_macro) } |
|
} |
|
|
|
__DATA_IMAGE_START = LOADADDR(.data);
|
|
|