|
|
/*
* Linker command file for Intec SS555 board
*
* When debugging, we assume that the internal flash ROM will be replaced by
* the external RAM on the SS555 board. All sections are stacked starting
* at address zero. Nothing is placed in the internal RAM, since it's not
* contiguous with the external SRAM when the external RAM is placed at
* zero.
*
* For final production, we assume that the .text section will be burned
* into flash ROM starting at address zero. The .data, .bss, heap, and
* workspace will reside in RAM, starting at the beginning of the internal
* RAM. The system startup code will configure the external RAM to begin
* where the internal RAM ends, so as to make one large RAM block.
*
* Debugging mode is chosen when the RTEMS_DEBUG symbol is defined. The
* RTEMS_DEBUG symbol is defined in the bsp_specs file whenever make(1) is
* invoked with VARIANT=DEBUG.
*/
OUTPUT_FORMAT("elf32-powerpc", "elf32-powerpc", "elf32-powerpc")
OUTPUT_ARCH(powerpc)
ENTRY(start)
int_ram_org = 0x003F9800; /* base of internal RAM */
int_ram_top = 0x00400000; /* top of internal RAM */
ext_ram_size = 0x00080000; /* size of external RAM */
RamBase = DEFINED(_RamBase) ? RamBase : 0x003F9800;
RamSize = DEFINED(_RamSize) ? RamSize : 0x00486800;
HeapSize = DEFINED(_HeapSize) ? HeapSize : 0x0;
SECTIONS
{
.vectors 0x0:
{
/*
* For the MPC555, we use the compressed vector table format which puts
* all of the exception vectors before 0x100.
*/
*(.vectors)
}
.text 0x100:
{
/* Read-only sections, merged into text segment: */
text.start = .;
/* Entry point is the .entry section */
*(.entry)
*(.entry2)
/* Actual code */
*(.text*)
/* C++ constructors/destructors */
*(.gnu.linkonce.t*)
/* Initialization and finalization code.
*
* Various files can provide initialization and finalization functions.
* The bodies of these functions are in .init and .fini sections. We
* accumulate the bodies here, and prepend function prologues from
* ecrti.o and function epilogues from ecrtn.o. ecrti.o must be linked
* first; ecrtn.o must be linked last. Because these are wildcards, it
* doesn't matter if the user does not actually link against ecrti.o and
* ecrtn.o; the linker won't look for a file to match a wildcard. The
* wildcard also means that it doesn't matter which directory ecrti.o
* and ecrtn.o are in.
*/
PROVIDE (_init = .);
*ecrti.o(.init)
*(.init)
*ecrtn.o(.init)
PROVIDE (_fini = .);
*ecrti.o(.fini)
*(.fini)
*ecrtn.o(.init)
/*
* C++ constructors and destructors for static objects.
* PowerPC EABI does not use crtstuff yet, so we build "old-style"
* constructor and destructor lists that begin with the list length
* end terminate with a NULL entry.
*/
PROVIDE (__CTOR_LIST__ = .);
/* LONG((__CTOR_END__ - __CTOR_LIST__) / 4 - 2) */
*crtbegin.o(.ctors)
*(.ctors)
*crtend.o(.ctors)
LONG(0)
PROVIDE (__CTOR_END__ = .);
PROVIDE (__DTOR_LIST__ = .);
/* LONG((__DTOR_END__ - __DTOR_LIST__) / 4 - 2) */
*crtbegin.o(.dtors)
*(.dtors)
*crtend.o(.dtors)
LONG(0)
PROVIDE (__DTOR_END__ = .);
/*
* Special FreeBSD sysctl sections.
*/
. = ALIGN (16);
__start_set_sysctl_set = .;
*(set_sysctl_*);
__stop_set_sysctl_set = ABSOLUTE(.);
*(set_domain_*);
*(set_pseudo_*);
/* Exception frame info */
*(.eh_frame)
/* Miscellaneous read-only data */
_rodata_start = . ;
*(.gnu.linkonce.r*)
*(.lit)
*(.shdata)
*(.rodata*)
*(.rodata1)
KEEP (*(SORT(.rtemsroset.*)))
*(.descriptors)
*(rom_ver)
_erodata = .;
/* Various possible names for the end of the .text section */
etext = ALIGN(0x10);
_etext = .;
_endtext = .;
text.end = .;
PROVIDE (etext = .);
PROVIDE (__etext = .);
}
text.size = text.end - text.start;
.tdata : {
_TLS_Data_begin = .;
*(.tdata .tdata.* .gnu.linkonce.td.*)
_TLS_Data_end = .;
/*
* .data section contents, copied to RAM at system startup.
*/
. = ALIGN(0x20);
data.contents.start = .;
}
.tbss : {
_TLS_BSS_begin = .;
*(.tbss .tbss.* .gnu.linkonce.tb.*) *(.tcommon)
_TLS_BSS_end = .;
}
_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));
/*
* If debugging, stack the read/write sections directly after the text
* section. Otherwise, stack the read/write sections starting at base of
* internal RAM.
*/
. = DEFINED(RTEMS_DEBUG) ? . : int_ram_org;
.data : AT (data.contents.start)
{
data.start = .;
*(.data)
*(.data.*)
KEEP (*(SORT(.rtemsrwset.*)))
*(.data1)
PROVIDE (__SDATA_START__ = .);
*(.sdata .sdata.* .gnu.linkonce.s.*)
PROVIDE (__SDATA_END__ = .);
PROVIDE (__EXCEPT_START__ = .);
*(.gcc_except_table*)
PROVIDE (__EXCEPT_END__ = .);
PROVIDE(__GOT_START__ = .);
*(.got.plt)
*(.got)
PROVIDE(__GOT_END__ = .);
*(.got1)
PROVIDE (__GOT2_START__ = .);
PROVIDE (_GOT2_START_ = .);
*(.got2)
PROVIDE (__GOT2_END__ = .);
PROVIDE (_GOT2_END_ = .);
PROVIDE (__FIXUP_START__ = .);
PROVIDE (_FIXUP_START_ = .);
*(.fixup)
PROVIDE (_FIXUP_END_ = .);
PROVIDE (__FIXUP_END__ = .);
/* We want the small data sections together, so single-instruction
* offsets can access them all.
*/
PROVIDE (__SDATA2_START__ = .);
*(.sdata2 .sdata2.* .gnu.linkonce.s2.*)
*(.sbss2 .sbss2.* .gnu.linkonce.sb2.*)
PROVIDE (__SDATA2_END__ = .);
data.end = .;
}
data.size = data.end - data.start;
bss.start = .;
.sbss :
{
PROVIDE (__sbss_start = .); PROVIDE (___sbss_start = .);
*(.dynsbss)
*(.sbss .sbss.* .gnu.linkonce.sb.*)
*(.scommon)
PROVIDE (__sbss_end = .); PROVIDE (___sbss_end = .);
}
.bss :
{
*(.dynbss)
*(.bss .bss* .gnu.linkonce.b*)
*(COMMON)
. = ALIGN(4);
}
bss.end = .;
bss.size = bss.end - bss.start;
PROVIDE(_end = bss.end);
/*
* Initialization stack
*/
InitStack_start = ALIGN(0x10);
. += 0x1000;
initStack = .;
PROVIDE(initStackPtr = initStack);
/*
* Interrupt stack
*/
IntrStack_start = ALIGN(0x10);
. += 0x4000;
intrStack = .;
PROVIDE(intrStackPtr = intrStack);
/*
* Work Area
*
* The Work Area is configured at run-time to use all available memory. It
* begins just after the end of the Workspace and continues to the end of
* the external RAM.
*/
. = DEFINED(RTEMS_DEBUG) ? 0 + ext_ram_size : int_ram_top + ext_ram_size;
WorkAreaBase = .;
/*
* Internal I/O devices
*/
.usiu 0x002FC000: /* unified system interface unit */
{
usiu = .;
}
.imb 0x00300000: /* inter-module bus and devices */
{
imb = .;
}
.sram 0x00380000: /* internal SRAM control registers */
{
sram = .;
}
/*
* SS555 external devices managed by on-board CPLD
*/
.cpld 0xFF000000: /* SS555 external CPLD devices */
{
cpld = .;
}
/* 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 . */
}
|