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