]> CyberLeo.Net >> Repos - FreeBSD/releng/10.2.git/blob - sys/contrib/octeon-sdk/cvmx-shared-linux.ld
- Copy stable/10@285827 to releng/10.2 in preparation for 10.2-RC1
[FreeBSD/releng/10.2.git] / sys / contrib / octeon-sdk / cvmx-shared-linux.ld
1 /***********************license start***************
2  * Copyright (c) 2003-2010  Cavium Inc. (support@cavium.com). All rights 
3  * reserved.
4  *
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions are
8  * met:
9  *
10  *   * Redistributions of source code must retain the above copyright
11  *     notice, this list of conditions and the following disclaimer.
12  *
13  *   * Redistributions in binary form must reproduce the above
14  *     copyright notice, this list of conditions and the following
15  *     disclaimer in the documentation and/or other materials provided
16  *     with the distribution.
17
18  *   * Neither the name of Cavium Inc. nor the names of
19  *     its contributors may be used to endorse or promote products
20  *     derived from this software without specific prior written
21  *     permission.  
22
23  * This Software, including technical data, may be subject to U.S. export  control
24  * laws, including the U.S. Export Administration Act and its  associated
25  * regulations, and may be subject to export or import  regulations in other
26  * countries. 
27
28  * TO THE MAXIMUM EXTENT PERMITTED BY LAW, THE SOFTWARE IS PROVIDED "AS IS" 
29  * AND WITH ALL FAULTS AND CAVIUM INC. MAKES NO PROMISES, REPRESENTATIONS OR
30  * WARRANTIES, EITHER EXPRESS, IMPLIED, STATUTORY, OR OTHERWISE, WITH RESPECT TO
31  * THE SOFTWARE, INCLUDING ITS CONDITION, ITS CONFORMITY TO ANY REPRESENTATION OR
32  * DESCRIPTION, OR THE EXISTENCE OF ANY LATENT OR PATENT DEFECTS, AND CAVIUM
33  * SPECIFICALLY DISCLAIMS ALL IMPLIED (IF ANY) WARRANTIES OF TITLE,
34  * MERCHANTABILITY, NONINFRINGEMENT, FITNESS FOR A PARTICULAR PURPOSE, LACK OF
35  * VIRUSES, ACCURACY OR COMPLETENESS, QUIET ENJOYMENT, QUIET POSSESSION OR
36  * CORRESPONDENCE TO DESCRIPTION. THE ENTIRE  RISK ARISING OUT OF USE OR
37  * PERFORMANCE OF THE SOFTWARE LIES WITH YOU.
38  ***********************license end**************************************/
39
40
41
42
43
44
45 /*
46  * This was created from a template supplied by GNU binutils.
47  * Copyright (C) 2004 Cavium Inc.
48  */
49  
50 /**
51  * @file
52  * This linker script for use in building simple executive application to run
53  * under Linux in userspace. The important difference from a standard Linux 
54  * binary is the addition of the ".cvmx_shared" memory section. This script 
55  * adds two symbols __cvmx_shared_start and __cvmx_sahred_end before and after
56  * the CVMX_SHARED data. These are used by cvmx-app-init-linux.c to create a
57  * shared region across all application processes.
58  *
59  * The original template for this files was:
60  * ${OCTEON_ROOT}/tools/mips64-octeon-linux-gnu/lib/ldscripts/elf64btsmip.x
61  */
62 OUTPUT_FORMAT("elf64-tradbigmips", "elf64-tradbigmips",
63               "elf64-tradlittlemips")
64 OUTPUT_ARCH(mips)
65 ENTRY(__start)
66 SEARCH_DIR("${OCTEON_ROOT}/tools/mips64-octeon-linux-gnu/lib");
67 SECTIONS
68 {
69   /* Read-only sections, merged into text segment: */
70   PROVIDE (__executable_start = 0x120000000); . = 0x120000000 + SIZEOF_HEADERS;
71   .MIPS.options : { *(.MIPS.options) }
72   .note.gnu.build-id : { *(.note.gnu.build-id) }
73   .dynamic        : { *(.dynamic) }
74   .hash           : { *(.hash) }
75   .gnu.hash       : { *(.gnu.hash) }
76   .dynsym         : { *(.dynsym) }
77   .dynstr         : { *(.dynstr) }
78   .gnu.version    : { *(.gnu.version) }
79   .gnu.version_d  : { *(.gnu.version_d) }
80   .gnu.version_r  : { *(.gnu.version_r) }
81   .rel.init       : { *(.rel.init) }
82   .rela.init      : { *(.rela.init) }
83   .rel.text       : { *(.rel.text .rel.text.* .rel.gnu.linkonce.t.*) }
84   .rela.text      : { *(.rela.text .rela.text.* .rela.gnu.linkonce.t.*) }
85   .rel.fini       : { *(.rel.fini) }
86   .rela.fini      : { *(.rela.fini) }
87   .rel.rodata     : { *(.rel.rodata .rel.rodata.* .rel.gnu.linkonce.r.*) }
88   .rela.rodata    : { *(.rela.rodata .rela.rodata.* .rela.gnu.linkonce.r.*) }
89   .rel.data.rel.ro   : { *(.rel.data.rel.ro* .rel.gnu.linkonce.d.rel.ro.*) }
90   .rela.data.rel.ro   : { *(.rela.data.rel.ro* .rela.gnu.linkonce.d.rel.ro.*) }
91   .rel.data       : { *(.rel.data .rel.data.* .rel.gnu.linkonce.d.*) }
92   .rela.data      : { *(.rela.data .rela.data.* .rela.gnu.linkonce.d.*) }
93   .rel.tdata      : { *(.rel.tdata .rel.tdata.* .rel.gnu.linkonce.td.*) }
94   .rela.tdata     : { *(.rela.tdata .rela.tdata.* .rela.gnu.linkonce.td.*) }
95   .rel.tbss       : { *(.rel.tbss .rel.tbss.* .rel.gnu.linkonce.tb.*) }
96   .rela.tbss      : { *(.rela.tbss .rela.tbss.* .rela.gnu.linkonce.tb.*) }
97   .rel.ctors      : { *(.rel.ctors) }
98   .rela.ctors     : { *(.rela.ctors) }
99   .rel.dtors      : { *(.rel.dtors) }
100   .rela.dtors     : { *(.rela.dtors) }
101   .rel.got        : { *(.rel.got) }
102   .rela.got       : { *(.rela.got) }
103   .rel.dyn        : { *(.rel.dyn) }
104   .rel.sdata      : { *(.rel.sdata .rel.sdata.* .rel.gnu.linkonce.s.*) }
105   .rela.sdata     : { *(.rela.sdata .rela.sdata.* .rela.gnu.linkonce.s.*) }
106   .rel.sbss       : { *(.rel.sbss .rel.sbss.* .rel.gnu.linkonce.sb.*) }
107   .rela.sbss      : { *(.rela.sbss .rela.sbss.* .rela.gnu.linkonce.sb.*) }
108   .rel.sdata2     : { *(.rel.sdata2 .rel.sdata2.* .rel.gnu.linkonce.s2.*) }
109   .rela.sdata2    : { *(.rela.sdata2 .rela.sdata2.* .rela.gnu.linkonce.s2.*) }
110   .rel.sbss2      : { *(.rel.sbss2 .rel.sbss2.* .rel.gnu.linkonce.sb2.*) }
111   .rela.sbss2     : { *(.rela.sbss2 .rela.sbss2.* .rela.gnu.linkonce.sb2.*) }
112   .rel.bss        : { *(.rel.bss .rel.bss.* .rel.gnu.linkonce.b.*) }
113   .rela.bss       : { *(.rela.bss .rela.bss.* .rela.gnu.linkonce.b.*) }
114   .rel.plt        : { *(.rel.plt) }
115   .rela.plt       : { *(.rela.plt) }
116   .init           :
117   {
118     KEEP (*(.init))
119   } =0
120   .plt            : { *(.plt) }
121   .text           :
122   {
123     _ftext = . ;
124     *(.text .stub .text.* .gnu.linkonce.t.*)
125     /* .gnu.warning sections are handled specially by elf32.em.  */
126     *(.gnu.warning)
127     *(.mips16.fn.*) *(.mips16.call.*)
128   } =0
129   .fini           :
130   {
131     KEEP (*(.fini))
132   } =0
133   PROVIDE (__etext = .);
134   PROVIDE (_etext = .);
135   PROVIDE (etext = .);
136   .rodata         : { *(.rodata .rodata.* .gnu.linkonce.r.*) }
137   .rodata1        : { *(.rodata1) }
138   .sdata2         :
139   {
140     *(.sdata2 .sdata2.* .gnu.linkonce.s2.*)
141   }
142   .sbss2          : { *(.sbss2 .sbss2.* .gnu.linkonce.sb2.*) }
143   .eh_frame_hdr : { *(.eh_frame_hdr) }
144   .eh_frame       : ONLY_IF_RO { KEEP (*(.eh_frame)) }
145   .gcc_except_table   : ONLY_IF_RO { *(.gcc_except_table .gcc_except_table.*) }
146   /* Adjust the address for the data segment.  We want to adjust up to
147      the same address within the page on the next page up.  */
148   . = ALIGN (CONSTANT (MAXPAGESIZE)) - ((CONSTANT (MAXPAGESIZE) - .) & (CONSTANT (MAXPAGESIZE) - 1)); . = DATA_SEGMENT_ALIGN (CONSTANT (MAXPAGESIZE), CONSTANT (COMMONPAGESIZE));
149   /* Exception handling  */
150   .eh_frame       : ONLY_IF_RW { KEEP (*(.eh_frame)) }
151   .gcc_except_table   : ONLY_IF_RW { *(.gcc_except_table .gcc_except_table.*) }
152   /* Thread Local Storage sections  */
153   .tdata          : { *(.tdata .tdata.* .gnu.linkonce.td.*) }
154   .tbss           : { *(.tbss .tbss.* .gnu.linkonce.tb.*) *(.tcommon) }
155   .preinit_array     :
156   {
157     PROVIDE_HIDDEN (__preinit_array_start = .);
158     KEEP (*(.preinit_array))
159     PROVIDE_HIDDEN (__preinit_array_end = .);
160   }
161   .init_array     :
162   {
163      PROVIDE_HIDDEN (__init_array_start = .);
164      KEEP (*(SORT(.init_array.*)))
165      KEEP (*(.init_array))
166      PROVIDE_HIDDEN (__init_array_end = .);
167   }
168   .fini_array     :
169   {
170     PROVIDE_HIDDEN (__fini_array_start = .);
171     KEEP (*(.fini_array))
172     KEEP (*(SORT(.fini_array.*)))
173     PROVIDE_HIDDEN (__fini_array_end = .);
174   }
175   .ctors          :
176   {
177     /* gcc uses crtbegin.o to find the start of
178        the constructors, so we make sure it is
179        first.  Because this is a wildcard, it
180        doesn't matter if the user does not
181        actually link against crtbegin.o; the
182        linker won't look for a file to match a
183        wildcard.  The wildcard also means that it
184        doesn't matter which directory crtbegin.o
185        is in.  */
186     KEEP (*crtbegin.o(.ctors))
187     KEEP (*crtbegin?.o(.ctors))
188     /* We don't want to include the .ctor section from
189        the crtend.o file until after the sorted ctors.
190        The .ctor section from the crtend file contains the
191        end of ctors marker and it must be last */
192     KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors))
193     KEEP (*(SORT(.ctors.*)))
194     KEEP (*(.ctors))
195   }
196   .dtors          :
197   {
198     KEEP (*crtbegin.o(.dtors))
199     KEEP (*crtbegin?.o(.dtors))
200     KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors))
201     KEEP (*(SORT(.dtors.*)))
202     KEEP (*(.dtors))
203   }
204   .jcr            : { KEEP (*(.jcr)) }
205   .data.rel.ro : { *(.data.rel.ro.local* .gnu.linkonce.d.rel.ro.local.*) *(.data.rel.ro* .gnu.linkonce.d.rel.ro.*) }
206   . = DATA_SEGMENT_RELRO_END (0, .);
207   .data           :
208   {
209     _fdata = . ;
210     *(.data .data.* .gnu.linkonce.d.*)
211     SORT(CONSTRUCTORS)
212   }
213   .data1          : { *(.data1) }
214   .got.plt        : { *(.got.plt) }
215   . = .;
216   _gp = ALIGN(16) + 0x7ff0;
217   .got            : { *(.got) }
218   /* We want the small data sections together, so single-instruction offsets
219      can access them all, and initialized data all before uninitialized, so
220      we can shorten the on-disk segment size.  */
221   .sdata          :
222   {
223     *(.sdata .sdata.* .gnu.linkonce.s.*)
224   }
225   .lit8           : { *(.lit8) }
226   .lit4           : { *(.lit4) }
227   .srdata         : { *(.srdata) }
228   
229   . = ALIGN (0x10000); 
230   __cvmx_shared_start = .;
231   .cvmx_shared : {*(.cvmx_shared .cvmx_shared.linkonce.*)}
232   .cvmx_shared_bss : { *(.cvmx_shared_bss .cvmx_shared_bss.linkonce.*) }
233   . = ALIGN (0x10000);
234   __cvmx_shared_end = .;
235   
236   _edata = .; PROVIDE (edata = .);
237   __bss_start = .;
238   _fbss = .;
239   .sbss           :
240   {
241     PROVIDE (__sbss_start = .);
242     PROVIDE (___sbss_start = .);
243     *(.dynsbss)
244     *(.sbss .sbss.* .gnu.linkonce.sb.*)
245     *(.scommon)
246     PROVIDE (__sbss_end = .);
247     PROVIDE (___sbss_end = .);
248   }
249   .bss            :
250   {
251    *(.dynbss)
252    *(.bss .bss.* .gnu.linkonce.b.*)
253    *(COMMON)
254    /* Align here to ensure that the .bss section occupies space up to
255       _end.  Align after .bss to ensure correct alignment even if the
256       .bss section disappears because there are no input sections.
257       FIXME: Why do we need it? When there is no .bss section, we don't
258       pad the .data section.  */
259    . = ALIGN(. != 0 ? 64 / 8 : 1);
260   }
261   . = ALIGN(64 / 8);
262   . = ALIGN(32M);    /* RBF added alignment of data */
263   .cvmx_shared : { *(.cvmx_shared) }
264   _end = .; PROVIDE (end = .);
265   . = DATA_SEGMENT_END (.);
266   /* Stabs debugging sections.  */
267   .stab          0 : { *(.stab) }
268   .stabstr       0 : { *(.stabstr) }
269   .stab.excl     0 : { *(.stab.excl) }
270   .stab.exclstr  0 : { *(.stab.exclstr) }
271   .stab.index    0 : { *(.stab.index) }
272   .stab.indexstr 0 : { *(.stab.indexstr) }
273   .comment       0 : { *(.comment) }
274   /* DWARF debug sections.
275      Symbols in the DWARF debugging sections are relative to the beginning
276      of the section so we begin them at 0.  */
277   /* DWARF 1 */
278   .debug          0 : { *(.debug) }
279   .line           0 : { *(.line) }
280   /* GNU DWARF 1 extensions */
281   .debug_srcinfo  0 : { *(.debug_srcinfo) }
282   .debug_sfnames  0 : { *(.debug_sfnames) }
283   /* DWARF 1.1 and DWARF 2 */
284   .debug_aranges  0 : { *(.debug_aranges) }
285   .debug_pubnames 0 : { *(.debug_pubnames) }
286   /* DWARF 2 */
287   .debug_info     0 : { *(.debug_info .gnu.linkonce.wi.*) }
288   .debug_abbrev   0 : { *(.debug_abbrev) }
289   .debug_line     0 : { *(.debug_line) }
290   .debug_frame    0 : { *(.debug_frame) }
291   .debug_str      0 : { *(.debug_str) }
292   .debug_loc      0 : { *(.debug_loc) }
293   .debug_macinfo  0 : { *(.debug_macinfo) }
294   /* SGI/MIPS DWARF 2 extensions */
295   .debug_weaknames 0 : { *(.debug_weaknames) }
296   .debug_funcnames 0 : { *(.debug_funcnames) }
297   .debug_typenames 0 : { *(.debug_typenames) }
298   .debug_varnames  0 : { *(.debug_varnames) }
299   /* DWARF 3 */
300   .debug_pubtypes 0 : { *(.debug_pubtypes) }
301   .debug_ranges   0 : { *(.debug_ranges) }
302   .gnu.attributes 0 : { KEEP (*(.gnu.attributes)) }
303   .gptab.sdata : { *(.gptab.data) *(.gptab.sdata) }
304   .gptab.sbss : { *(.gptab.bss) *(.gptab.sbss) }
305   /DISCARD/ : { *(.note.GNU-stack) *(.gnu_debuglink) }
306 }