/* $NetBSD: kern.ldscript,v 1.9 2015/08/24 08:13:07 uebayasi Exp $ */

/*  ldscript for NetBSD/powerpc kernels and LKMs, based on elf32ppc.x */
OUTPUT_FORMAT("elf32-powerpc", "elf32-powerpc",
             "elf32-powerpc")
OUTPUT_ARCH(powerpc:common)
ENTRY(_start)
/* Do we need any of these?
  __DYNAMIC = 0;    */
_DYNAMIC_LINK = 0;
SECTIONS
{
 /*  Read-only sections, merged into text segment.  Assumes the
     kernel Makefile sets the start address via -Ttext.  */
 .text      :
 {
   _ftext = . ;
   PROVIDE_HIDDEN (__eprol = .);
   *(.text)
   *(.text.unlikely .text.*_unlikely)
   *(.text.exit .text.exit.*)
   *(.text.startup .text.startup.*)
   *(.text.hot .text.hot.*)
   *(.text.* .gnu.linkonce.t.*)
   __stub_start = .;
   *(.stub)
   __stub_end = .;
   __stub_pmap_start = .;
   *(.stub.pmap)
   __stub_pmap_end = .;
   /* .gnu.warning sections are handled specially by elf32.em.  */
   *(.gnu.warning)
   *(.glink)
 } =0
 _etext = .;
 PROVIDE (__etext = .);
 PROVIDE (_etext = .);
 PROVIDE (etext = .);
 .rodata         : { *(.rodata .rodata.* .gnu.linkonce.r.*) }
 .rodata1        : { *(.rodata1) }
 .sdata2         :
 {
   PROVIDE (_SDA2_BASE_ = 32768);
   *(.sdata2 .sdata2.* .gnu.linkonce.s2.*)
 }
 .sbss2          : { *(.sbss2 .sbss2.* .gnu.linkonce.sb2.*) }
 /*.jcr            : { KEEP (*(.jcr)) } */ /* XXX??? */
 .reginfo : { *(.reginfo) }
/*  . = . + 0x1000; */
 .data           :
 {
   _fdata = . ;
   *(.data .data.* .gnu.linkonce.d.*)
   SORT(CONSTRUCTORS)
 }
 .data1          : { *(.data1) }
 . = ALIGN(32);        /* COHERENCY UNIT */
 .data.cacheline_aligned       : { *(.data.cacheline_aligned) }
 . = ALIGN(32);        /* COHERENCY UNIT */
 .data.read_mostly             : { *(.data.read_mostly) }
 . = ALIGN(32);        /* COHERENCY UNIT */
 _gp = ALIGN(16) + 0x7ff0;
 .lit8 : { *(.lit8) }
 .lit4 : { *(.lit4) }
 .sdata          :
 {
   PROVIDE (_SDA_BASE_ = 32768);
   *(.sdata .sdata.* .gnu.linkonce.s.*)
 }
 _edata = .; PROVIDE (edata = .);
 . = .;
 __bss_start = .;
 _fbss = .;
 .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.
      FIXME: Why do we need it? When there is no .bss section, we don't
      pad the .data section.  */
   . = ALIGN(. != 0 ? 32 / 8 : 1);
 }
 . = ALIGN(32 / 8);
 . = ALIGN(32 / 8);
 __end = .;
 _end = .; PROVIDE (end = .);
 /* . = DATA_SEGMENT_END (.); */
}