1232809Sjmallett/***********************license start***************
2232809Sjmallett * Copyright (c) 2003-2010  Cavium Inc. (support@cavium.com). All rights 
3232809Sjmallett * reserved.
4232809Sjmallett *
5232809Sjmallett *
6232809Sjmallett * Redistribution and use in source and binary forms, with or without
7232809Sjmallett * modification, are permitted provided that the following conditions are
8232809Sjmallett * met:
9232809Sjmallett *
10232809Sjmallett *   * Redistributions of source code must retain the above copyright
11232809Sjmallett *     notice, this list of conditions and the following disclaimer.
12232809Sjmallett *
13232809Sjmallett *   * Redistributions in binary form must reproduce the above
14232809Sjmallett *     copyright notice, this list of conditions and the following
15232809Sjmallett *     disclaimer in the documentation and/or other materials provided
16232809Sjmallett *     with the distribution.
17232809Sjmallett
18232809Sjmallett *   * Neither the name of Cavium Inc. nor the names of
19232809Sjmallett *     its contributors may be used to endorse or promote products
20232809Sjmallett *     derived from this software without specific prior written
21232809Sjmallett *     permission.  
22232809Sjmallett
23232809Sjmallett * This Software, including technical data, may be subject to U.S. export  control
24232809Sjmallett * laws, including the U.S. Export Administration Act and its  associated
25232809Sjmallett * regulations, and may be subject to export or import  regulations in other
26232809Sjmallett * countries. 
27232809Sjmallett
28232809Sjmallett * TO THE MAXIMUM EXTENT PERMITTED BY LAW, THE SOFTWARE IS PROVIDED "AS IS" 
29232809Sjmallett * AND WITH ALL FAULTS AND CAVIUM INC. MAKES NO PROMISES, REPRESENTATIONS OR
30232809Sjmallett * WARRANTIES, EITHER EXPRESS, IMPLIED, STATUTORY, OR OTHERWISE, WITH RESPECT TO
31232809Sjmallett * THE SOFTWARE, INCLUDING ITS CONDITION, ITS CONFORMITY TO ANY REPRESENTATION OR
32232809Sjmallett * DESCRIPTION, OR THE EXISTENCE OF ANY LATENT OR PATENT DEFECTS, AND CAVIUM
33232809Sjmallett * SPECIFICALLY DISCLAIMS ALL IMPLIED (IF ANY) WARRANTIES OF TITLE,
34232809Sjmallett * MERCHANTABILITY, NONINFRINGEMENT, FITNESS FOR A PARTICULAR PURPOSE, LACK OF
35232809Sjmallett * VIRUSES, ACCURACY OR COMPLETENESS, QUIET ENJOYMENT, QUIET POSSESSION OR
36232809Sjmallett * CORRESPONDENCE TO DESCRIPTION. THE ENTIRE  RISK ARISING OUT OF USE OR
37232809Sjmallett * PERFORMANCE OF THE SOFTWARE LIES WITH YOU.
38232809Sjmallett ***********************license end**************************************/
39232809Sjmallett
40232809Sjmallett
41232809Sjmallett
42232809Sjmallett
43232809Sjmallett
44232809Sjmallett
45232809Sjmallett/*
46232809Sjmallett * This was created from a template supplied by GNU binutils.
47232809Sjmallett * Copyright (C) 2005 Cavium Inc.
48232809Sjmallett */
49232809Sjmallett
50232809Sjmallett/**
51232809Sjmallett * @file
52232809Sjmallett * This linker script for use in building simple executive application to run
53232809Sjmallett * under Linux in userspace. The important difference from a standard Linux
54232809Sjmallett * binary is the addition of the ".cvmx_shared" memory section. This script
55232809Sjmallett * adds two symbols __cvmx_shared_start and __cvmx_shared_end before and after
56232809Sjmallett * the CVMX_SHARED data. These are used by cvmx-app-init-linux.c to create a
57232809Sjmallett * shared region across all application processes.
58232809Sjmallett *
59232809Sjmallett * The original template for this files was:
60232809Sjmallett * ${OCTEON_ROOT}/tools/mips64-octeon-linux-gnu/lib/ldscripts/elf32btsmipn32.x
61232809Sjmallett */
62232809SjmallettOUTPUT_FORMAT("elf32-ntradbigmips", "elf32-ntradbigmips",
63232809Sjmallett	      "elf32-ntradlittlemips")
64232809SjmallettOUTPUT_ARCH(mips)
65232809SjmallettENTRY(__start)
66232809SjmallettSEARCH_DIR("${OCTEON_ROOT}/tools/mips64-octeon-linux-gnu/lib");
67232809SjmallettSECTIONS
68232809Sjmallett{
69232809Sjmallett  /* Read-only sections, merged into text segment: */
70232809Sjmallett  PROVIDE (__executable_start = 0x10000000); . = 0x10000000 + SIZEOF_HEADERS;
71232809Sjmallett  .interp         : { *(.interp) }
72232809Sjmallett  .reginfo        : { *(.reginfo) }
73232809Sjmallett  .note.gnu.build-id : { *(.note.gnu.build-id) }
74232809Sjmallett  .dynamic        : { *(.dynamic) }
75232809Sjmallett  .hash           : { *(.hash) }
76232809Sjmallett  .gnu.hash       : { *(.gnu.hash) }
77232809Sjmallett  .dynsym         : { *(.dynsym) }
78232809Sjmallett  .dynstr         : { *(.dynstr) }
79232809Sjmallett  .gnu.version    : { *(.gnu.version) }
80232809Sjmallett  .gnu.version_d  : { *(.gnu.version_d) }
81232809Sjmallett  .gnu.version_r  : { *(.gnu.version_r) }
82232809Sjmallett  .rel.init       : { *(.rel.init) }
83232809Sjmallett  .rela.init      : { *(.rela.init) }
84232809Sjmallett  .rel.text       : { *(.rel.text .rel.text.* .rel.gnu.linkonce.t.*) }
85232809Sjmallett  .rela.text      : { *(.rela.text .rela.text.* .rela.gnu.linkonce.t.*) }
86232809Sjmallett  .rel.fini       : { *(.rel.fini) }
87232809Sjmallett  .rela.fini      : { *(.rela.fini) }
88232809Sjmallett  .rel.rodata     : { *(.rel.rodata .rel.rodata.* .rel.gnu.linkonce.r.*) }
89232809Sjmallett  .rela.rodata    : { *(.rela.rodata .rela.rodata.* .rela.gnu.linkonce.r.*) }
90232809Sjmallett  .rel.data.rel.ro   : { *(.rel.data.rel.ro* .rel.gnu.linkonce.d.rel.ro.*) }
91232809Sjmallett  .rela.data.rel.ro   : { *(.rela.data.rel.ro* .rela.gnu.linkonce.d.rel.ro.*) }
92232809Sjmallett  .rel.data       : { *(.rel.data .rel.data.* .rel.gnu.linkonce.d.*) }
93232809Sjmallett  .rela.data      : { *(.rela.data .rela.data.* .rela.gnu.linkonce.d.*) }
94232809Sjmallett  .rel.tdata	  : { *(.rel.tdata .rel.tdata.* .rel.gnu.linkonce.td.*) }
95232809Sjmallett  .rela.tdata	  : { *(.rela.tdata .rela.tdata.* .rela.gnu.linkonce.td.*) }
96232809Sjmallett  .rel.tbss	  : { *(.rel.tbss .rel.tbss.* .rel.gnu.linkonce.tb.*) }
97232809Sjmallett  .rela.tbss	  : { *(.rela.tbss .rela.tbss.* .rela.gnu.linkonce.tb.*) }
98232809Sjmallett  .rel.ctors      : { *(.rel.ctors) }
99232809Sjmallett  .rela.ctors     : { *(.rela.ctors) }
100232809Sjmallett  .rel.dtors      : { *(.rel.dtors) }
101232809Sjmallett  .rela.dtors     : { *(.rela.dtors) }
102232809Sjmallett  .rel.got        : { *(.rel.got) }
103232809Sjmallett  .rela.got       : { *(.rela.got) }
104232809Sjmallett  .rel.dyn        : { *(.rel.dyn) }
105232809Sjmallett  .rel.sdata      : { *(.rel.sdata .rel.sdata.* .rel.gnu.linkonce.s.*) }
106232809Sjmallett  .rela.sdata     : { *(.rela.sdata .rela.sdata.* .rela.gnu.linkonce.s.*) }
107232809Sjmallett  .rel.sbss       : { *(.rel.sbss .rel.sbss.* .rel.gnu.linkonce.sb.*) }
108232809Sjmallett  .rela.sbss      : { *(.rela.sbss .rela.sbss.* .rela.gnu.linkonce.sb.*) }
109232809Sjmallett  .rel.sdata2     : { *(.rel.sdata2 .rel.sdata2.* .rel.gnu.linkonce.s2.*) }
110232809Sjmallett  .rela.sdata2    : { *(.rela.sdata2 .rela.sdata2.* .rela.gnu.linkonce.s2.*) }
111232809Sjmallett  .rel.sbss2      : { *(.rel.sbss2 .rel.sbss2.* .rel.gnu.linkonce.sb2.*) }
112232809Sjmallett  .rela.sbss2     : { *(.rela.sbss2 .rela.sbss2.* .rela.gnu.linkonce.sb2.*) }
113232809Sjmallett  .rel.bss        : { *(.rel.bss .rel.bss.* .rel.gnu.linkonce.b.*) }
114232809Sjmallett  .rela.bss       : { *(.rela.bss .rela.bss.* .rela.gnu.linkonce.b.*) }
115232809Sjmallett  .rel.plt        : { *(.rel.plt) }
116232809Sjmallett  .rela.plt       : { *(.rela.plt) }
117232809Sjmallett  .init           :
118232809Sjmallett  {
119232809Sjmallett    KEEP (*(.init))
120232809Sjmallett  } =0
121232809Sjmallett  .plt            : { *(.plt) }
122232809Sjmallett  .text           :
123232809Sjmallett  {
124232809Sjmallett    _ftext = . ;
125232809Sjmallett    *(.text .stub .text.* .gnu.linkonce.t.*)
126232809Sjmallett    /* .gnu.warning sections are handled specially by elf32.em.  */
127232809Sjmallett    *(.gnu.warning)
128232809Sjmallett    *(.mips16.fn.*) *(.mips16.call.*)
129232809Sjmallett  } =0
130232809Sjmallett  .fini           :
131232809Sjmallett  {
132232809Sjmallett    KEEP (*(.fini))
133232809Sjmallett  } =0
134232809Sjmallett  PROVIDE (__etext = .);
135232809Sjmallett  PROVIDE (_etext = .);
136232809Sjmallett  PROVIDE (etext = .);
137232809Sjmallett  .rodata         : { *(.rodata .rodata.* .gnu.linkonce.r.*) }
138232809Sjmallett  .rodata1        : { *(.rodata1) }
139232809Sjmallett  .sdata2         :
140232809Sjmallett  {
141232809Sjmallett    *(.sdata2 .sdata2.* .gnu.linkonce.s2.*)
142232809Sjmallett  }
143232809Sjmallett  .sbss2          : { *(.sbss2 .sbss2.* .gnu.linkonce.sb2.*) }
144232809Sjmallett  .eh_frame_hdr : { *(.eh_frame_hdr) }
145232809Sjmallett  .eh_frame       : ONLY_IF_RO { KEEP (*(.eh_frame)) }
146232809Sjmallett  .gcc_except_table   : ONLY_IF_RO { *(.gcc_except_table .gcc_except_table.*) }
147232809Sjmallett  /* Adjust the address for the data segment.  We want to adjust up to
148232809Sjmallett     the same address within the page on the next page up.  */
149232809Sjmallett  . = ALIGN (CONSTANT (MAXPAGESIZE)) - ((CONSTANT (MAXPAGESIZE) - .) & (CONSTANT (MAXPAGESIZE) - 1)); . = DATA_SEGMENT_ALIGN (CONSTANT (MAXPAGESIZE), CONSTANT (COMMONPAGESIZE));
150232809Sjmallett  /* Exception handling  */
151232809Sjmallett  .eh_frame       : ONLY_IF_RW { KEEP (*(.eh_frame)) }
152232809Sjmallett  .gcc_except_table   : ONLY_IF_RW { *(.gcc_except_table .gcc_except_table.*) }
153232809Sjmallett  /* Thread Local Storage sections  */
154232809Sjmallett  .tdata	  : { *(.tdata .tdata.* .gnu.linkonce.td.*) }
155232809Sjmallett  .tbss		  : { *(.tbss .tbss.* .gnu.linkonce.tb.*) *(.tcommon) }
156232809Sjmallett  .preinit_array     :
157232809Sjmallett  {
158232809Sjmallett    PROVIDE_HIDDEN (__preinit_array_start = .);
159232809Sjmallett    KEEP (*(.preinit_array))
160232809Sjmallett    PROVIDE_HIDDEN (__preinit_array_end = .);
161232809Sjmallett  }
162232809Sjmallett  .init_array     :
163232809Sjmallett  {
164232809Sjmallett     PROVIDE_HIDDEN (__init_array_start = .);
165232809Sjmallett     KEEP (*(SORT(.init_array.*)))
166232809Sjmallett     KEEP (*(.init_array))
167232809Sjmallett     PROVIDE_HIDDEN (__init_array_end = .);
168232809Sjmallett  }
169232809Sjmallett  .fini_array     :
170232809Sjmallett  {
171232809Sjmallett    PROVIDE_HIDDEN (__fini_array_start = .);
172232809Sjmallett    KEEP (*(.fini_array))
173232809Sjmallett    KEEP (*(SORT(.fini_array.*)))
174232809Sjmallett    PROVIDE_HIDDEN (__fini_array_end = .);
175232809Sjmallett  }
176232809Sjmallett  .ctors          :
177232809Sjmallett  {
178232809Sjmallett    /* gcc uses crtbegin.o to find the start of
179232809Sjmallett       the constructors, so we make sure it is
180232809Sjmallett       first.  Because this is a wildcard, it
181232809Sjmallett       doesn't matter if the user does not
182232809Sjmallett       actually link against crtbegin.o; the
183232809Sjmallett       linker won't look for a file to match a
184232809Sjmallett       wildcard.  The wildcard also means that it
185232809Sjmallett       doesn't matter which directory crtbegin.o
186232809Sjmallett       is in.  */
187232809Sjmallett    KEEP (*crtbegin.o(.ctors))
188232809Sjmallett    KEEP (*crtbegin?.o(.ctors))
189232809Sjmallett    /* We don't want to include the .ctor section from
190232809Sjmallett       the crtend.o file until after the sorted ctors.
191232809Sjmallett       The .ctor section from the crtend file contains the
192232809Sjmallett       end of ctors marker and it must be last */
193232809Sjmallett    KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors))
194232809Sjmallett    KEEP (*(SORT(.ctors.*)))
195232809Sjmallett    KEEP (*(.ctors))
196232809Sjmallett  }
197232809Sjmallett  .dtors          :
198232809Sjmallett  {
199232809Sjmallett    KEEP (*crtbegin.o(.dtors))
200232809Sjmallett    KEEP (*crtbegin?.o(.dtors))
201232809Sjmallett    KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors))
202232809Sjmallett    KEEP (*(SORT(.dtors.*)))
203232809Sjmallett    KEEP (*(.dtors))
204232809Sjmallett  }
205232809Sjmallett  .jcr            : { KEEP (*(.jcr)) }
206232809Sjmallett  .data.rel.ro : { *(.data.rel.ro.local* .gnu.linkonce.d.rel.ro.local.*) *(.data.rel.ro* .gnu.linkonce.d.rel.ro.*) }
207232809Sjmallett  . = DATA_SEGMENT_RELRO_END (0, .);
208232809Sjmallett  .data           :
209232809Sjmallett  {
210232809Sjmallett    _fdata = . ;
211232809Sjmallett    *(.data .data.* .gnu.linkonce.d.*)
212232809Sjmallett    SORT(CONSTRUCTORS)
213232809Sjmallett  }
214232809Sjmallett  .data1          : { *(.data1) }
215232809Sjmallett  .got.plt        : { *(.got.plt) }
216232809Sjmallett  . = .;
217232809Sjmallett  _gp = ALIGN(16) + 0x7ff0;
218232809Sjmallett  .got            : { *(.got) }
219232809Sjmallett  /* We want the small data sections together, so single-instruction offsets
220232809Sjmallett     can access them all, and initialized data all before uninitialized, so
221232809Sjmallett     we can shorten the on-disk segment size.  */
222232809Sjmallett  .sdata          :
223232809Sjmallett  {
224232809Sjmallett    *(.sdata .sdata.* .gnu.linkonce.s.*)
225232809Sjmallett  }
226232809Sjmallett  .lit8           : { *(.lit8) }
227232809Sjmallett  .lit4           : { *(.lit4) }
228232809Sjmallett  .srdata         : { *(.srdata) }
229232809Sjmallett
230232809Sjmallett  . = ALIGN (0x10000);
231232809Sjmallett  __cvmx_shared_start = .;
232232809Sjmallett  .cvmx_shared : {*(.cvmx_shared .cvmx_shared.linkonce.*)}
233232809Sjmallett  .cvmx_shared_bss : { *(.cvmx_shared_bss .cvmx_shared_bss.linkonce.*) }
234232809Sjmallett  . = ALIGN (0x10000);
235232809Sjmallett  __cvmx_shared_end = .;
236232809Sjmallett
237232809Sjmallett  _edata = .; PROVIDE (edata = .);
238232809Sjmallett  __bss_start = .;
239232809Sjmallett  _fbss = .;
240232809Sjmallett  .sbss           :
241232809Sjmallett  {
242232809Sjmallett    PROVIDE (__sbss_start = .);
243232809Sjmallett    PROVIDE (___sbss_start = .);
244232809Sjmallett    *(.dynsbss)
245232809Sjmallett    *(.sbss .sbss.* .gnu.linkonce.sb.*)
246232809Sjmallett    *(.scommon)
247232809Sjmallett    PROVIDE (__sbss_end = .);
248232809Sjmallett    PROVIDE (___sbss_end = .);
249232809Sjmallett  }
250232809Sjmallett  .bss            :
251232809Sjmallett  {
252232809Sjmallett   *(.dynbss)
253232809Sjmallett   *(.bss .bss.* .gnu.linkonce.b.*)
254232809Sjmallett   *(COMMON)
255232809Sjmallett   /* Align here to ensure that the .bss section occupies space up to
256232809Sjmallett      _end.  Align after .bss to ensure correct alignment even if the
257232809Sjmallett      .bss section disappears because there are no input sections.
258232809Sjmallett      FIXME: Why do we need it? When there is no .bss section, we don't
259232809Sjmallett      pad the .data section.  */
260232809Sjmallett   . = ALIGN(. != 0 ? 32 / 8 : 1);
261232809Sjmallett  }
262232809Sjmallett  . = ALIGN(32 / 8);
263232809Sjmallett  . = ALIGN(32M);    /* RBF added alignment of data */
264232809Sjmallett  .cvmx_shared : { *(.cvmx_shared) }
265232809Sjmallett  _end = .; PROVIDE (end = .);
266232809Sjmallett  . = DATA_SEGMENT_END (.);
267232809Sjmallett  /* Stabs debugging sections.  */
268232809Sjmallett  .stab          0 : { *(.stab) }
269232809Sjmallett  .stabstr       0 : { *(.stabstr) }
270232809Sjmallett  .stab.excl     0 : { *(.stab.excl) }
271232809Sjmallett  .stab.exclstr  0 : { *(.stab.exclstr) }
272232809Sjmallett  .stab.index    0 : { *(.stab.index) }
273232809Sjmallett  .stab.indexstr 0 : { *(.stab.indexstr) }
274232809Sjmallett  .comment       0 : { *(.comment) }
275232809Sjmallett  /* DWARF debug sections.
276232809Sjmallett     Symbols in the DWARF debugging sections are relative to the beginning
277232809Sjmallett     of the section so we begin them at 0.  */
278232809Sjmallett  /* DWARF 1 */
279232809Sjmallett  .debug          0 : { *(.debug) }
280232809Sjmallett  .line           0 : { *(.line) }
281232809Sjmallett  /* GNU DWARF 1 extensions */
282232809Sjmallett  .debug_srcinfo  0 : { *(.debug_srcinfo) }
283232809Sjmallett  .debug_sfnames  0 : { *(.debug_sfnames) }
284232809Sjmallett  /* DWARF 1.1 and DWARF 2 */
285232809Sjmallett  .debug_aranges  0 : { *(.debug_aranges) }
286232809Sjmallett  .debug_pubnames 0 : { *(.debug_pubnames) }
287232809Sjmallett  /* DWARF 2 */
288232809Sjmallett  .debug_info     0 : { *(.debug_info .gnu.linkonce.wi.*) }
289232809Sjmallett  .debug_abbrev   0 : { *(.debug_abbrev) }
290232809Sjmallett  .debug_line     0 : { *(.debug_line) }
291232809Sjmallett  .debug_frame    0 : { *(.debug_frame) }
292232809Sjmallett  .debug_str      0 : { *(.debug_str) }
293232809Sjmallett  .debug_loc      0 : { *(.debug_loc) }
294232809Sjmallett  .debug_macinfo  0 : { *(.debug_macinfo) }
295232809Sjmallett  /* SGI/MIPS DWARF 2 extensions */
296232809Sjmallett  .debug_weaknames 0 : { *(.debug_weaknames) }
297232809Sjmallett  .debug_funcnames 0 : { *(.debug_funcnames) }
298232809Sjmallett  .debug_typenames 0 : { *(.debug_typenames) }
299232809Sjmallett  .debug_varnames  0 : { *(.debug_varnames) }
300232809Sjmallett  /* DWARF 3 */
301232809Sjmallett  .debug_pubtypes 0 : { *(.debug_pubtypes) }
302232809Sjmallett  .debug_ranges   0 : { *(.debug_ranges) }
303232809Sjmallett  .gnu.attributes 0 : { KEEP (*(.gnu.attributes)) }
304232809Sjmallett  .gptab.sdata : { *(.gptab.data) *(.gptab.sdata) }
305232809Sjmallett  .gptab.sbss : { *(.gptab.bss) *(.gptab.sbss) }
306232809Sjmallett  /DISCARD/ : { *(.note.GNU-stack) *(.gnu_debuglink) }
307232809Sjmallett}
308