summaryrefslogblamecommitdiffstats
path: root/c/src/lib/libbsp/powerpc/virtex/startup/linkcmds
blob: ad82ca7aeb5f8c87db0d583db3341b0ac31fb468 (plain) (tree)
1
   

















                                                                       

                                            
                                              

      



                                               




















                                         

                                      
 




















                                                                             
 
































                                                                        
 
                                   
                         





















                                                                 


               

                            

                                       


                                    
                                
 




































                                                            
 
 



                    
 
                     
 


                                  


                                        
 


















                                                    
                                                                

                                           

                                                            




                                              
          
























                                                           
                     






                         
















                                                         
 
 









                                              
 
/* 
 *  This file contains directives for the GNU linker which are specific
 *  to the virtex
 *  This file is intended to be used together with dlentry.s
 *  it will generate downloadable code
 *
 *  Modifications for gen405 by Dennis Ehlin
 *  Modifications for virtex by Keith, Greg, and Bob
 *
 *  $Id$
 */

OUTPUT_FORMAT("elf32-powerpc", "elf32-powerpc",
              "elf32-powerpc")
OUTPUT_ARCH(powerpc)

ENTRY(download_entry)


RamBase = DEFINED(RamBase) ? RamBase : 0x0;
RamSize = DEFINED(RamSize) ? RamSize : 128M;
HeapSize = DEFINED(HeapSize) ? HeapSize : 0x0;

