:: commit b0c59cc0d29f3a7321f582f731ada8beb1470df3

mintsuki <mintsuki@protonmail.com> — 2022-04-24 21:30

parents: 0cd9dba896

efi: Updates for new reduced-gnu-efi

diff --git a/common/GNUmakefile b/common/GNUmakefile
index 3d36a52f..351c54fb 100644
--- a/common/GNUmakefile
+++ b/common/GNUmakefile
@@ -279,7 +279,7 @@ ifeq ($(TARGET), uefi64)
 
 $(call MKESCAPE,$(BUILDDIR))/full.map.o: $(call MKESCAPE,$(BUILDDIR))/limine_nomap.elf
 	cd '$(call SHESCAPE,$(BUILDDIR))' && \
-		'$(call SHESCAPE,$(SRCDIR))/gensyms.sh' '$(call SHESCAPE,$<)' full 64 '\.sect'
+		'$(call SHESCAPE,$(SRCDIR))/gensyms.sh' '$(call SHESCAPE,$<)' full 64 '\.text'
 
 $(call MKESCAPE,$(BUILDDIR))/BOOTX64.EFI: $(call MKESCAPE,$(BUILDDIR))/limine.elf
 	$(LIMINE_OBJCOPY) -O binary '$(call SHESCAPE,$<)' '$(call SHESCAPE,$@)'
@@ -326,7 +326,7 @@ ifeq ($(TARGET), uefi32)
 
 $(call MKESCAPE,$(BUILDDIR))/full.map.o: $(call MKESCAPE,$(BUILDDIR))/limine_nomap.elf
 	cd '$(call SHESCAPE,$(BUILDDIR))' && \
-		'$(call SHESCAPE,$(SRCDIR))/gensyms.sh' '$(call SHESCAPE,$<)' full 32 '\.sect'
+		'$(call SHESCAPE,$(SRCDIR))/gensyms.sh' '$(call SHESCAPE,$<)' full 32 '\.text'
 
 $(call MKESCAPE,$(BUILDDIR))/BOOTIA32.EFI: $(call MKESCAPE,$(BUILDDIR))/limine.elf
 	$(LIMINE_OBJCOPY) -O binary '$(call SHESCAPE,$<)' '$(call SHESCAPE,$@)'
diff --git a/common/linker_uefi32.ld.in b/common/linker_uefi32.ld.in
index efb51fde..00bb5311 100644
--- a/common/linker_uefi32.ld.in
+++ b/common/linker_uefi32.ld.in
@@ -5,8 +5,9 @@ ENTRY(_start)
 PHDRS
 {
     null    PT_NULL    FLAGS(0) ;
-    segm    PT_LOAD    FLAGS(7) ;
-    dynamic PT_DYNAMIC FLAGS(7) ;
+    text    PT_LOAD    FLAGS((1 << 0) | (1 << 2)) ;
+    data    PT_LOAD    FLAGS((1 << 1) | (1 << 2)) ;
+    dynamic PT_DYNAMIC FLAGS((1 << 1) | (1 << 2)) ;
 }
 
 SECTIONS
@@ -15,37 +16,39 @@ SECTIONS
     __image_base = .;
     __image_size = __image_end - __image_base;
 
-    .sect : {
+    .text : {
         *(.pe_header)
-
         . = ALIGN(0x1000);
 
-        __text_start = .;
-        __text_size = __text_end - __text_start;
-        __text_sizev = __text_endv - __text_start;
         *(.text .text.*)
-        __text_endv = .;
         . = ALIGN(0x1000);
-        __text_end = .;
+    } :text
+
+    __text_start = __image_base + 0x1000;
+    __text_size = SIZEOF(.text) - 0x1000;
+    __text_end = __text_start + __text_size;
 
-        __reloc_start = .;
-        __reloc_size = __reloc_end - __reloc_start;
-        __reloc_sizev = __reloc_endv - __reloc_start;
-        *(.reloc)
-        __reloc_endv = .;
+    .data.sbat : {
+        *(.data.sbat)
         . = ALIGN(0x1000);
-        __reloc_end = .;
+    } :data
+
+    PROVIDE(__sbat_sizev = 1);
 
-        __sbat_start = .;
-        __sbat_size = __sbat_end - __sbat_start;
-        __sbat_sizev = __sbat_endv - __sbat_start;
-        *(.sbat)
-        __sbat_endv = .;
+    __sbat_start = __text_end;
+    __sbat_size = SIZEOF(.data.sbat);
+    __sbat_end = __sbat_start + __sbat_size;
+
+    .data.reloc : {
+        *(.data.reloc)
         . = ALIGN(0x1000);
-        __sbat_end = .;
+    } :data
+
+    __reloc_start = __sbat_end;
+    __reloc_size = SIZEOF(.data.reloc);
+    __reloc_end = __reloc_start + __reloc_size;
 
-        __data_start = .;
-        __data_size = __data_end - __data_start;
+    .data : {
         *(.rodata .rodata.*)
 
 #ifdef LINKER_NOMAP
@@ -61,27 +64,26 @@ SECTIONS
         *(.bss .bss.*)
         *(COMMON)
    data_end = .;
-        . = ALIGN(0x1000);
-    } :segm
+    } :data
 
     .rel : {
         *(.rel .rel.*)
-        . = ALIGN(0x1000);
-    } :segm
+    } :data
 
     .got : {
         *(.got .got.*)
-        . = ALIGN(0x1000);
-    } :segm
+    } :data
 
     .dynamic : {
-        __dynamic = .;
         *(.dynamic)
         . = ALIGN(0x1000);
-    } :segm :dynamic
+    } :data :dynamic
+
+    __data_start = __reloc_end;
+    __data_size = SIZEOF(.data) + SIZEOF(.rel) + SIZEOF(.got) + SIZEOF(.dynamic);
+    __data_end = __data_start + __data_size;
 
