xref: /openbmc/linux/arch/sh/kernel/vmlinux.lds.S (revision 96de0e252cedffad61b3cb5e05662c591898e69a)
1/* $Id: vmlinux.lds.S,v 1.8 2003/05/16 17:18:14 lethal Exp $
2 * ld script to make SuperH Linux kernel
3 * Written by Niibe Yutaka
4 */
5#include <asm/thread_info.h>
6#include <asm/cache.h>
7#include <asm-generic/vmlinux.lds.h>
8
9#ifdef CONFIG_CPU_LITTLE_ENDIAN
10OUTPUT_FORMAT("elf32-sh-linux", "elf32-sh-linux", "elf32-sh-linux")
11#else
12OUTPUT_FORMAT("elf32-shbig-linux", "elf32-shbig-linux", "elf32-shbig-linux")
13#endif
14OUTPUT_ARCH(sh)
15ENTRY(_start)
16SECTIONS
17{
18  . = CONFIG_PAGE_OFFSET + CONFIG_MEMORY_START + CONFIG_ZERO_PAGE_OFFSET;
19  _text = .;			/* Text and read-only data */
20  text = .;			/* Text and read-only data */
21  .empty_zero_page : {
22	*(.empty_zero_page)
23	} = 0
24  .text : {
25  	*(.text.head)
26	TEXT_TEXT
27	SCHED_TEXT
28	LOCK_TEXT
29	*(.fixup)
30	*(.gnu.warning)
31	} = 0x0009
32
33  . = ALIGN(16);		/* Exception table */
34  __start___ex_table = .;
35  __ex_table : { *(__ex_table) }
36  __stop___ex_table = .;
37
38  _etext = .;			/* End of text section */
39
40  RODATA
41
42  BUG_TABLE
43
44  .data : {			/* Data */
45	DATA_DATA
46
47 	 /* Align the initial ramdisk image (INITRD) on page boundaries. */
48 	 . = ALIGN(PAGE_SIZE);
49 	 __rd_start = .;
50 	 *(.initrd)
51 	 . = ALIGN(PAGE_SIZE);
52 	 __rd_end = .;
53
54	CONSTRUCTORS
55	}
56
57  . = ALIGN(PAGE_SIZE);
58  .data.page_aligned : { *(.data.page_aligned) }
59  __nosave_begin = .;
60  .data_nosave : { *(.data.nosave) }
61  . = ALIGN(PAGE_SIZE);
62  __nosave_end = .;
63
64  PERCPU(PAGE_SIZE)
65
66  . = ALIGN(L1_CACHE_BYTES);
67  .data.cacheline_aligned : { *(.data.cacheline_aligned) }
68
69  _edata = .;			/* End of data section */
70
71  . = ALIGN(THREAD_SIZE);		/* init_task */
72  .data.init_task : { *(.data.init_task) }
73
74  . = ALIGN(PAGE_SIZE);		/* Init code and data */
75  __init_begin = .;
76  _sinittext = .;
77  .init.text : { *(.init.text) }
78  _einittext = .;
79  .init.data : { *(.init.data) }
80  . = ALIGN(16);
81  __setup_start = .;
82  .init.setup : { *(.init.setup) }
83  __setup_end = .;
84  __initcall_start = .;
85  .initcall.init : {
86	INITCALLS
87  }
88  __initcall_end = .;
89  __con_initcall_start = .;
90  .con_initcall.init : { *(.con_initcall.init) }
91  __con_initcall_end = .;
92  SECURITY_INIT
93
94  /* .exit.text is discarded at runtime, not link time, to deal with
95     references from .rodata */
96  .exit.text : { *(.exit.text) }
97  .exit.data : { *(.exit.data) }
98
99#ifdef CONFIG_BLK_DEV_INITRD
100  . = ALIGN(PAGE_SIZE);
101
102  __initramfs_start = .;
103  .init.ramfs : { *(.init.ramfs) }
104  __initramfs_end = .;
105#endif
106
107 . = ALIGN(4);
108  __machvec_start = .;
109  .machvec.init : { *(.machvec.init) }
110  __machvec_end = .;
111
112  . = ALIGN(PAGE_SIZE);
113  .bss : {
114	__init_end = .;
115	__bss_start = .;		/* BSS */
116  	*(.bss.page_aligned)
117  	*(.bss)
118	. = ALIGN(4);
119	_ebss = .;			/* uClinux MTD sucks */
120	_end = . ;
121  }
122
123  /* When something in the kernel is NOT compiled as a module, the
124   * module cleanup code and data are put into these segments.  Both
125   * can then be thrown away, as cleanup code is never called unless
126   * it's a module.
127   */
128  /DISCARD/ : {
129	*(.exitcall.exit)
130	}
131
132  STABS_DEBUG
133
134  DWARF_DEBUG
135}
136