MEMORY
{
  RAM : ORIGIN = 0, LENGTH = 128M
  /*FLASH : ORIGIN = 0xFFE00000, LENGTH = 16M*/
}
SECTIONS
{
  .text 0x10000:
  {
     text.start = . ;
     *(.entry)
     *(.entry2)
     *(.text*)
     *(.rodata*)
     *(.rodata1)

     /*
      * Special FreeBSD sysctl sections.
      */
     . = ALIGN (16);
     __start_set_sysctl_set = .;
     *(set_sysctl_*);
     __stop_set_sysctl_set = ABSOLUTE(.);
     *(set_domain_*);
     *(set_pseudo_*);

    /* 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 lenght
     *  end terminate with a NULL entry.
     */
     
    PROVIDE (__CTOR_LIST__ = .);	     
    *crtbegin.o(.ctors)
    *(.ctors)
    *crtend.o(.ctors)
    LONG(0)
    PROVIDE (__CTOR_END__ = .);
	
    PROVIDE (__DTOR_LIST__ = .);
    *crtbegin.o(.dtors)
    *(.dtors)
    *crtend.o(.dtors)
    LONG(0)
    PROVIDE (__DTOR_END__ = .);
	
    /* Exception frame info */
     *(.eh_frame)
    /* Miscellaneous read-only data */
    _rodata_start = . ;
    *(.gnu.linkonce.r*)
    *(.lit)
    *(.shdata)
    *(.rodata)
    *(.rodata1)
    *(.descriptors)
    *(rom_ver)
    _erodata = .;

    PROVIDE (__EXCEPT_START__ = .);
    *(.gcc_except_table*)
    PROVIDE (__EXCEPT_END__ = .);
    __GOT_START__ = .;
    s.got = .;
    *(.got.plt) 
    *(.got)
    *(.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__ = .);
    

    /* Various possible names for the end of the .text section */
     etext = ALIGN(0x10);
     _etext = .;

     *(.lit)
     *(.shdata)
     _endtext = ALIGN(0x10);
     text.end = .;
     text.size = text.end - text.start;
  } >RAM

  text.size = text.end - text.start;

  .jcr : { KEEP (*(.jcr)) } >RAM

    .rel.dyn : {
      *(.rel.init)
      *(.rel.text .rel.text.* .rel.gnu.linkonce.t.*)
      *(.rel.fini)
      *(.rel.rodata .rel.rodata.* .rel.gnu.linkonce.r.*)
      *(.rel.data.rel.ro* .rel.gnu.linkonce.d.rel.ro.*)
      *(.rel.data .rel.data.* .rel.gnu.linkonce.d.*)
      *(.rel.tdata .rel.tdata.* .rel.gnu.linkonce.td.*)
      *(.rel.tbss .rel.tbss.* .rel.gnu.linkonce.tb.*)
      *(.rel.ctors)
      *(.rel.dtors)
      *(.rel.got)
      *(.rel.sdata .rel.sdata.* .rel.gnu.linkonce.s.*)
      *(.rel.sbss .rel.sbss.* .rel.gnu.linkonce.sb.*)
      *(.rel.sdata2 .rel.sdata2.* .rel.gnu.linkonce.s2.*)
      *(.rel.sbss2 .rel.sbss2.* .rel.gnu.linkonce.sb2.*)
      *(.rel.bss .rel.bss.* .rel.gnu.linkonce.b.*)
    } >RAM
    .rela.dyn : {
      *(.rela.init)
      *(.rela.text .rela.text.* .rela.gnu.linkonce.t.*)
      *(.rela.fini)
      *(.rela.rodata .rela.rodata.* .rela.gnu.linkonce.r.*)
      *(.rela.data .rela.data.* .rela.gnu.linkonce.d.*)
      *(.rela.tdata .rela.tdata.* .rela.gnu.linkonce.td.*)
      *(.rela.tbss .rela.tbss.* .rela.gnu.linkonce.tb.*)
      *(.rela.ctors)
      *(.rela.dtors)
      *(.rela.got)
      *(.rela.got1)
      *(.rela.got2)
      *(.rela.sdata .rela.sdata.* .rela.gnu.linkonce.s.*)
      *(.rela.sbss .rela.sbss.* .rela.gnu.linkonce.sb.*)
      *(.rela.sdata2 .rela.sdata2.* .rela.gnu.linkonce.s2.*)
      *(.rela.sbss2 .rela.sbss2.* .rela.gnu.linkonce.sb2.*)
      *(.rela.bss .rela.bss.* .rela.gnu.linkonce.b.*)
    } >RAM


    /* R/W Data */
    .data ( . ) :
    {
      . = ALIGN (4);

      data.start = .;

      *(.data)
      *(.data1)
      *(.data.* .gnu.linkonce.d.*)
      data.end = .;
      data.size = data.end - data.start;
    } >RAM

	/* Arrange as follows:
	 *   sdata
 	 *   sbss
     *   bss
     *   sbss2
     *   sdata2
	 * so that we have a contiguous 'bss' area
	 * which can be zeroed in one sweep.
	 * (sdata/sbss and sdata2/sbss2 must also be
	 * contiguous).
	 */

	_SDA_BASE_ = __SDATA_START__ + 0x8000;
	.sdata : {
		*(.sdata .sdata.*)
		*(.gnu.linkonce.s.*)
	} > RAM
	_edata = .;
	.sbss : {
	PROVIDE (__sbss_start = .); PROVIDE (___sbss_start = .);
        *(.dynsbss)
    	*(.sbss .sbss.* .gnu.linkonce.sb.*)
	*(.scommon)
	PROVIDE (__sbss_end = .); PROVIDE (___sbss_end = .);
	} > RAM
	.bss : {
		*(.dynbss)
		*(.bss .bss* .gnu.linkonce.b*)
		*(COMMON)
    } >RAM
	_SDA2_BASE_ = __SBSS2_START__ + 0x8000;
	.sbss2 : {
		*(.sbss2 .sbss2.* .gnu.linkonce.sb2.*) 
	} > RAM
	.sdata2 : {
		*(.sdata2 .sdata2.* .gnu.linkonce.s2.*)
	} > RAM
	
	PROVIDE(bss.start    = __SBSS_START__);
    PROVIDE(bss.size     = __SBSS2_END__ - __SBSS_START__);

  /* align bottom of 32k init stack at a 32k boundary */
  . = . + 0x4000;
  . = ALIGN( 0x8000 );
  stack.start = .;
  . = . + 0x8000;
  stack.end   = .;
  /*
   * Interrupt stack setup
   */
    IntrStack_start = ALIGN(0x10);
    . += 0x4000;
    IntrStack_end = .;
 
    PROVIDE(_end = . );
    WorkAreaBase = .;

    .gzipmalloc : {
	. = ALIGN (16);
        _startmalloc = .;
     } >RAM
          	

    /* Sections for compressed .text and .data         */
    /* after the .datarom section is an int specifying */
    /* the length of the following compressed image    */
    /* Executes once then could get overwritten        */
    .textrom 0x100000 :
    {
    	*(.textrom)
    	_endloader = .;
    } >RAM

    .datarom :
    {
    	_dr_start = .;
    	*(.datarom)
    	_dr_end = .;
    } >RAM
    dr_len = _dr_end - _dr_start;


    .line 0 : { *(.line) }
    .debug 0 : { *(.debug) }
    .debug_sfnames 0 : { *(.debug_sfnames) }
    .debug_srcinfo 0 : { *(.debug_srcinfo) }
    .debug_pubnames 0 : { *(.debug_pubnames) }
    .debug_aranges 0 : { *(.debug_aranges) }
    .debug_aregion 0 : { *(.debug_aregion) }
    .debug_macinfo 0 : { *(.debug_macinfo) }
    .stab 0 : { *(.stab) }
    .stabstr 0 : { *(.stabstr) }
}