/* script_test_12i.t -- linker script test 12 for gold, with interleaved sections

   Copyright (C) 2008-2021 Free Software Foundation, Inc.
   Written by Cary Coutant <ccoutant@gmail.com>.

   This file is part of gold.

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software
   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
   MA 02110-1301, USA.  */

interleaved = 1;

SECTIONS
{
  . = 0x400000 + SIZEOF_HEADERS;

  .interp : { *(.interp) }
  .note : { *(.note .note.*) }
  .rel.dyn : { *(.rel.dyn) }
  .rela.dyn : { *(.rela.dyn) }
  .rel.plt : { *(.rel.plt) }
  .rela.plt : { *(.rela.plt) }
  .init : { *(.init) }
  .text : { *(.text) }
  .fini : { *(.fini) }
  .rodata : { *(.rodata .rodata.*) }
  .eh_frame_hdr : { *(.eh_frame_hdr) }
  .eh_frame : { *(.eh_frame) }

  . = DATA_SEGMENT_ALIGN(0x10000, 0x10000);

  .init_array : {
    __init_array_start = .;
    *(.init_array);
    __init_array_end = .;
  }
  .fini_array : { *(.fini_array) }
  .jcr : { *(.jcr) }
  .dynamic : { *(.dynamic) }
  .got : { *(.got) }
  .got.plt : { *(.got.plt) }
  .data : { *(.data) }
  .test : {
    test_array_start = .;
    *(.x1) *(.x2) *(.x3)
    test_array_end = .;
    *(.x4);
    }
  .bss : { *(.bss) }

}
