diff options
author | Sylvain Gault <sylvain.gault@gmail.com> | 2015-09-29 04:45:09 +0200 |
---|---|---|
committer | Paulo Alcantara <pcacjr@zytor.com> | 2015-11-08 15:48:26 -0200 |
commit | 0cc9a99e560a2f52bcf052fd85b1efae35ee812f (patch) | |
tree | adf4bd2efa466219733dc6f47cf0d0dcaf0ed782 | |
parent | e5f2b577ded109291c9632dacb6eaa621d8a59fe (diff) | |
download | syslinux-0cc9a99e560a2f52bcf052fd85b1efae35ee812f.tar.gz syslinux-0cc9a99e560a2f52bcf052fd85b1efae35ee812f.tar.xz syslinux-0cc9a99e560a2f52bcf052fd85b1efae35ee812f.zip |
bios: Don't try to guess the sections alignment
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 <sylvain.gault@gmail.com>
Tested-by: poma <pomidorabelisima@gmail.com>
Signed-off-by: Paulo Alcantara <pcacjr@zytor.com>
-rw-r--r-- | core/i386/syslinux.ld | 63 | ||||
-rw-r--r-- | 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 73904510..92b75b11 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 bf815c46..70c6e00a 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.*) |