Skip to content

Commit

Permalink
bios: Don't try to guess the sections alignment
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Sylvain Gault authored and Paulo Alcantara committed Nov 8, 2015
1 parent e5f2b57 commit 0cc9a99
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 102 deletions.
63 changes: 12 additions & 51 deletions core/i386/syslinux.ld
Expand Up @@ -255,117 +255,78 @@ 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)
*(.text.*)
__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.*)
Expand Down
63 changes: 12 additions & 51 deletions core/x86_64/syslinux.ld
Expand Up @@ -255,117 +255,78 @@ 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)
*(.text.*)
__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.*)
Expand Down

0 comments on commit 0cc9a99

Please sign in to comment.