From: Sylvain Gault For the compression / decompression to succeed, the sections layout must be the same between the virtual memory and load memory. The section alignment was kept in sync by introducing aligment that should be greater or equal to the actual section alignment. This patch compute the load memory addresses of the sections so that the layout is the same as the virtual memory addresses. Signed-off-by: Sylvain Gault --- core/i386/syslinux.ld | 63 ++++++++++--------------------------------------- core/x86_64/syslinux.ld | 63 ++++++++++--------------------------------------- 2 files changed, 24 insertions(+), 102 deletions(-) diff --git a/core/i386/syslinux.ld b/core/i386/syslinux.ld index 7390451..92b75b1 100644 --- a/core/i386/syslinux.ld +++ b/core/i386/syslinux.ld @@ -255,10 +255,9 @@ SECTIONS . = 0x100000; __pm_code_start = .; + __vma_to_lma = __pm_code_lma - __pm_code_start; - __text_vma = .; - __text_lma = __pm_code_lma; - .text : AT(__text_lma) { + .text : AT(ADDR(.text) + __vma_to_lma) { FILL(0x90909090) __text_start = .; *(.text) @@ -266,106 +265,68 @@ SECTIONS __text_end = .; } - . = ALIGN(32); - - __rodata_vma = .; - __rodata_lma = __rodata_vma + __text_lma - __text_vma; - .rodata : AT(__rodata_lma) { + .rodata : AT(ADDR(.rodata) + __vma_to_lma) { __rodata_start = .; *(.rodata) *(.rodata.*) __rodata_end = .; } - . = ALIGN(4); - - __ctors_vma = .; - __ctors_lma = __ctors_vma + __text_lma - __text_vma; - .ctors : AT(__ctors_lma) { + .ctors : AT(ADDR(.ctors) + __vma_to_lma) { __ctors_start = .; KEEP (*(SORT(.ctors.*))) KEEP (*(.ctors)) __ctors_end = .; } - __dtors_vma = .; - __dtors_lma = __dtors_vma + __text_lma - __text_vma; - .dtors : AT(__dtors_lma) { + .dtors : AT(ADDR(.dtors) + __vma_to_lma) { __dtors_start = .; KEEP (*(SORT(.dtors.*))) KEEP (*(.dtors)) __dtors_end = .; } - . = ALIGN(4); - - __dynsym_vma = .; - __dynsym_lma = __dynsym_vma + __text_lma - __text_vma; - .dynsym : AT(__dynsym_lma) { + .dynsym : AT(ADDR(.dynsym) + __vma_to_lma) { __dynsym_start = .; *(.dynsym) __dynsym_end = .; } __dynsym_len = __dynsym_end - __dynsym_start; - . = ALIGN(4); - - __dynstr_vma = .; - __dynstr_lma = __dynstr_vma + __text_lma - __text_vma; - .dynstr : AT(__dynstr_lma) { + .dynstr : AT(ADDR(.dynstr) + __vma_to_lma) { __dynstr_start = .; *(.dynstr) __dynstr_end = .; } __dynstr_len = __dynstr_end - __dynstr_start; - . = ALIGN(4); - - __gnu_hash_vma = .; - __gnu_hash_lma = __gnu_hash_vma + __text_lma - __text_vma; - .gnu.hash : AT(__gnu_hash_lma) { + .gnu.hash : AT(ADDR(.gnu.hash) + __vma_to_lma) { __gnu_hash_start = .; *(.gnu.hash) __gnu_hash_end = .; } - . = ALIGN(4); - - __dynlink_vma = .; - __dynlink_lma = __dynlink_vma + __text_lma - __text_vma; - .dynlink : AT(__dynlink_lma) { + .dynlink : AT(ADDR(.dynlink) + __vma_to_lma) { __dynlink_start = .; *(.dynlink) __dynlink_end = .; } - . = ALIGN(4); - - __got_vma = .; - __got_lma = __got_vma + __text_lma - __text_vma; - .got : AT(__got_lma) { + .got : AT(ADDR(.got) + __vma_to_lma) { __got_start = .; KEEP (*(.got.plt)) KEEP (*(.got)) __got_end = .; } - . = ALIGN(4); - - __dynamic_vma = .; - __dynamic_lma = __dynamic_vma + __text_lma - __text_vma; - .dynamic : AT(__dynamic_lma) { + .dynamic : AT(ADDR(.dynamic) + __vma_to_lma) { __dynamic_start = .; *(.dynamic) __dynamic_end = .; } - . = ALIGN(32); - - __data_vma = .; - __data_lma = __data_vma + __text_lma - __text_vma; - .data : AT(__data_lma) { + .data : AT(ADDR(.data) + __vma_to_lma) { __data_start = .; *(.data) *(.data.*) diff --git a/core/x86_64/syslinux.ld b/core/x86_64/syslinux.ld index bf815c4..70c6e00 100644 --- a/core/x86_64/syslinux.ld +++ b/core/x86_64/syslinux.ld @@ -255,10 +255,9 @@ SECTIONS . = 0x100000; __pm_code_start = .; + __vma_to_lma = __pm_code_lma - __pm_code_start; - __text_vma = .; - __text_lma = __pm_code_lma; - .text : AT(__text_lma) { + .text : AT(ADDR(.text) + __vma_to_lma) { FILL(0x90909090) __text_start = .; *(.text) @@ -266,106 +265,68 @@ SECTIONS __text_end = .; } - . = ALIGN(32); - - __rodata_vma = .; - __rodata_lma = __rodata_vma + __text_lma - __text_vma; - .rodata : AT(__rodata_lma) { + .rodata : AT(ADDR(.rodata) + __vma_to_lma) { __rodata_start = .; *(.rodata) *(.rodata.*) __rodata_end = .; } - . = ALIGN(4); - - __ctors_vma = .; - __ctors_lma = __ctors_vma + __text_lma - __text_vma; - .ctors : AT(__ctors_lma) { + .ctors : AT(ADDR(.ctors) + __vma_to_lma) { __ctors_start = .; KEEP (*(SORT(.ctors.*))) KEEP (*(.ctors)) __ctors_end = .; } - __dtors_vma = .; - __dtors_lma = __dtors_vma + __text_lma - __text_vma; - .dtors : AT(__dtors_lma) { + .dtors : AT(ADDR(.dtors) + __vma_to_lma) { __dtors_start = .; KEEP (*(SORT(.dtors.*))) KEEP (*(.dtors)) __dtors_end = .; } - . = ALIGN(4); - - __dynsym_vma = .; - __dynsym_lma = __dynsym_vma + __text_lma - __text_vma; - .dynsym : AT(__dynsym_lma) { + .dynsym : AT(ADDR(.dynsym) + __vma_to_lma) { __dynsym_start = .; *(.dynsym) __dynsym_end = .; } __dynsym_len = __dynsym_end - __dynsym_start; - . = ALIGN(4); - - __dynstr_vma = .; - __dynstr_lma = __dynstr_vma + __text_lma - __text_vma; - .dynstr : AT(__dynstr_lma) { + .dynstr : AT(ADDR(.dynstr) + __vma_to_lma) { __dynstr_start = .; *(.dynstr) __dynstr_end = .; } __dynstr_len = __dynstr_end - __dynstr_start; - . = ALIGN(4); - - __gnu_hash_vma = .; - __gnu_hash_lma = __gnu_hash_vma + __text_lma - __text_vma; - .gnu.hash : AT(__gnu_hash_lma) { + .gnu.hash : AT(ADDR(.gnu.hash) + __vma_to_lma) { __gnu_hash_start = .; *(.gnu.hash) __gnu_hash_end = .; } - . = ALIGN(4); - - __dynlink_vma = .; - __dynlink_lma = __dynlink_vma + __text_lma - __text_vma; - .dynlink : AT(__dynlink_lma) { + .dynlink : AT(ADDR(.dynlink) + __vma_to_lma) { __dynlink_start = .; *(.dynlink) __dynlink_end = .; } - . = ALIGN(4); - - __got_vma = .; - __got_lma = __got_vma + __text_lma - __text_vma; - .got : AT(__got_lma) { + .got : AT(ADDR(.got) + __vma_to_lma) { __got_start = .; KEEP (*(.got.plt)) KEEP (*(.got)) __got_end = .; } - . = ALIGN(4); - - __dynamic_vma = .; - __dynamic_lma = __dynamic_vma + __text_lma - __text_vma; - .dynamic : AT(__dynamic_lma) { + .dynamic : AT(ADDR(.dynamic) + __vma_to_lma) { __dynamic_start = .; *(.dynamic) __dynamic_end = .; } - . = ALIGN(32); - - __data_vma = .; - __data_lma = __data_vma + __text_lma - __text_vma; - .data : AT(__data_lma) { + .data : AT(ADDR(.data) + __vma_to_lma) { __data_start = .; *(.data) *(.data.*) -- 2.5.3