1 | /* SPDX-License-Identifier: GPL-2.0 */ |
2 | #include <asm-generic/vmlinux.lds.h> |
3 | #include <asm/vmlinux.lds.h> |
4 | #include <asm/thread_info.h> |
5 | #include <asm/page.h> |
6 | #include <asm/sclp.h> |
7 | #include "boot.h" |
8 | |
9 | OUTPUT_FORMAT("elf64-s390" , "elf64-s390" , "elf64-s390" ) |
10 | OUTPUT_ARCH(s390:64-bit) |
11 | |
12 | ENTRY(startup) |
13 | |
14 | SECTIONS |
15 | { |
16 | . = 0; |
17 | .ipldata : { |
18 | *(.ipldata) |
19 | } |
20 | . = IPL_START; |
21 | .head.text : { |
22 | _head = . ; |
23 | HEAD_TEXT |
24 | _ehead = . ; |
25 | } |
26 | . = PARMAREA; |
27 | .parmarea : { |
28 | *(.parmarea) |
29 | } |
30 | .text : { |
31 | _text = .; /* Text */ |
32 | *(.text) |
33 | *(.text.*) |
34 | INIT_TEXT |
35 | _etext = . ; |
36 | } |
37 | .rodata : { |
38 | _rodata = . ; |
39 | *(.rodata) /* read-only data */ |
40 | *(.rodata.*) |
41 | _erodata = . ; |
42 | } |
43 | .got : { |
44 | *(.got) |
45 | } |
46 | NOTES |
47 | .data : { |
48 | _data = . ; |
49 | *(.data) |
50 | *(.data.*) |
51 | _edata = . ; |
52 | } |
53 | |
54 | BOOT_DATA |
55 | BOOT_DATA_PRESERVED |
56 | |
57 | /* |
58 | * This is the BSS section of the decompressor and not of the decompressed Linux kernel. |
59 | * It will consume place in the decompressor's image. |
60 | */ |
61 | . = ALIGN(8); |
62 | .bss : { |
63 | _bss = . ; |
64 | *(.bss) |
65 | *(.bss.*) |
66 | *(COMMON) |
67 | /* |
68 | * Stacks for the decompressor |
69 | */ |
70 | . = ALIGN(PAGE_SIZE); |
71 | _dump_info_stack_start = .; |
72 | . += PAGE_SIZE; |
73 | _dump_info_stack_end = .; |
74 | . = ALIGN(PAGE_SIZE); |
75 | _stack_start = .; |
76 | . += BOOT_STACK_SIZE; |
77 | _stack_end = .; |
78 | _ebss = .; |
79 | } |
80 | |
81 | /* |
82 | * uncompressed image info used by the decompressor it should match |
83 | * struct vmlinux_info. It comes from .vmlinux.info section of |
84 | * uncompressed vmlinux in a form of info.o |
85 | */ |
86 | . = ALIGN(8); |
87 | .vmlinux.info : { |
88 | _vmlinux_info = .; |
89 | *(.vmlinux.info) |
90 | } |
91 | |
92 | .decompressor.syms : { |
93 | . += 1; /* make sure we have \0 before the first entry */ |
94 | . = ALIGN(2); |
95 | _decompressor_syms_start = .; |
96 | *(.decompressor.syms) |
97 | _decompressor_syms_end = .; |
98 | } |
99 | |
100 | _decompressor_end = .; |
101 | |
102 | #ifdef CONFIG_KERNEL_UNCOMPRESSED |
103 | . = 0x100000; |
104 | #else |
105 | . = ALIGN(8); |
106 | #endif |
107 | .rodata.compressed : { |
108 | _compressed_start = .; |
109 | *(.vmlinux.bin.compressed) |
110 | _compressed_end = .; |
111 | } |
112 | |
113 | #ifndef CONFIG_PIE_BUILD |
114 | /* |
115 | * When the kernel is built with CONFIG_KERNEL_UNCOMPRESSED, the entire |
116 | * uncompressed vmlinux.bin is positioned in the bzImage decompressor |
117 | * image at the default kernel LMA of 0x100000, enabling it to be |
118 | * executed in-place. However, the size of .vmlinux.relocs could be |
119 | * large enough to cause an overlap with the uncompressed kernel at the |
120 | * address 0x100000. To address this issue, .vmlinux.relocs is |
121 | * positioned after the .rodata.compressed. |
122 | */ |
123 | . = ALIGN(4); |
124 | .vmlinux.relocs : { |
125 | __vmlinux_relocs_64_start = .; |
126 | *(.vmlinux.relocs_64) |
127 | __vmlinux_relocs_64_end = .; |
128 | } |
129 | #endif |
130 | |
131 | #define SB_TRAILER_SIZE 32 |
132 | /* Trailer needed for Secure Boot */ |
133 | . += SB_TRAILER_SIZE; /* make sure .sb.trailer does not overwrite the previous section */ |
134 | . = ALIGN(4096) - SB_TRAILER_SIZE; |
135 | .sb.trailer : { |
136 | QUAD(0) |
137 | QUAD(0) |
138 | QUAD(0) |
139 | QUAD(0x000000207a49504c) |
140 | } |
141 | _end = .; |
142 | |
143 | DWARF_DEBUG |
144 | ELF_DETAILS |
145 | |
146 | /* |
147 | * Make sure that the .got.plt is either completely empty or it |
148 | * contains only the three reserved double words. |
149 | */ |
150 | .got.plt : { |
151 | *(.got.plt) |
152 | } |
153 | ASSERT(SIZEOF(.got.plt) == 0 || SIZEOF(.got.plt) == 0x18, "Unexpected GOT/PLT entries detected!" ) |
154 | |
155 | /* |
156 | * Sections that should stay zero sized, which is safer to |
157 | * explicitly check instead of blindly discarding. |
158 | */ |
159 | .plt : { |
160 | *(.plt) *(.plt.*) *(.iplt) *(.igot .igot.plt) |
161 | } |
162 | ASSERT(SIZEOF(.plt) == 0, "Unexpected run-time procedure linkages detected!" ) |
163 | .rela.dyn : { |
164 | *(.rela.*) *(.rela_*) |
165 | } |
166 | ASSERT(SIZEOF(.rela.dyn) == 0, "Unexpected run-time relocations (.rela) detected!" ) |
167 | |
168 | /* Sections to be discarded */ |
169 | /DISCARD/ : { |
170 | COMMON_DISCARDS |
171 | *(.eh_frame) |
172 | *(__ex_table) |
173 | *(*__ksymtab*) |
174 | *(___kcrctab*) |
175 | } |
176 | } |
177 | |