xref: /netbsd-src/sys/arch/powerpc/conf/kern64.ldscript (revision ce93b3da5702ce1edf4d46f9fb716f53daf32f23)
1*5a400bbbSmatt/* Default linker script, for normal executables */
2*5a400bbbSmattOUTPUT_FORMAT("elf64-powerpc", "elf64-powerpc",
3*5a400bbbSmatt	      "elf64-powerpc")
4*5a400bbbSmattOUTPUT_ARCH(powerpc:common64)
5*5a400bbbSmattENTRY(_start)
6*5a400bbbSmattSECTIONS
7*5a400bbbSmatt{
8*5a400bbbSmatt  /*  Read-only sections, merged into text segment.  Assumes the
9*5a400bbbSmatt      kernel Makefile sets the start address via -Ttext.  */
10*5a400bbbSmatt  .text      :
11*5a400bbbSmatt  {
12*5a400bbbSmatt    PROVIDE_HIDDEN (__eprol = .);
13*5a400bbbSmatt    *(.text)
14*5a400bbbSmatt    *(.text.unlikely .text.*_unlikely)
15*5a400bbbSmatt    *(.text.exit .text.exit.*)
16*5a400bbbSmatt    *(.text.startup .text.startup.*)
17*5a400bbbSmatt    *(.text.hot .text.hot.*)
18*5a400bbbSmatt    *(.text.* .gnu.linkonce.t.*)
19*5a400bbbSmatt    __stub_start = .;
20*5a400bbbSmatt    *(.stub)
21*5a400bbbSmatt    __stub_end = .;
22*5a400bbbSmatt    __stub_pmap_start = .;
23*5a400bbbSmatt    *(.stub.pmap)
24*5a400bbbSmatt    __stub_pmap_end = .;
25*5a400bbbSmatt    /* .gnu.warning sections are handled specially by elf32.em.  */
26*5a400bbbSmatt    *(.gnu.warning)
27*5a400bbbSmatt    *(.glink)
28*5a400bbbSmatt  } =0x60000000
29*5a400bbbSmatt  _etext = .;
30*5a400bbbSmatt  PROVIDE (__etext = .);
31*5a400bbbSmatt  PROVIDE (_etext = .);
32*5a400bbbSmatt  PROVIDE (etext = .);
33*5a400bbbSmatt  .rodata         : { *(.rodata .rodata.* .gnu.linkonce.r.*) }
34*5a400bbbSmatt  .rodata1        : { *(.rodata1) }
35*5a400bbbSmatt  .sdata2         :
36*5a400bbbSmatt  {
37*5a400bbbSmatt    *(.sdata2 .sdata2.* .gnu.linkonce.s2.*)
38*5a400bbbSmatt  }
39*5a400bbbSmatt  .sbss2          : { *(.sbss2 .sbss2.* .gnu.linkonce.sb2.*) }
40*5a400bbbSmatt  .jcr            : { KEEP (*(.jcr)) }
41*5a400bbbSmatt  . = DATA_SEGMENT_RELRO_END (0, .);
42*5a400bbbSmatt  .data           :
43*5a400bbbSmatt  {
44*5a400bbbSmatt    _fdata = .;
45*5a400bbbSmatt    *(.data .data.* .gnu.linkonce.d.*)
46*5a400bbbSmatt    SORT(CONSTRUCTORS)
47*5a400bbbSmatt  }
48*5a400bbbSmatt  .data1          : { *(.data1) }
49*5a400bbbSmatt  .toc1		  : ALIGN(8) { *(.toc1) }
50*5a400bbbSmatt  .opd		  : ALIGN(8) { KEEP (*(.opd)) }
51*5a400bbbSmatt  .branch_lt	  : ALIGN(8) { *(.branch_lt) }
52*5a400bbbSmatt  .got		: ALIGN(8) { *(.got .toc) }
53*5a400bbbSmatt  /* We want the small data sections together, so single-instruction offsets
54*5a400bbbSmatt     can access them all, and initialized data all before uninitialized, so
55*5a400bbbSmatt     we can shorten the on-disk segment size.  */
56*5a400bbbSmatt  . = ALIGN(64);	/* COHERENCY UNIT */
57*5a400bbbSmatt  .data.cacheline_aligned	: { *(.data.cacheline_aligned) }
58*5a400bbbSmatt  . = ALIGN(64);	/* COHERENCY UNIT */
59*5a400bbbSmatt  .data.read_mostly		: { *(.data.read_mostly) }
60*5a400bbbSmatt  . = ALIGN(64);	/* COHERENCY UNIT */
61*5a400bbbSmatt  .sdata          :
62*5a400bbbSmatt  {
63*5a400bbbSmatt    *(.sdata .sdata.* .gnu.linkonce.s.*)
64*5a400bbbSmatt  }
65*5a400bbbSmatt  _edata = .; PROVIDE (edata = .);
66*5a400bbbSmatt  __bss_start = .;
67*5a400bbbSmatt  .tocbss	  : ALIGN(8) { *(.tocbss)}
68*5a400bbbSmatt  .sbss           :
69*5a400bbbSmatt  {
70*5a400bbbSmatt    *(.dynsbss)
71*5a400bbbSmatt    *(.sbss .sbss.* .gnu.linkonce.sb.*)
72*5a400bbbSmatt    *(.scommon)
73*5a400bbbSmatt  }
74*5a400bbbSmatt  .plt            : { *(.plt) }
75*5a400bbbSmatt  .iplt           : { *(.iplt) }
76*5a400bbbSmatt  .bss            :
77*5a400bbbSmatt  {
78*5a400bbbSmatt    *(.dynbss)
79*5a400bbbSmatt    *(.bss .bss.* .gnu.linkonce.b.*)
80*5a400bbbSmatt    *(COMMON)
81*5a400bbbSmatt    /* Align here to ensure that the .bss section occupies space up to
82*5a400bbbSmatt       _end.  Align after .bss to ensure correct alignment even if the
83*5a400bbbSmatt       .bss section disappears because there are no input sections.
84*5a400bbbSmatt       FIXME: Why do we need it? When there is no .bss section, we don't
85*5a400bbbSmatt       pad the .data section.  */
86*5a400bbbSmatt    . = ALIGN(. != 0 ? 64 / 8 : 1);
87*5a400bbbSmatt  }
88*5a400bbbSmatt  . = ALIGN(64 / 8);
89*5a400bbbSmatt  . = ALIGN(64 / 8);
90*5a400bbbSmatt  _end = .; PROVIDE (end = .);
91*5a400bbbSmatt  . = DATA_SEGMENT_END (.);
92*5a400bbbSmatt}
93