OSDN Git Service

when debugging a flat loader problem involving relocs, i found it very
[uclinux-h8/elf2flt.git] / elf2flt.ld
index acb893c..a16a9c8 100644 (file)
@@ -2,10 +2,11 @@
 ENTRY (_start)
 
 MEMORY {
-       flatmem : ORIGIN = 0x0, LENGTH = 0xffffff
+       flatmem : ORIGIN = 0x0, LENGTH = 0xfffffff
 }
 
 SECTIONS {
+
        .text 0x0 : {
                . = . + 4;
                . = ALIGN(0x4) ;
@@ -24,6 +25,7 @@ SECTIONS {
 W_RODAT                *(.rodata)
 W_RODAT                *(.rodata1)
 W_RODAT                *(.rodata.*)
+W_RODAT                *(.gnu.linkonce.r*)
 
                /* This is special code area at the end of the normal
                   text section.  It contains a small lookup table at
@@ -37,6 +39,7 @@ W_RODAT               *(.rodata.*)
                . = ALIGN(0x20) ;
                _etext = . ;
        } > flatmem
+
        .data : {
                . = ALIGN(0x4) ;
                _sdata = . ;
@@ -51,37 +54,90 @@ W_RODAT             *(.rodata.*)
 R_RODAT                *(.rodata)
 R_RODAT                *(.rodata1)
 R_RODAT                *(.rodata.*)
-               *(.gnu.linkonce.r*)
+R_RODAT                *(.gnu.linkonce.r*)
                *(.data)
                *(.data1)
                *(.data.*)
                *(.gnu.linkonce.d*)
-               *(.data1)
+               *(.eh_frame_hdr)
                *(.eh_frame)
                *(.gcc_except_table)
+
+               /* Microblaze has .sdata and .sbss (small bss).  They must
+                  be contiguous, so please don't move any of this. JW */
+               _ssrw = . ;                     
                *(.sdata) 
                *(.sdata.*)
+               *(.sbss)                        /* Don't move this! */
+               *(.gnu.linkonce.sb*)
+               _essrw = . ;
+
+               _ssrw_size = _essrw - _ssrw;
+               PROVIDE(_SDA_BASE_ = _ssrw + (_ssrw_size / 2));
+
                *(.gnu.linkonce.s.*)
                *(__libc_atexit)
                *(__libc_subinit)
                *(__libc_subfreeres)
                *(.note.ABI-tag)
 
+               /* microblaze-specific read-only small data area
+                  and associated locating symbols */
+               _ssro = . ;
+               *(.sdata2)
+               _essro = . ;
+               _ssro_size = _essro - _ssro;
+               PROVIDE(_SDA2_BASE_ = _ssro + (_ssro_size / 2));
+
                . = ALIGN(4) ;
                __CTOR_LIST__ = .;
                LONG((__CTOR_END__ - __CTOR_LIST__) / 4 - 2)
-               *(.ctors)
+SINGLE_LINK:   /* gcc uses crtbegin.o to find the start of
+SINGLE_LINK:      the constructors, so we make sure it is
+SINGLE_LINK:      first.  Because this is a wildcard, it
+SINGLE_LINK:      doesn't matter if the user does not
+SINGLE_LINK:      actually link against crtbegin.o; the
+SINGLE_LINK:      linker won't look for a file to match a
+SINGLE_LINK:      wildcard.  The wildcard also means that it
+SINGLE_LINK:      doesn't matter which directory crtbegin.o
+SINGLE_LINK:      is in.  */
+SINGLE_LINK:   KEEP (*crtbegin*.o(.ctors))
+SINGLE_LINK:   /* We don't want to include the .ctor section from
+SINGLE_LINK:      from the crtend.o file until after the sorted ctors.
+SINGLE_LINK:      The .ctor section from the crtend file contains the
+SINGLE_LINK:      end of ctors marker and it must be last */
+SINGLE_LINK:   KEEP (*(EXCLUDE_FILE (*crtend*.o ) .ctors))
+SINGLE_LINK:   KEEP (*(SORT(.ctors.*)))
+               KEEP (*(.ctors))
                LONG(0)
                __CTOR_END__ = .;
                __DTOR_LIST__ = .;
                LONG((__DTOR_END__ - __DTOR_LIST__) / 4 - 2)
-               *(.dtors)
+SINGLE_LINK:   KEEP (*crtbegin*.o(.dtors))
+SINGLE_LINK:   KEEP (*(EXCLUDE_FILE (*crtend*.o ) .dtors))
+SINGLE_LINK:   KEEP (*(SORT(.dtors.*)))
+               KEEP (*(.dtors))
                LONG(0)
                __DTOR_END__ = .;
 
+               PROVIDE (__preinit_array_start = .);
+               KEEP (*(.preinit_array))
+               PROVIDE (__preinit_array_end = .);
+
+               PROVIDE (__init_array_start = .);
+               KEEP (*(SORT(.init_array.*)))
+               KEEP (*(.init_array))
+               PROVIDE (__init_array_end = .);
+
+               PROVIDE (__fini_array_start = .);
+               KEEP (*(.fini_array))
+               KEEP (*(SORT(.fini_array.*)))
+               PROVIDE (__fini_array_end = .);
+
                . = ALIGN(0x10) ; 
                _edata = . ;
        } > flatmem
+
        .bss : {
                . = ALIGN(0x4) ;
                _sbss = ALIGN(0x4) ;
@@ -94,6 +150,7 @@ R_RODAT              *(.rodata.*)
                *(.bss)
                *(.bss.*)
                *(.bss*)
+               *(.gnu.linkonce.b*)
                *(COMMON)
                . = ALIGN(0x10) ;
                _ebss = . ;
@@ -101,6 +158,11 @@ R_RODAT            *(.rodata.*)
                end = . ;
        } > flatmem
 
+       .stack : {
+               . = ALIGN(0x4);
+               __stack_start = .;
+       }
+
        .junk 0 : { *(.rel*) *(.rela*) }
        /* Stabs debugging sections.    */
        .stab 0 : { *(.stab) }
@@ -115,4 +177,6 @@ R_RODAT             *(.rodata.*)
        .debug_line 0 : { *(.debug_line) }
        .debug_pubnames 0 : { *(.debug_pubnames) }
        .debug_aranges 0 : { *(.debug_aranges) }
+       .debug_frame    0 : { *(.debug_frame) }
+       .debug_str      0 : { *(.debug_str) }
 }