Linux kernel mirror (for testing)
git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel
os
linux
1/* SPDX-License-Identifier: GPL-2.0 */
2#include <asm-generic/vmlinux.lds.h>
3
4#ifdef CONFIG_HOTPLUG_CPU
5#define ARM_CPU_DISCARD(x)
6#define ARM_CPU_KEEP(x) x
7#else
8#define ARM_CPU_DISCARD(x) x
9#define ARM_CPU_KEEP(x)
10#endif
11
12#if (defined(CONFIG_SMP_ON_UP) && !defined(CONFIG_DEBUG_SPINLOCK)) || \
13 defined(CONFIG_GENERIC_BUG) || defined(CONFIG_JUMP_LABEL)
14#define ARM_EXIT_KEEP(x) x
15#define ARM_EXIT_DISCARD(x)
16#else
17#define ARM_EXIT_KEEP(x)
18#define ARM_EXIT_DISCARD(x) x
19#endif
20
21#ifdef CONFIG_MMU
22#define ARM_MMU_KEEP(x) KEEP(x)
23#define ARM_MMU_DISCARD(x)
24#else
25#define ARM_MMU_KEEP(x)
26#define ARM_MMU_DISCARD(x) x
27#endif
28
29/*
30 * ld.lld does not support NOCROSSREFS:
31 * https://github.com/ClangBuiltLinux/linux/issues/1609
32 */
33#ifdef CONFIG_LD_IS_LLD
34#define NOCROSSREFS
35#endif
36
37#ifdef CONFIG_LD_CAN_USE_KEEP_IN_OVERLAY
38#define OVERLAY_KEEP(x) KEEP(x)
39#else
40#define OVERLAY_KEEP(x) x
41#endif
42
43/* Set start/end symbol names to the LMA for the section */
44#define ARM_LMA(sym, section) \
45 sym##_start = LOADADDR(section); \
46 sym##_end = LOADADDR(section) + SIZEOF(section)
47
48#define PROC_INFO \
49 . = ALIGN(4); \
50 __proc_info_begin = .; \
51 KEEP(*(.proc.info.init)) \
52 __proc_info_end = .;
53
54#define IDMAP_TEXT \
55 ALIGN_FUNCTION(); \
56 __idmap_text_start = .; \
57 *(.idmap.text) \
58 __idmap_text_end = .; \
59
60#define ARM_DISCARD \
61 *(.ARM.exidx.exit.text) \
62 *(.ARM.extab.exit.text) \
63 *(.ARM.exidx.text.exit) \
64 *(.ARM.extab.text.exit) \
65 ARM_CPU_DISCARD(*(.ARM.exidx.cpuexit.text)) \
66 ARM_CPU_DISCARD(*(.ARM.extab.cpuexit.text)) \
67 ARM_EXIT_DISCARD(EXIT_TEXT) \
68 ARM_EXIT_DISCARD(EXIT_DATA) \
69 EXIT_CALL \
70 ARM_MMU_DISCARD(*(.text.fixup)) \
71 ARM_MMU_DISCARD(*(__ex_table)) \
72 COMMON_DISCARDS
73
74/*
75 * Sections that should stay zero sized, which is safer to explicitly
76 * check instead of blindly discarding.
77 */
78#define ARM_ASSERTS \
79 .plt : { \
80 *(.iplt) *(.rel.iplt) *(.iplt) *(.igot.plt) \
81 } \
82 ASSERT(SIZEOF(.plt) == 0, \
83 "Unexpected run-time procedure linkages detected!")
84
85#define ARM_DETAILS \
86 ELF_DETAILS \
87 .ARM.attributes 0 : { *(.ARM.attributes) }
88
89#define ARM_STUBS_TEXT \
90 *(.gnu.warning) \
91 *(.glue_7) \
92 *(.glue_7t) \
93 *(.vfp11_veneer) \
94 *(.v4_bx)
95
96#define ARM_TEXT \
97 IDMAP_TEXT \
98 __entry_text_start = .; \
99 *(.entry.text) \
100 __entry_text_end = .; \
101 IRQENTRY_TEXT \
102 SOFTIRQENTRY_TEXT \
103 TEXT_TEXT \
104 SCHED_TEXT \
105 LOCK_TEXT \
106 KPROBES_TEXT \
107 ARM_STUBS_TEXT \
108 . = ALIGN(4); \
109 *(.got) /* Global offset table */ \
110 ARM_CPU_KEEP(PROC_INFO)
111
112/* Stack unwinding tables */
113#define ARM_UNWIND_SECTIONS \
114 . = ALIGN(8); \
115 .ARM.unwind_idx : { \
116 __start_unwind_idx = .; \
117 *(.ARM.exidx*) \
118 __stop_unwind_idx = .; \
119 } \
120 .ARM.unwind_tab : { \
121 __start_unwind_tab = .; \
122 *(.ARM.extab*) \
123 __stop_unwind_tab = .; \
124 }
125
126/*
127 * The vectors and stubs are relocatable code, and the
128 * only thing that matters is their relative offsets
129 */
130#define ARM_VECTORS \
131 __vectors_lma = .; \
132 OVERLAY 0xffff0000 : NOCROSSREFS AT(__vectors_lma) { \
133 .vectors { \
134 OVERLAY_KEEP(*(.vectors)) \
135 } \
136 .vectors.bhb.loop8 { \
137 OVERLAY_KEEP(*(.vectors.bhb.loop8)) \
138 } \
139 .vectors.bhb.bpiall { \
140 OVERLAY_KEEP(*(.vectors.bhb.bpiall)) \
141 } \
142 } \
143 ARM_LMA(__vectors, .vectors); \
144 ARM_LMA(__vectors_bhb_loop8, .vectors.bhb.loop8); \
145 ARM_LMA(__vectors_bhb_bpiall, .vectors.bhb.bpiall); \
146 . = __vectors_lma + SIZEOF(.vectors) + \
147 SIZEOF(.vectors.bhb.loop8) + \
148 SIZEOF(.vectors.bhb.bpiall); \
149 \
150 __stubs_lma = .; \
151 .stubs ADDR(.vectors) + 0x1000 : AT(__stubs_lma) { \
152 *(.stubs) \
153 } \
154 ARM_LMA(__stubs, .stubs); \
155 . = __stubs_lma + SIZEOF(.stubs); \
156 \
157 PROVIDE(vector_fiq_offset = vector_fiq - ADDR(.vectors));
158
159#define ARM_TCM \
160 __itcm_start = ALIGN(4); \
161 .text_itcm ITCM_OFFSET : AT(__itcm_start - LOAD_OFFSET) { \
162 __sitcm_text = .; \
163 *(.tcm.text) \
164 *(.tcm.rodata) \
165 . = ALIGN(4); \
166 __eitcm_text = .; \
167 } \
168 . = __itcm_start + SIZEOF(.text_itcm); \
169 \
170 __dtcm_start = .; \
171 .data_dtcm DTCM_OFFSET : AT(__dtcm_start - LOAD_OFFSET) { \
172 __sdtcm_data = .; \
173 *(.tcm.data) \
174 . = ALIGN(4); \
175 __edtcm_data = .; \
176 } \
177 . = __dtcm_start + SIZEOF(.data_dtcm);