ENTRY(_start);

SEARCH_DIR(/lib);
SEARCH_DIR(/usr/lib);
SEARCH_DIR(/usr/local/lib);
SEARCH_DIR(/usr/i686-pc-linux-gnu/lib);

INTERP(/lib/ld-linux.so.2);

PAGESIZE(4k);

SEGMENT [RX]
{
#ifdef SHARED
  . = SIZEOF_HEADERS;
#else
  . = 0x08048000 + SIZEOF_HEADERS;
#endif

  .interp;
  .note.ABI-tag;
  .note.gnu.build-id;
  .hash;
  .gnu.hash;
  .dynsym;
  .dynstr;
  .gnu.version;
  .gnu.version_d;
  .gnu.version_r;
  .rel.dyn;
  .rel.plt;
  .init { KEEP (*(.init)) }
  .plt;
  .text
  {
    *(.text)
    *(.text.*)
    *(.stub)
    *(.gnu.warning)
    *(.gnu.linkonce.t.*)
  }
  .fini { KEEP (*(.fini)) }
  PROVIDE (__etext = .);
  PROVIDE (_etext = .);
  PROVIDE (etext = .);
  .rodata
    {
      *(.rodata)
      *(.rodata.*)
      *(.gnu.linkonce.r.*)
    }
  .rodata1;
  .eh_frame_hdr;
  . = ALIGN(32 / 8);
  PROVIDE (__preinit_array_start = .);
  .preinit_array
    {
      *(.preinit_array)
    }
  PROVIDE (__preinit_array_end = .);
  PROVIDE (__init_array_start = .);
  .init_array
    {
      *(.init_array)
    }
  PROVIDE (__init_array_end = .);
  PROVIDE (__fini_array_start = .);
  .fini_array
    {
      *(.fini_array)
    }
  PROVIDE (__fini_array_end = .);
}

SEGMENT [RW]
{
  .sdata2
    {
      *(.sdata2)
      *(.sdata2.*)
      *(.gnu.linkonce.s2.*)
    }
  .sbss2
    {
      *(.sbss2)
      *(.sbss2.*)
      *(.gnu.linkonce.sb2.*)
    }
  /* Adjust the address for the data segment.  We want to adjust up to
     the same address within the page on the next page up.  */
  . = ALIGN(PAGESIZE) + (. & (PAGESIZE - 1));
  .eh_frame
    {
      KEEP (*(.eh_frame))
    }
  .gcc_except_table;
  .tdata
    {
      *(.tdata)
      *(.tdata.*)
      *(.gnu.linkone.td.*)
    }
  .tbss
    {
      *(.tbss)
      *(.tbss.*)
      *(.gnu.linkone.tb.*)
      *(.tcommon)
    }
  .ctors
    {
      /* 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))
      /* We don't want to include the .ctor section from
         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 ) .ctors))
      KEEP (*(SORT(.ctors.*)))
      KEEP (*(.ctors))
    }
  .dtors
    {
      KEEP (*crtbegin.o(.dtors))
      KEEP (*(EXCLUDE_FILE (*crtend.o ) .dtors))
      KEEP (*(SORT(.dtors.*)))
      KEEP (*(.dtors))
    }
  .jcr;
  .dynamic;
  .got;
  .got.plt;
  .data
    {
      *(.data)
      *(.data.*)
      *(.gnu.linkonce.d.*)
    }
  /* We want the small data sections together, so single-instruction offsets
     can access them all, and initialized data all before uninitialized, so
     we can shorten the on-disk segment size.  */
  .data1;
  .sdata
    {
      *(.sdata)
      *(.sdata.*)
      *(.gnu.linkonce.s.*)
    }
  _edata = .;
  PROVIDE (edata = .);
  __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 here to ensure that the .bss section occupies space up to
	 _end.  Align after .bss to ensure correct alignment even if the
	 .bss section disappears because there are no input sections.  */
      . = ALIGN(32 / 8);
    }
  . = ALIGN(32 / 8);
  _end = .;
  PROVIDE (end = .);
}

SEGMENT []
{
  /* Stabs debugging sections.  */
  .stab;
  .stabstr;
  .stab.excl;
  .stab.exclstr;
  .stab.index;
  .stab.indexstr;
  .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;
  .line;
  /* GNU DWARF 1 extensions */
  .debug_srcinfo;
  .debug_sfnames;
  /* DWARF 1.1 and DWARF 2 */
  .debug_aranges;
  .debug_pubnames;
  /* DWARF 2 */
  .debug_info
    {
       *(.debug_info)
       *(.gnu.linkonce.wi.*)
    }
  .debug_abbrev;
  .debug_line;
  .debug_frame;
  .debug_str;
  .debug_loc;
  .debug_macinfo;
  /* SGI/MIPS DWARF 2 extensions */
  .debug_weaknames;
  .debug_funcnames;
  .debug_typenames;
  .debug_varnames;
  /* These must appear regardless of  .  */
}
