swt2c / rpms / syslinux

Forked from rpms/syslinux 5 years ago
Clone
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