:: commit 8382cd1794b32224f9f37f3571672cc651bf938a

mintsuki <mintsuki@protonmail.com> — 2024-09-09 05:43

parents: 91b7ef85ab

build: Do not use linker script subtractions as they are broken on GCC

diff --git a/common/entry.s3.c b/common/entry.s3.c
index 5706e113..9788c3df 100644
--- a/common/entry.s3.c
+++ b/common/entry.s3.c
@@ -27,8 +27,7 @@
 void stage3_common(void);
 
 #if defined (UEFI)
-extern symbol __slide;
-extern symbol __image_size;
+extern symbol __slide, __image_base, __image_end;
 extern symbol _start;
 
 noreturn void uefi_entry(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable) {
@@ -43,9 +42,10 @@ noreturn void uefi_entry(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable)
 
 #if defined (__x86_64__)
     if ((uintptr_t)__slide >= 0x100000000) {
-        size_t image_size_pages = ALIGN_UP((size_t)__image_size, 4096) / 4096;
+        size_t image_size = ALIGN_UP((uintptr_t)__image_end - (uintptr_t)__image_base, 4096);
+        size_t image_size_pages = ALIGN_UP((size_t)image_size, 4096) / 4096;
         size_t new_base;
-        for (new_base = 0x1000; new_base + (size_t)__image_size < 0x100000000; new_base += 0x1000) {
+        for (new_base = 0x1000; new_base + (size_t)image_size < 0x100000000; new_base += 0x1000) {
             EFI_PHYSICAL_ADDRESS _new_base = (EFI_PHYSICAL_ADDRESS)new_base;
             status = gBS->AllocatePages(AllocateAddress, EfiLoaderCode, image_size_pages, &_new_base);
             if (status == 0) {
@@ -55,7 +55,7 @@ noreturn void uefi_entry(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable)
         deferred_error = "Limine does not support being loaded above 4GiB and no alternative loading spot found";
         goto defer_error;
 new_base_gotten:
-        memcpy((void *)new_base, __slide, (size_t)__image_size);
+        memcpy((void *)new_base, __slide, (size_t)image_size);
         __attribute__((ms_abi))
         void (*new_entry_point)(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable);
         new_entry_point = (void *)(new_base + ((uintptr_t)_start - (uintptr_t)__slide));
diff --git a/common/mm/pmm.s2.c b/common/mm/pmm.s2.c
index 5c7d2164..3899c7ca 100644
--- a/common/mm/pmm.s2.c
+++ b/common/mm/pmm.s2.c
@@ -288,8 +288,7 @@ void init_memmap(void) {
 #if defined (UEFI)
 static struct memmap_entry *recl;
 
-extern symbol __slide;
-extern symbol __image_size;
+extern symbol __slide, __image_base, __image_end;
 
 void init_memmap(void) {
     EFI_STATUS status;
@@ -410,7 +409,9 @@ void init_memmap(void) {
     sanitiser_keep_first_page = old_skfp;
 
     // Allocate bootloader itself
-    memmap_alloc_range((uintptr_t)__slide, (uintptr_t)__image_size,
+    size_t image_size = ALIGN_UP((uintptr_t)__image_end - (uintptr_t)__image_base, 4096);
+
+    memmap_alloc_range((uintptr_t)__slide, (uintptr_t)image_size,
                        MEMMAP_BOOTLOADER_RECLAIMABLE, 0, true, false, true);
 
     sanitise_entries(memmap, &memmap_entries, false);
tab: 248 wrap: offon