:: commit f5e43d2e9bc17a1f0b01443fbae5cbfba3d47bf5

mintsuki <mintsuki@protonmail.com> — 2023-09-09 20:49

parents: e7311fc8a0

misc: Improve UEFI linker scripts

diff --git a/common/linker_uefi_aarch64.ld.in b/common/linker_uefi_aarch64.ld.in
index 5465aa94..1deb388a 100644
--- a/common/linker_uefi_aarch64.ld.in
+++ b/common/linker_uefi_aarch64.ld.in
@@ -19,35 +19,29 @@ SECTIONS
         *(.pe_header)
         . = ALIGN(0x1000);
 
+        __text_start = ABSOLUTE(.);
         *(.text .text.*)
-        . = ALIGN(0x1000);
     } :text
 
-    __text_start = __image_base + 0x1000;
-    __text_size = SIZEOF(.text) - 0x1000;
-    __text_end = __text_start + __text_size;
+    . = ALIGN(0x1000);
+    __text_end = .;
+    __text_size = __text_end - __text_start;
 
-    .data.sbat : {
+    .data : {
+        __sbat_start = ABSOLUTE(.);
         *(.data.sbat)
         . = ALIGN(0x1000);
-    } :data
-
-    PROVIDE(__sbat_sizev = 1);
+        __sbat_end = ABSOLUTE(.);
+        __sbat_size = ABSOLUTE(__sbat_end - __sbat_start);
+        PROVIDE(__sbat_sizev = ABSOLUTE(0));
 
-    __sbat_start = __text_end;
-    __sbat_size = SIZEOF(.data.sbat);
-    __sbat_end = __sbat_start + __sbat_size;
-
-    .data.reloc : {
+        __reloc_start = ABSOLUTE(.);
         *(.data.reloc)
         . = ALIGN(0x1000);
-    } :data
+        __reloc_end = ABSOLUTE(.);
+        __reloc_size = ABSOLUTE(__reloc_end - __reloc_start);
 
-    __reloc_start = __sbat_end;
-    __reloc_size = SIZEOF(.data.reloc);
-    __reloc_end = __reloc_start + __reloc_size;
-
-    .data : {
+        __data_start = ABSOLUTE(.);
         *(.rodata .rodata.*)
 
 #ifdef LINKER_NOMAP
@@ -78,11 +72,10 @@ SECTIONS
         . = ALIGN(0x1000);
     } :data :dynamic
 
-    __data_start = __reloc_end;
-    __data_size = SIZEOF(.data) + SIZEOF(.rela) + SIZEOF(.got) + SIZEOF(.dynamic);
-    __data_end = __data_start + __data_size;
+    __data_end = .;
+    __data_size = __data_end - __data_start;
 
-    __image_end = __data_end;
+    __image_end = .;
 
     /DISCARD/ : {
         *(.eh_frame)
diff --git a/common/linker_uefi_ia32.ld.in b/common/linker_uefi_ia32.ld.in
index 5d32b21e..823ce5f2 100644
--- a/common/linker_uefi_ia32.ld.in
+++ b/common/linker_uefi_ia32.ld.in
@@ -19,35 +19,29 @@ SECTIONS
         *(.pe_header)
         . = ALIGN(0x1000);
 
+        __text_start = ABSOLUTE(.);
         *(.text .text.*)
-        . = ALIGN(0x1000);
     } :text
 
-    __text_start = __image_base + 0x1000;
-    __text_size = SIZEOF(.text) - 0x1000;
-    __text_end = __text_start + __text_size;
+    . = ALIGN(0x1000);
+    __text_end = .;
+    __text_size = __text_end - __text_start;
 
-    .data.sbat : {
+    .data : {
+        __sbat_start = ABSOLUTE(.);
         *(.data.sbat)
         . = ALIGN(0x1000);
-    } :data
-
-    PROVIDE(__sbat_sizev = 1);
+        __sbat_end = ABSOLUTE(.);
+        __sbat_size = ABSOLUTE(__sbat_end - __sbat_start);
+        PROVIDE(__sbat_sizev = ABSOLUTE(0));
 
-    __sbat_start = __text_end;
-    __sbat_size = SIZEOF(.data.sbat);
-    __sbat_end = __sbat_start + __sbat_size;
-
-    .data.reloc : {
+        __reloc_start = ABSOLUTE(.);
         *(.data.reloc)
         . = ALIGN(0x1000);
-    } :data
+        __reloc_end = ABSOLUTE(.);
+        __reloc_size = ABSOLUTE(__reloc_end - __reloc_start);
 
-    __reloc_start = __sbat_end;
-    __reloc_size = SIZEOF(.data.reloc);
-    __reloc_end = __reloc_start + __reloc_size;
-
-    .data : {
+        __data_start = ABSOLUTE(.);
         *(.rodata .rodata.*)
 
 #ifdef LINKER_NOMAP
@@ -78,11 +72,10 @@ SECTIONS
         . = ALIGN(0x1000);
     } :data :dynamic
 
-    __data_start = __reloc_end;
-    __data_size = SIZEOF(.data) + SIZEOF(.rel) + SIZEOF(.got) + SIZEOF(.dynamic);
-    __data_end = __data_start + __data_size;
+    __data_end = .;
+    __data_size = __data_end - __data_start;
 
-    __image_end = __data_end;
+    __image_end = .;
 
     /DISCARD/ : {
         *(.eh_frame)
diff --git a/common/linker_uefi_x86_64.ld.in b/common/linker_uefi_x86_64.ld.in
index 146d1656..2f59acb6 100644
--- a/common/linker_uefi_x86_64.ld.in
+++ b/common/linker_uefi_x86_64.ld.in
@@ -19,35 +19,29 @@ SECTIONS
         *(.pe_header)
         . = ALIGN(0x1000);
 
+        __text_start = ABSOLUTE(.);
         *(.text .text.*)
-        . = ALIGN(0x1000);
     } :text
 
-    __text_start = __image_base + 0x1000;
-    __text_size = SIZEOF(.text) - 0x1000;
-    __text_end = __text_start + __text_size;
+    . = ALIGN(0x1000);
+    __text_end = .;
+    __text_size = __text_end - __text_start;
 
-    .data.sbat : {
+    .data : {
+        __sbat_start = ABSOLUTE(.);
         *(.data.sbat)
         . = ALIGN(0x1000);
-    } :data
-
-    PROVIDE(__sbat_sizev = 1);
+        __sbat_end = ABSOLUTE(.);
+        __sbat_size = ABSOLUTE(__sbat_end - __sbat_start);
+        PROVIDE(__sbat_sizev = ABSOLUTE(0));
 
-    __sbat_start = __text_end;
-    __sbat_size = SIZEOF(.data.sbat);
-    __sbat_end = __sbat_start + __sbat_size;
-
-    .data.reloc : {
+        __reloc_start = ABSOLUTE(.);
         *(.data.reloc)
         . = ALIGN(0x1000);
-    } :data
+        __reloc_end = ABSOLUTE(.);
+        __reloc_size = ABSOLUTE(__reloc_end - __reloc_start);
 
-    __reloc_start = __sbat_end;
-    __reloc_size = SIZEOF(.data.reloc);
-    __reloc_end = __reloc_start + __reloc_size;
-
-    .data : {
+        __data_start = ABSOLUTE(.);
         *(.rodata .rodata.*)
 
 #ifdef LINKER_NOMAP
@@ -78,11 +72,10 @@ SECTIONS
         . = ALIGN(0x1000);
     } :data :dynamic
 
-    __data_start = __reloc_end;
-    __data_size = SIZEOF(.data) + SIZEOF(.rela) + SIZEOF(.got) + SIZEOF(.dynamic);
-    __data_end = __data_start + __data_size;
+    __data_end = .;
+    __data_size = __data_end - __data_start;
 
-    __image_end = __data_end;
+    __image_end = .;
 
     /DISCARD/ : {
         *(.eh_frame)
tab: 248 wrap: offon