/* * This file contains directives for the GNU linker which are specific * to the Intel 386ex evaluation board. * * COPYRIGHT (c) 1989-1999. * On-Line Applications Research Corporation (OAR). * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at * http://www.rtems.com/license/LICENSE. * * $Id$ * * Memory layout: * * 0x3f80000 -> 0x3ff0000 : text section * 0x3ff0000 -> 0x3ff0028 : global descriptor table in ROM * 0x3ff0028 -> 0x3fff000 : data section ( copied by start.s to RAM ) * 0x3fff000 -> 0x3fffff0 : initial section ( init 386ex, goto protected mode, copy ROM-RAM ) * 0x3fffff0 -> 0x4000000 : reset section ( jmp to initial only ) */ ENTRY(reset) ; SECTIONS { /**************************************************************************************** * data section: * * This section defines the locations of the data section in ROM as well as in RAM. * start.s copies the data section to RAM in real mode. This is done PRIOR to the lgdt * instruction since the data section contains the Global_descriptor_table and GDTR. ***********************************************************************************/ _rom_data_start = 0x3ff0000; _rom_data_segment = 0xF000; _rom_data_offset = 0x0; _ram_data_segment = 0x0000 ; _ram_data_offset = 0x0; _ram_data_location = _ram_data_segment * 16 + _ram_data_offset; .init : { _init = .; *(.init) } = 0x9090 .fini : { _fini = .; *(.fini) } = 0x9090 .data : AT ( _rom_data_start ) { _sdata = .; *(.data); _edata = .; } _data_start = ADDR(.data) ; data_start = _data_start ; _data_size = _edata - _sdata ; /************************************************************************************** * bss section: * * The bss section is the last section in RAM. *************************************************************************************/ _edata = ALIGN( 0x10 ); .bss : { _bss_start = .; *(.bss); *(COMMON); _ebss = ALIGN(0x10); end = _ebss; _end = end; __end = end; } _bss_size = _ebss - _bss_start ; /************************************************************************************** * General variables: * * The stack_size variable is customizable here. The heap is located directly after * The stack in RAM. A routine within bspstart.c uses these variables to ensure that * the heap used by RTEMS is as large as the RAM remaining after all workspace configurations * are complete. *************************************************************************************/ stack_size = 0x8000 ; stack_origin = end + stack_size ; heap_bottom = stack_origin + 4 ; /*************************************************************************************** * text section: * * This section is NOT copied into RAM. It is left in ROM, as the flash ROM is quick enough. ***************************************************************************************/ .text ( 0x3f80000 ): { CREATE_OBJECT_SYMBOLS text_start = . ; _text_start = . ; *(.text ) ; /* * Special FreeBSD sysctl sections. */ . = ALIGN (16); __start_set_sysctl_set = .; *(set_sysctl_*); __stop_set_sysctl_set = ABSOLUTE(.); *(set_domain_*); *(set_pseudo_*); *(.eh_fram) . = ALIGN (16); /* * C++ constructors */ __CTOR_LIST__ = .; LONG((__CTOR_END__ - __CTOR_LIST__) / 4 - 2) *(.ctors) LONG(0) __CTOR_END__ = .; . = ALIGN (4) ; __DTOR_LIST__ = .; LONG((__DTOR_END__ - __DTOR_LIST__) / 4 - 2) *(.dtors) LONG(0) __DTOR_END__ = .; _rodata_start = . ; *(.rodata*) *(.eh_frame) *(.gnu.linkonce.r*) _erodata = ALIGN( 0x10 ) ; _etext = ALIGN( 0x10 ); _endtext = . ; } /******************************************************************************************* * initial section: * * This section is defined after the data section. It must be in the top 64K of memory * to enable the initial short jmp from the reset section while still in real-mode. It * initializes the i386ex, moves the gdt from ROM to RAM,loads the gdt, * jumps to protected mode, copies the data section from ROM to RAM and loads the idt. ******************************************************************************************/ .initial _rom_data_start + _data_size : { *(.initial); } /******************************************************************************************* * board reset section: * * This section contains the short jmp from the reset section to the initial section. It is * the first code executed on reset/power on. ******************************************************************************************/ .reset 0x3fffff0: { *(.reset); } /* Stabs debugging sections. */ .stab 0 : { *(.stab) } .stabstr 0 : { *(.stabstr) } .stab.excl 0 : { *(.stab.excl) } .stab.exclstr 0 : { *(.stab.exclstr) } .stab.index 0 : { *(.stab.index) } .stab.indexstr 0 : { *(.stab.indexstr) } .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. */ /* DWARF 1 */ .debug 0 : { *(.debug) } .line 0 : { *(.line) } /* GNU DWARF 1 extensions */ .debug_srcinfo 0 : { *(.debug_srcinfo) } .debug_sfnames 0 : { *(.debug_sfnames) } /* DWARF 1.1 and DWARF 2 */ .debug_aranges 0 : { *(.debug_aranges) } .debug_pubnames 0 : { *(.debug_pubnames) } /* DWARF 2 */ .debug_info 0 : { *(.debug_info) } .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) } /* SGI/MIPS DWARF 2 extensions */ .debug_weaknames 0 : { *(.debug_weaknames) } .debug_funcnames 0 : { *(.debug_funcnames) } .debug_typenames 0 : { *(.debug_typenames) } .debug_varnames 0 : { *(.debug_varnames) } /* These must appear regardless of . */ }