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
         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  .  */
}
