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