[syslinux] [PATCH 2/2] bios: Don't try to guess the sections alignment
poma
pomidorabelisima at gmail.com
Wed Oct 21 09:00:10 PDT 2015
On 29.09.2015 06:46, celelibi--- via Syslinux wrote:
> From: Sylvain Gault <sylvain.gault at gmail.com>
>
> 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 at gmail.com>
> ---
> 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.*)
>
Tested-by: poma <pomidorabelisima at gmail.com>
More information about the Syslinux
mailing list