1From 76946dd67bc856eaf4fe69d0826547a794176f78 Mon Sep 17 00:00:00 2001
2From: Sylvain Gault <sylvain.gault@gmail.com>
3Date: Tue, 29 Sep 2015 04:45:09 +0200
4Subject: [PATCH] bios: Don't try to guess the sections alignment
5
6For the compression / decompression to succeed, the sections layout must
7be the same between the virtual memory and load memory. The section
8alignment was kept in sync by introducing aligment that should be
9greater or equal to the actual section alignment.
10
11This patch compute the load memory addresses of the sections so that
12the layout is the same as the virtual memory addresses.
13
14Signed-off-by: Sylvain Gault <sylvain.gault@gmail.com>
15Tested-by: poma <pomidorabelisima@gmail.com>
16Signed-off-by: Paulo Alcantara <pcacjr@zytor.com>
17
18Upstream: 0cc9a99e560a2f52bcf052fd85b1efae35ee812f
19Signed-off-by: Arnout Vandecappelle (Essensium/Mind) <arnout@mind.be>
20---
21 core/i386/syslinux.ld   | 63 ++++++++++---------------------------------------
22 core/x86_64/syslinux.ld | 63 ++++++++++---------------------------------------
23 2 files changed, 24 insertions(+), 102 deletions(-)
24
25diff --git a/core/i386/syslinux.ld b/core/i386/syslinux.ld
26index 73904510..92b75b11 100644
27--- a/core/i386/syslinux.ld
28+++ b/core/i386/syslinux.ld
29@@ -255,10 +255,9 @@ SECTIONS
30 	. = 0x100000;
31
32 	__pm_code_start = .;
33+	__vma_to_lma = __pm_code_lma - __pm_code_start;
34
35-	__text_vma = .;
36-	__text_lma = __pm_code_lma;
37-	.text : AT(__text_lma) {
38+	.text : AT(ADDR(.text) + __vma_to_lma) {
39 		FILL(0x90909090)
40 		__text_start = .;
41 		*(.text)
42@@ -266,106 +265,68 @@ SECTIONS
43 		__text_end = .;
44 	}
45
46-	. = ALIGN(32);
47-
48-	__rodata_vma = .;
49-	__rodata_lma = __rodata_vma + __text_lma - __text_vma;
50-	.rodata : AT(__rodata_lma) {
51+	.rodata : AT(ADDR(.rodata) + __vma_to_lma) {
52 		__rodata_start = .;
53 		*(.rodata)
54 		*(.rodata.*)
55 		__rodata_end = .;
56 	}
57
58-	. = ALIGN(4);
59-
60-	__ctors_vma = .;
61-	__ctors_lma = __ctors_vma + __text_lma - __text_vma;
62-	.ctors : AT(__ctors_lma) {
63+	.ctors : AT(ADDR(.ctors) + __vma_to_lma) {
64 		__ctors_start = .;
65 		KEEP (*(SORT(.ctors.*)))
66 		KEEP (*(.ctors))
67 		__ctors_end = .;
68 	}
69
70-	__dtors_vma = .;
71-	__dtors_lma = __dtors_vma + __text_lma - __text_vma;
72-	.dtors : AT(__dtors_lma) {
73+	.dtors : AT(ADDR(.dtors) + __vma_to_lma) {
74 		__dtors_start = .;
75 		KEEP (*(SORT(.dtors.*)))
76 		KEEP (*(.dtors))
77 		__dtors_end = .;
78 	}
79
80-	. = ALIGN(4);
81-
82-	__dynsym_vma = .;
83-	__dynsym_lma = __dynsym_vma + __text_lma - __text_vma;
84-	.dynsym : AT(__dynsym_lma) {
85+	.dynsym : AT(ADDR(.dynsym) + __vma_to_lma) {
86 		__dynsym_start = .;
87 		*(.dynsym)
88 		__dynsym_end = .;
89 	}
90 	__dynsym_len = __dynsym_end - __dynsym_start;
91
92-	. = ALIGN(4);
93-
94-	__dynstr_vma = .;
95-	__dynstr_lma = __dynstr_vma + __text_lma - __text_vma;
96-	.dynstr : AT(__dynstr_lma) {
97+	.dynstr : AT(ADDR(.dynstr) + __vma_to_lma) {
98 		__dynstr_start = .;
99 		*(.dynstr)
100 		__dynstr_end = .;
101 	}
102 	__dynstr_len = __dynstr_end - __dynstr_start;
103
104-	. = ALIGN(4);
105-
106-	__gnu_hash_vma = .;
107-	__gnu_hash_lma = __gnu_hash_vma + __text_lma - __text_vma;
108-	.gnu.hash : AT(__gnu_hash_lma) {
109+	.gnu.hash : AT(ADDR(.gnu.hash) + __vma_to_lma) {
110 		__gnu_hash_start = .;
111 		*(.gnu.hash)
112 		__gnu_hash_end = .;
113 	}
114
115
116-	. = ALIGN(4);
117-
118-	__dynlink_vma = .;
119-	__dynlink_lma = __dynlink_vma + __text_lma - __text_vma;
120-	.dynlink : AT(__dynlink_lma) {
121+	.dynlink : AT(ADDR(.dynlink) + __vma_to_lma) {
122 		__dynlink_start = .;
123 		*(.dynlink)
124 		__dynlink_end = .;
125 	}
126
127-	. = ALIGN(4);
128-
129-	__got_vma = .;
130-	__got_lma = __got_vma + __text_lma - __text_vma;
131-	.got : AT(__got_lma) {
132+	.got : AT(ADDR(.got) + __vma_to_lma) {
133 		__got_start = .;
134 		KEEP (*(.got.plt))
135 		KEEP (*(.got))
136 		__got_end = .;
137 	}
138
139-	. = ALIGN(4);
140-
141-	__dynamic_vma = .;
142-	__dynamic_lma = __dynamic_vma + __text_lma - __text_vma;
143-	.dynamic : AT(__dynamic_lma) {
144+	.dynamic : AT(ADDR(.dynamic) + __vma_to_lma) {
145 		__dynamic_start = .;
146 		*(.dynamic)
147 		__dynamic_end = .;
148 	}
149
150-	. = ALIGN(32);
151-
152-	__data_vma = .;
153-	__data_lma = __data_vma + __text_lma - __text_vma;
154-	.data : AT(__data_lma) {
155+	.data : AT(ADDR(.data) + __vma_to_lma) {
156 		__data_start = .;
157 		*(.data)
158 		*(.data.*)
159diff --git a/core/x86_64/syslinux.ld b/core/x86_64/syslinux.ld
160index bf815c46..70c6e00a 100644
161--- a/core/x86_64/syslinux.ld
162+++ b/core/x86_64/syslinux.ld
163@@ -255,10 +255,9 @@ SECTIONS
164 	. = 0x100000;
165
166 	__pm_code_start = .;
167+	__vma_to_lma = __pm_code_lma - __pm_code_start;
168
169-	__text_vma = .;
170-	__text_lma = __pm_code_lma;
171-	.text : AT(__text_lma) {
172+	.text : AT(ADDR(.text) + __vma_to_lma) {
173 		FILL(0x90909090)
174 		__text_start = .;
175 		*(.text)
176@@ -266,106 +265,68 @@ SECTIONS
177 		__text_end = .;
178 	}
179
180-	. = ALIGN(32);
181-
182-	__rodata_vma = .;
183-	__rodata_lma = __rodata_vma + __text_lma - __text_vma;
184-	.rodata : AT(__rodata_lma) {
185+	.rodata : AT(ADDR(.rodata) + __vma_to_lma) {
186 		__rodata_start = .;
187 		*(.rodata)
188 		*(.rodata.*)
189 		__rodata_end = .;
190 	}
191
192-	. = ALIGN(4);
193-
194-	__ctors_vma = .;
195-	__ctors_lma = __ctors_vma + __text_lma - __text_vma;
196-	.ctors : AT(__ctors_lma) {
197+	.ctors : AT(ADDR(.ctors) + __vma_to_lma) {
198 		__ctors_start = .;
199 		KEEP (*(SORT(.ctors.*)))
200 		KEEP (*(.ctors))
201 		__ctors_end = .;
202 	}
203
204-	__dtors_vma = .;
205-	__dtors_lma = __dtors_vma + __text_lma - __text_vma;
206-	.dtors : AT(__dtors_lma) {
207+	.dtors : AT(ADDR(.dtors) + __vma_to_lma) {
208 		__dtors_start = .;
209 		KEEP (*(SORT(.dtors.*)))
210 		KEEP (*(.dtors))
211 		__dtors_end = .;
212 	}
213
214-	. = ALIGN(4);
215-
216-	__dynsym_vma = .;
217-	__dynsym_lma = __dynsym_vma + __text_lma - __text_vma;
218-	.dynsym : AT(__dynsym_lma) {
219+	.dynsym : AT(ADDR(.dynsym) + __vma_to_lma) {
220 		__dynsym_start = .;
221 		*(.dynsym)
222 		__dynsym_end = .;
223 	}
224 	__dynsym_len = __dynsym_end - __dynsym_start;
225
226-	. = ALIGN(4);
227-
228-	__dynstr_vma = .;
229-	__dynstr_lma = __dynstr_vma + __text_lma - __text_vma;
230-	.dynstr : AT(__dynstr_lma) {
231+	.dynstr : AT(ADDR(.dynstr) + __vma_to_lma) {
232 		__dynstr_start = .;
233 		*(.dynstr)
234 		__dynstr_end = .;
235 	}
236 	__dynstr_len = __dynstr_end - __dynstr_start;
237
238-	. = ALIGN(4);
239-
240-	__gnu_hash_vma = .;
241-	__gnu_hash_lma = __gnu_hash_vma + __text_lma - __text_vma;
242-	.gnu.hash : AT(__gnu_hash_lma) {
243+	.gnu.hash : AT(ADDR(.gnu.hash) + __vma_to_lma) {
244 		__gnu_hash_start = .;
245 		*(.gnu.hash)
246 		__gnu_hash_end = .;
247 	}
248
249
250-	. = ALIGN(4);
251-
252-	__dynlink_vma = .;
253-	__dynlink_lma = __dynlink_vma + __text_lma - __text_vma;
254-	.dynlink : AT(__dynlink_lma) {
255+	.dynlink : AT(ADDR(.dynlink) + __vma_to_lma) {
256 		__dynlink_start = .;
257 		*(.dynlink)
258 		__dynlink_end = .;
259 	}
260
261-	. = ALIGN(4);
262-
263-	__got_vma = .;
264-	__got_lma = __got_vma + __text_lma - __text_vma;
265-	.got : AT(__got_lma) {
266+	.got : AT(ADDR(.got) + __vma_to_lma) {
267 		__got_start = .;
268 		KEEP (*(.got.plt))
269 		KEEP (*(.got))
270 		__got_end = .;
271 	}
272
273-	. = ALIGN(4);
274-
275-	__dynamic_vma = .;
276-	__dynamic_lma = __dynamic_vma + __text_lma - __text_vma;
277-	.dynamic : AT(__dynamic_lma) {
278+	.dynamic : AT(ADDR(.dynamic) + __vma_to_lma) {
279 		__dynamic_start = .;
280 		*(.dynamic)
281 		__dynamic_end = .;
282 	}
283
284-	. = ALIGN(32);
285-
286-	__data_vma = .;
287-	__data_lma = __data_vma + __text_lma - __text_vma;
288-	.data : AT(__data_lma) {
289+	.data : AT(ADDR(.data) + __vma_to_lma) {
290 		__data_start = .;
291 		*(.data)
292 		*(.data.*)
293--
2942.13.3
295
296