diff options
Diffstat (limited to 'bsps/sparc64/shared/start/linkcmds')
-rw-r--r-- | bsps/sparc64/shared/start/linkcmds | 218 |
1 files changed, 218 insertions, 0 deletions
diff --git a/bsps/sparc64/shared/start/linkcmds b/bsps/sparc64/shared/start/linkcmds new file mode 100644 index 0000000000..2f9db3a087 --- /dev/null +++ b/bsps/sparc64/shared/start/linkcmds @@ -0,0 +1,218 @@ +/* linkcmds + */ + +/* + * For alignment, SPARC v9 specifies that instructions are 4-byte aligned, + * and the worst-case alignment requirements for data are for quad-word + * accesses, which must be 16-byte aligned. + */ + +/* + * Declare some sizes. + */ +RamBase = DEFINED(RamBase) ? RamBase : 0x0; +RamSize = DEFINED(RamSize) ? RamSize : 4M; +HeapSize = DEFINED(HeapSize) ? HeapSize : 1M; + +RAM_END = RamBase + RamSize; + +/* Default linker script, for normal executables */ +OUTPUT_FORMAT("elf64-sparc") +ENTRY(_start) +STARTUP(start.o) + +MEMORY +{ + ram : ORIGIN = 0x0, LENGTH = 12M +} + +SECTIONS +{ + /* Read-only sections, merged into text segment: */ + .hash : { *(.hash) } + .dynsym : { *(.dynsym) } + .dynstr : { *(.dynstr) } + .gnu.version : { *(.gnu.version) } + .gnu.version_d : { *(.gnu.version_d) } + .gnu.version_r : { *(.gnu.version_r) } + .rel.init : { *(.rel.init) } + .rela.init : { *(.rela.init) } + .rel.text : + { + *(.rel.text) + *(.rel.text.*) + *(.rel.gnu.linkonce.t*) + } + .rela.text : + { + *(.rela.text) + *(.rela.text.*) + *(.rela.gnu.linkonce.t*) + } + .rel.fini : { *(.rel.fini) } + .rela.fini : { *(.rela.fini) } + .rel.rodata : + { + *(.rel.rodata) + *(.rel.rodata.*) + *(.rel.gnu.linkonce.r*) + } + .rela.rodata : + { + *(.rela.rodata) + *(.rela.rodata.*) + *(.rela.gnu.linkonce.r*) + } + .rel.data : + { + *(.rel.data) + *(.rel.data.*) + *(.rel.gnu.linkonce.d*) + } + .rela.data : + { + *(.rela.data) + *(.rela.data.*) + *(.rela.gnu.linkonce.d*) + } + .rel.ctors : { *(.rel.ctors) } + .rela.ctors : { *(.rela.ctors) } + .rel.dtors : { *(.rel.dtors) } + .rela.dtors : { *(.rela.dtors) } + .rel.got : { *(.rel.got) } + .rela.got : { *(.rela.got) } + .rel.bss : { *(.rel.bss) } + .rela.bss : { *(.rela.bss) } + .rel.plt : { *(.rel.plt) } + .rela.plt : { *(.rela.plt) } + /* Internal text space or external memory */ + .text 0x4000 : AT (0x4000) + { + *(BOOTSTRAP); + *(.text*) + + KEEP (*(.init)) + KEEP (*(.fini)) + + /* + * Special FreeBSD sysctl sections. + */ + . = ALIGN (16); + __start_set_sysctl_set = .; + *(set_sysctl_*); + __stop_set_sysctl_set = ABSOLUTE(.); + *(set_domain_*); + *(set_pseudo_*); + + *(.eh_frame) + . = ALIGN (16); + + *(.gnu.linkonce.t*) + *(.gcc_except_table*) + + /* + * C++ constructors + */ + /* gcc 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)) + 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 *crtend?.o ) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + KEEP (*crtbegin.o(.dtors)) + KEEP (*crtbegin?.o(.dtors)) + KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + + _rodata_start = . ; + *(.rodata*) + KEEP (*(SORT(.rtemsroset.*))) + *(.gnu.linkonce.r*) + _erodata = ALIGN( 0x10 ) ; + + *(.lit) + *(.shdata) + + . = ALIGN (16); + _endtext = . ; + _etext = . ; + } > ram + + .tdata : AT (ADDR (.text) + SIZEOF (.text)) { + _TLS_Data_begin = .; + *(.tdata .tdata.* .gnu.linkonce.td.*) + _TLS_Data_end = .; + } > ram + .tbss : AT (ADDR (.tdata) + SIZEOF (.tdata)) { + _TLS_BSS_begin = .; + *(.tbss .tbss.* .gnu.linkonce.tb.*) *(.tcommon) + _TLS_BSS_end = .; + } > ram + _TLS_Data_size = _TLS_Data_end - _TLS_Data_begin; + _TLS_Data_begin = _TLS_Data_size != 0 ? _TLS_Data_begin : _TLS_BSS_begin; + _TLS_Data_end = _TLS_Data_size != 0 ? _TLS_Data_end : _TLS_BSS_begin; + _TLS_BSS_size = _TLS_BSS_end - _TLS_BSS_begin; + _TLS_Size = _TLS_BSS_end - _TLS_Data_begin; + _TLS_Alignment = MAX (ALIGNOF (.tdata), ALIGNOF (.tbss)); + + .data : AT (ADDR (.tbss) + SIZEOF (.tbss)) + { + PROVIDE (__data_start = .) ; + data_start = . ; + _data_start = . ; + *(.data) + *(.data*) + KEEP (*(SORT(.rtemsrwset.*))) + *(.rodata) /* We need to include .rodata here if gcc is used */ + *(.rodata*) /* with -fdata-sections. */ + *(.gnu.linkonce.d*) + . = ALIGN(2); + edata = . ; + _edata = . ; + PROVIDE (__data_end = .) ; + } > ram + + /* XXX + __data_load_start = LOADADDR(.data); + __data_load_end = __data_load_start + SIZEOF(.data); + */ + . = ALIGN (16); + .dynamic : { *(.dynamic) } >ram + .jcr : { *(.jcr) } > ram + .shbss : { *(.shbss) } > ram + .bss : + { + FILL(0x00000000); + . = ALIGN(16); + __bss_start = ALIGN(0x8); + bss_start = .; + bss_start = .; + *(.bss .bss* .gnu.linkonce.b*) + *(COMMON) + . = ALIGN (16); + end = .; + _end = .; + __end = .; + + . = ALIGN (16); /* arbitrary alignment */ + PROVIDE (WorkAreaBase = .); + . += HeapSize; + PROVIDE (HeapBase = .); + . += HeapSize; + } > ram +} + + |