-    __data_end = .;
-    __image_end = .;
+    __image_end = __data_end;
 
     .symtab 0 : {
         *(.symtab)
diff --git a/common/linker_uefi64.ld.in b/common/linker_uefi64.ld.in
index ee520dec..10110e3a 100644
--- a/common/linker_uefi64.ld.in
+++ b/common/linker_uefi64.ld.in
@@ -5,8 +5,9 @@ ENTRY(_start)
 PHDRS
 {
     null    PT_NULL    FLAGS(0) ;
-    segm    PT_LOAD    FLAGS(7) ;
-    dynamic PT_DYNAMIC FLAGS(7) ;
+    text    PT_LOAD    FLAGS((1 << 0) | (1 << 2)) ;
+    data    PT_LOAD    FLAGS((1 << 1) | (1 << 2)) ;
+    dynamic PT_DYNAMIC FLAGS((1 << 1) | (1 << 2)) ;
 }
 
 SECTIONS
@@ -15,37 +16,39 @@ SECTIONS
     __image_base = .;
     __image_size = __image_end - __image_base;
 
-    .sect : {
+    .text : {
         *(.pe_header)
-
         . = ALIGN(0x1000);
 
-        __text_start = .;
-        __text_size = __text_end - __text_start;
-        __text_sizev = __text_endv - __text_start;
         *(.text .text.*)
-        __text_endv = .;
         . = ALIGN(0x1000);
-        __text_end = .;
+    } :text
+
+    __text_start = __image_base + 0x1000;
+    __text_size = SIZEOF(.text) - 0x1000;
+    __text_end = __text_start + __text_size;
 
-        __reloc_start = .;
-        __reloc_size = __reloc_end - __reloc_start;
-        __reloc_sizev = __reloc_endv - __reloc_start;
-        *(.reloc)
-        __reloc_endv = .;
+    .data.sbat : {
+        *(.data.sbat)
         . = ALIGN(0x1000);
-        __reloc_end = .;
+    } :data
+
+    PROVIDE(__sbat_sizev = 1);
 
-        __sbat_start = .;
-        __sbat_size = __sbat_end - __sbat_start;
-        __sbat_sizev = __sbat_endv - __sbat_start;
-        *(.sbat)
-        __sbat_endv = .;
+    __sbat_start = __text_end;
+    __sbat_size = SIZEOF(.data.sbat);
+    __sbat_end = __sbat_start + __sbat_size;
+
+    .data.reloc : {
+        *(.data.reloc)
         . = ALIGN(0x1000);
-        __sbat_end = .;
+    } :data
+
+    __reloc_start = __sbat_end;
+    __reloc_size = SIZEOF(.data.reloc);
+    __reloc_end = __reloc_start + __reloc_size;
 
-        __data_start = .;
-        __data_size = __data_end - __data_start;
+    .data : {
         *(.rodata .rodata.*)
 
 #ifdef LINKER_NOMAP
@@ -61,27 +64,26 @@ SECTIONS
         *(.bss .bss.*)
         *(COMMON)
    data_end = .;
-        . = ALIGN(0x1000);
-    } :segm
+    } :data
 
     .rela : {
         *(.rela .rela.*)
-        . = ALIGN(0x1000);
-    } :segm
+    } :data
 
     .got : {
         *(.got .got.*)
-        . = ALIGN(0x1000);
-    } :segm
+    } :data
 
     .dynamic : {
-        __dynamic = .;
         *(.dynamic)
         . = ALIGN(0x1000);
-    } :segm :dynamic
+    } :data :dynamic
+
+    __data_start = __reloc_end;
+    __data_size = SIZEOF(.data) + SIZEOF(.rela) + SIZEOF(.got) + SIZEOF(.dynamic);
+    __data_end = __data_start + __data_size;
 
-    __data_end = .;
-    __image_end = .;
+    __image_end = __data_end;
 
     .symtab 0 : {
         *(.symtab)
diff --git a/common/sbat.c b/common/sbat.c
index 6ae17180..dbe4e616 100644
--- a/common/sbat.c
+++ b/common/sbat.c
@@ -3,9 +3,13 @@
 #include <config.h>
 
 asm (
-    ".section .sbat\n\t"
+    ".section .data.sbat\n\t"
+    "sbat:\n\t"
     ".ascii \"sbat,1,SBAT Version,sbat,1,https://github.com/rhboot/shim/blob/main/SBAT.md\\n\"\n\t"
     ".ascii \"limine,1,Limine,limine," LIMINE_VERSION ",https://limine-bootloader.org\\n\"\n\t"
+    "__sbat_endv:\n\t"
+    ".global __sbat_sizev\n\t"
+    ".set __sbat_sizev, __sbat_endv - sbat\n\t"
 );
 
 #endif
tab: 248 wrap: offon