:: commit 86c1dfbb76078d57d51b80104669cc0f7ae50ef7

mintsuki <mintsuki@protonmail.com> — 2022-02-02 17:18

parents: 2c52277d54

build: Unify and preprocess linker scripts

diff --git a/configure.ac b/configure.ac
index 680101b3..583345bd 100644
--- a/configure.ac
+++ b/configure.ac
@@ -103,19 +103,19 @@ AC_DEFUN([GET_BINUTILS_PROG], [
 
     if ! test "x$LIMINE_$1" = "x"; then
         AC_CHECK_PROG([LIMINE_$1_0], [$LIMINE_$1], [yes])
-        if ! test "x$LIMINE_$1_0" = "xyes" || ! $LIMINE_$1 --version | grep 'GNU Binutils' >/dev/null 2>&1; then
+        if ! test "x$LIMINE_$1_0" = "xyes" || ! $LIMINE_$1 --version | grep 'Free Software Foundation' >/dev/null 2>&1; then
             AC_MSG_ERROR([LIMINE_$1 ($LIMINE_$1) is not a suitable $3])
         fi
     else
         LIMINE_$1="$TOOLCHAIN-$2"
         AC_CHECK_PROG([LIMINE_$1_1], [$LIMINE_$1], [yes])
-        if ! test "x$LIMINE_$1_1" = "xyes" || ! $LIMINE_$1 --version | grep 'GNU Binutils' >/dev/null 2>&1; then
+        if ! test "x$LIMINE_$1_1" = "xyes" || ! $LIMINE_$1 --version | grep 'Free Software Foundation' >/dev/null 2>&1; then
             LIMINE_$1='g$2'
             AC_CHECK_PROG([LIMINE_$1_2], [$LIMINE_$1], [yes])
-            if ! test "x$LIMINE_$1_2" = "xyes" || ! $LIMINE_$1 --version | grep 'GNU Binutils' >/dev/null 2>&1; then
+            if ! test "x$LIMINE_$1_2" = "xyes" || ! $LIMINE_$1 --version | grep 'Free Software Foundation' >/dev/null 2>&1; then
                 LIMINE_$1='$2'
                 AC_CHECK_PROG([LIMINE_$1_3], [$LIMINE_$1], [yes])
-                if ! test "x$LIMINE_$1_3" = "xyes" || ! $LIMINE_$1 --version | grep 'GNU Binutils' >/dev/null 2>&1; then
+                if ! test "x$LIMINE_$1_3" = "xyes" || ! $LIMINE_$1 --version | grep 'Free Software Foundation' >/dev/null 2>&1; then
                     AC_MSG_ERROR([no suitable LIMINE_$1 found, run $srcdir/make_toolchain.sh or install GNU binutils])
                 fi
             fi
diff --git a/stage23/GNUmakefile b/stage23/GNUmakefile
index 89fef8c7..8d906ba4 100644
--- a/stage23/GNUmakefile
+++ b/stage23/GNUmakefile
@@ -226,26 +226,46 @@ $(call MKESCAPE,$(BUILDDIR))/full.map.o: $(call MKESCAPE,$(BUILDDIR))/limine_nom
 $(call MKESCAPE,$(BUILDDIR))/limine.sys: $(call MKESCAPE,$(BUILDDIR))/limine.elf
 	$(LIMINE_OBJCOPY) -O binary '$(call SHESCAPE,$<)' '$(call SHESCAPE,$@)'
 
+$(call MKESCAPE,$(BUILDDIR))/linker_stage2only.ld: linker_bios.ld.in
+	mkdir -p '$(call SHESCAPE,$(BUILDDIR))'
+	$(LIMINE_CC) -x c -E -P -DLINKER_STAGE2ONLY linker_bios.ld.in -o '$(call SHESCAPE,$(BUILDDIR))/linker_stage2only.ld'
+
 $(call MKESCAPE,$(BUILDDIR))/limine_stage2only.elf: $(OBJ)
-	$(LIMINE_LD) '$(call OBJESCAPE,$^)' $(LIMINE_LDFLAGS) $(INTERNAL_LDFLAGS) -Tlinker_stage2only.ld -o '$(call SHESCAPE,$@)' || \
+	$(MAKE) '$(call SHESCAPE,$(BUILDDIR))/linker_stage2only.ld'
+	$(LIMINE_LD) '$(call OBJESCAPE,$^)' $(LIMINE_LDFLAGS) $(INTERNAL_LDFLAGS) -T'$(call SHESCAPE,$(BUILDDIR))/linker_stage2only.ld' -o '$(call SHESCAPE,$@)' || \
 		( echo "This error may mean that stage 2 was trying to use stage 3 symbols before loading stage 3" && \
 		  false )
 
+$(call MKESCAPE,$(BUILDDIR))/linker_nomap.ld: linker_bios.ld.in
+	mkdir -p '$(call SHESCAPE,$(BUILDDIR))'
+	$(LIMINE_CC) -x c -E -P -DLINKER_NOMAP linker_bios.ld.in -o '$(call SHESCAPE,$(BUILDDIR))/linker_nomap.ld'
+
 $(call MKESCAPE,$(BUILDDIR))/limine_nomap.elf: $(OBJ) $(call MKESCAPE,$(BUILDDIR))/tinf/tinfgzip.o $(call MKESCAPE,$(BUILDDIR))/tinf/tinflate.o $(call MKESCAPE,$(BUILDDIR))/font.o $(call MKESCAPE,$(BUILDDIR))/sys/smp_trampoline.o $(call MKESCAPE,$(BUILDDIR))/stage2.map.o
-	$(LIMINE_LD) '$(call OBJESCAPE,$^)' $(LIMINE_LDFLAGS) $(INTERNAL_LDFLAGS) -Tlinker_nomap.ld -o '$(call SHESCAPE,$@)'
+	$(MAKE) '$(call SHESCAPE,$(BUILDDIR))/linker_nomap.ld'
+	$(LIMINE_LD) '$(call OBJESCAPE,$^)' $(LIMINE_LDFLAGS) $(INTERNAL_LDFLAGS) -T'$(call SHESCAPE,$(BUILDDIR))/linker_nomap.ld' -o '$(call SHESCAPE,$@)'
+
+$(call MKESCAPE,$(BUILDDIR))/linker.ld: linker_bios.ld.in
+	mkdir -p '$(call SHESCAPE,$(BUILDDIR))'
+	$(LIMINE_CC) -x c -E -P linker_bios.ld.in -o '$(call SHESCAPE,$(BUILDDIR))/linker.ld'
 
 $(call MKESCAPE,$(BUILDDIR))/limine.elf: $(OBJ) $(call MKESCAPE,$(BUILDDIR))/tinf/tinfgzip.o $(call MKESCAPE,$(BUILDDIR))/tinf/tinflate.o $(call MKESCAPE,$(BUILDDIR))/font.o $(call MKESCAPE,$(BUILDDIR))/sys/smp_trampoline.o $(call MKESCAPE,$(BUILDDIR))/stage2.map.o $(call MKESCAPE,$(BUILDDIR))/full.map.o
-	$(LIMINE_LD) '$(call OBJESCAPE,$^)' $(LIMINE_LDFLAGS) $(INTERNAL_LDFLAGS) -Tlinker.ld -o '$(call SHESCAPE,$@)'
+	$(MAKE) '$(call SHESCAPE,$(BUILDDIR))/linker.ld'
+	$(LIMINE_LD) '$(call OBJESCAPE,$^)' $(LIMINE_LDFLAGS) $(INTERNAL_LDFLAGS) -T'$(call SHESCAPE,$(BUILDDIR))/linker.ld' -o '$(call SHESCAPE,$@)'
 	$(LIMINE_OBJCOPY) -O binary --only-section=.note.gnu.build-id '$(call SHESCAPE,$@)' '$(call SHESCAPE,$(BUILDDIR))/build-id.s2.bin'
 	cd '$(call SHESCAPE,$(BUILDDIR))' && \
 		$(LIMINE_OBJCOPY) -B i8086 -I binary -O $(OBJCOPY_ARCH) build-id.s2.bin build-id.s2.o
 	$(LIMINE_OBJCOPY) -O binary --only-section=.note.gnu.build-id '$(call SHESCAPE,$@)' '$(call SHESCAPE,$(BUILDDIR))/build-id.s3.bin'
 	cd '$(call SHESCAPE,$(BUILDDIR))' && \
 		$(LIMINE_OBJCOPY) -B i8086 -I binary -O $(OBJCOPY_ARCH) build-id.s3.bin build-id.s3.o
-	$(LIMINE_LD) '$(call SHESCAPE,$(BUILDDIR))/build-id.s2.o' '$(call SHESCAPE,$(BUILDDIR))/build-id.s3.o' '$(call OBJESCAPE,$^)' $(LIMINE_LDFLAGS) $(INTERNAL_LDFLAGS) -Tlinker.ld -o '$(call SHESCAPE,$@)'
+	$(LIMINE_LD) '$(call SHESCAPE,$(BUILDDIR))/build-id.s2.o' '$(call SHESCAPE,$(BUILDDIR))/build-id.s3.o' '$(call OBJESCAPE,$^)' $(LIMINE_LDFLAGS) $(INTERNAL_LDFLAGS) -T'$(call SHESCAPE,$(BUILDDIR))/linker.ld' -o '$(call SHESCAPE,$@)'
+
+$(call MKESCAPE,$(BUILDDIR))/linker_dbg.ld: linker_bios.ld.in
+	mkdir -p '$(call SHESCAPE,$(BUILDDIR))'
+	$(LIMINE_CC) -x c -E -P -DLINKER_DBG linker_bios.ld.in -o '$(call SHESCAPE,$(BUILDDIR))/linker_dbg.ld'
 
 $(call MKESCAPE,$(BUILDDIR))/limine_dbg.elf: $(OBJ) $(call MKESCAPE,$(BUILDDIR))/tinf/tinfgzip.o $(call MKESCAPE,$(BUILDDIR))/tinf/tinflate.o $(call MKESCAPE,$(BUILDDIR))/font.o $(call MKESCAPE,$(BUILDDIR))/sys/smp_trampoline.o $(call MKESCAPE,$(BUILDDIR))/stage2.map.o $(call MKESCAPE,$(BUILDDIR))/full.map.o
-	$(LIMINE_LD) '$(call OBJESCAPE,$^)' $(LIMINE_LDFLAGS) $(INTERNAL_LDFLAGS) -Tlinker_dbg.ld -o '$(call SHESCAPE,$@)'
+	$(MAKE) '$(call SHESCAPE,$(BUILDDIR))/linker_dbg.ld'
+	$(LIMINE_LD) '$(call OBJESCAPE,$^)' $(LIMINE_LDFLAGS) $(INTERNAL_LDFLAGS) -T'$(call SHESCAPE,$(BUILDDIR))/linker_dbg.ld' -o '$(call SHESCAPE,$@)'
 
 endif
 
@@ -276,14 +296,24 @@ reduced-gnu-efi: $(call MKESCAPE,$(BUILDDIR))/reduced-gnu-efi
 		OBJCOPY="$(LIMINE_OBJCOPY)" \
 		ARCH=x86_64
 
+$(call MKESCAPE,$(BUILDDIR))/linker_nomap.ld: linker_uefi64.ld.in
+	mkdir -p '$(call SHESCAPE,$(BUILDDIR))'
+	$(LIMINE_CC) -x c -E -P -DLINKER_NOMAP linker_uefi64.ld.in -o '$(call SHESCAPE,$(BUILDDIR))/linker_nomap.ld'
+
 $(call MKESCAPE,$(BUILDDIR))/limine_efi_nomap.elf: $(call MKESCAPE,$(BUILDDIR))/reduced-gnu-efi/gnuefi/crt0-efi-x86_64.o $(call MKESCAPE,$(BUILDDIR))/reduced-gnu-efi/gnuefi/libgnuefi.a $(OBJ) $(call MKESCAPE,$(BUILDDIR))/tinf/tinfgzip.o $(call MKESCAPE,$(BUILDDIR))/tinf/tinflate.o $(call MKESCAPE,$(BUILDDIR))/font.o $(call MKESCAPE,$(BUILDDIR))/sys/smp_trampoline.o
+	$(MAKE) '$(call SHESCAPE,$(BUILDDIR))/linker_nomap.ld'
 	$(LIMINE_LD) \
-		-Tlinker_uefi_nomap.ld \
+		-T'$(call SHESCAPE,$(BUILDDIR))/linker_nomap.ld' \
 		'$(call OBJESCAPE,$^)' $(LIMINE_LDFLAGS) $(INTERNAL_LDFLAGS) -o '$(call SHESCAPE,$@)'
 
+$(call MKESCAPE,$(BUILDDIR))/linker.ld: linker_uefi64.ld.in
+	mkdir -p '$(call SHESCAPE,$(BUILDDIR))'
+	$(LIMINE_CC) -x c -E -P linker_uefi64.ld.in -o '$(call SHESCAPE,$(BUILDDIR))/linker.ld'
+
 $(call MKESCAPE,$(BUILDDIR))/limine_efi.elf: $(call MKESCAPE,$(BUILDDIR))/reduced-gnu-efi/gnuefi/crt0-efi-x86_64.o $(call MKESCAPE,$(BUILDDIR))/reduced-gnu-efi/gnuefi/libgnuefi.a $(OBJ) $(call MKESCAPE,$(BUILDDIR))/tinf/tinfgzip.o $(call MKESCAPE,$(BUILDDIR))/tinf/tinflate.o $(call MKESCAPE,$(BUILDDIR))/font.o $(call MKESCAPE,$(BUILDDIR))/sys/smp_trampoline.o $(call MKESCAPE,$(BUILDDIR))/full.map.o
+	$(MAKE) '$(call SHESCAPE,$(BUILDDIR))/linker.ld'
 	$(LIMINE_LD) \
-		-Tlinker_uefi.ld \
+		-T'$(call SHESCAPE,$(BUILDDIR))/linker.ld' \
 		'$(call OBJESCAPE,$^)' $(LIMINE_LDFLAGS) $(INTERNAL_LDFLAGS) -o '$(call SHESCAPE,$@)'
 
 endif
@@ -311,14 +341,24 @@ reduced-gnu-efi: $(call MKESCAPE,$(BUILDDIR))/reduced-gnu-efi
 		OBJCOPY="$(LIMINE_OBJCOPY)" \
 		ARCH=ia32
 
+$(call MKESCAPE,$(BUILDDIR))/linker_nomap.ld: linker_uefi32.ld.in
+	mkdir -p '$(call SHESCAPE,$(BUILDDIR))'
+	$(LIMINE_CC) -x c -E -P -DLINKER_NOMAP linker_uefi32.ld.in -o '$(call SHESCAPE,$(BUILDDIR))/linker_nomap.ld'
+
 $(call MKESCAPE,$(BUILDDIR))/limine_efi_nomap.elf: $(call MKESCAPE,$(BUILDDIR))/reduced-gnu-efi/gnuefi/crt0-efi-ia32.o $(call MKESCAPE,$(BUILDDIR))/reduced-gnu-efi/gnuefi/libgnuefi.a $(OBJ) $(call MKESCAPE,$(BUILDDIR))/tinf/tinfgzip.o $(call MKESCAPE,$(BUILDDIR))/tinf/tinflate.o $(call MKESCAPE,$(BUILDDIR))/font.o $(call MKESCAPE,$(BUILDDIR))/sys/smp_trampoline.o
+	$(MAKE) '$(call SHESCAPE,$(BUILDDIR))/linker_nomap.ld'
 	$(LIMINE_LD) \
-		-Tlinker_uefi32_nomap.ld \
+		-T'$(call SHESCAPE,$(BUILDDIR))/linker_nomap.ld' \
 		'$(call OBJESCAPE,$^)' $(LIMINE_LDFLAGS) $(INTERNAL_LDFLAGS) -o '$(call SHESCAPE,$@)'
 
+$(call MKESCAPE,$(BUILDDIR))/linker.ld: linker_uefi32.ld.in
+	mkdir -p '$(call SHESCAPE,$(BUILDDIR))'
+	$(LIMINE_CC) -x c -E -P linker_uefi32.ld.in -o '$(call SHESCAPE,$(BUILDDIR))/linker.ld'
+
 $(call MKESCAPE,$(BUILDDIR))/limine_efi.elf: $(call MKESCAPE,$(BUILDDIR))/reduced-gnu-efi/gnuefi/crt0-efi-ia32.o $(call MKESCAPE,$(BUILDDIR))/reduced-gnu-efi/gnuefi/libgnuefi.a $(OBJ) $(call MKESCAPE,$(BUILDDIR))/tinf/tinfgzip.o $(call MKESCAPE,$(BUILDDIR))/tinf/tinflate.o $(call MKESCAPE,$(BUILDDIR))/font.o $(call MKESCAPE,$(BUILDDIR))/sys/smp_trampoline.o $(call MKESCAPE,$(BUILDDIR))/full.map.o
+	$(MAKE) '$(call SHESCAPE,$(BUILDDIR))/linker.ld'
 	$(LIMINE_LD) \
-		-Tlinker_uefi32.ld \
+		-T'$(call SHESCAPE,$(BUILDDIR))/linker.ld' \
 		'$(call OBJESCAPE,$^)' $(LIMINE_LDFLAGS) $(INTERNAL_LDFLAGS) -o '$(call SHESCAPE,$@)'
 
 endif
diff --git a/stage23/linker.ld b/stage23/linker.ld
deleted file mode 100644
index 13cdb61e..00000000
--- a/stage23/linker.ld
+++ /dev/null
@@ -1,81 +0,0 @@
-OUTPUT_FORMAT(elf32-i386)
-OUTPUT_ARCH(i386)
-ENTRY(_start)
-
-SECTIONS
-{
-    . = 0x8000;
-
-    .entry : {
-        *(.entry)
-    }
-
-    .realmode : {
-        *(.realmode)
-    }
-
-    .stage2.text : {
-        *.s2.o(.text .text.*)
-    }
-
-    .stage2.build-id : {
-        build_id_s2 = .;
-        *build-id.s2.o(*)
-    }
-
-    .stage2.data : {
-        *.s2.o(.no_unwind)
-        s2_data_begin = .;
-        *.s2.o(.data .data.*)
-        s2_data_end = .;
-        *.s2.o(.rodata .rodata.*)
-        *(.stage2_map)
-    }
-
-    .stage3.text : {
-        stage3_addr = .;
-        *(.text .text.*)
-    }
-
-    .stage3.build-id : {
-        build_id_s3 = .;
-        *build-id.s3.o(*)
-    }
-
-    .stage3.data : {
-        *(.rodata .rodata.*)
-        *(.full_map)
-        *(.no_unwind)
-        data_begin = .;
-        *(.data .data.*)
-    }
-
-    .note.gnu.build-id : {
-        *(.note.gnu.build-id)
-        limine_sys_size = . - 0x8000;
-    }
-
-    .bss : {
-        bss_begin = .;
-        *(COMMON)
-        *(.bss .bss.*)
-        bss_end = .;
-        data_end = .;
-    }
-
-    .symtab 0 : {
-        *(.symtab)
-    }
-
-    .strtab 0 : {
-        *(.strtab)
-    }
-
-    .shstrtab 0 : {
-        *(.shstrtab)
-    }
-
-    /DISCARD/ : {
-        *(*)
-    }
-}
diff --git a/stage23/linker_dbg.ld b/stage23/linker_bios.ld.in
similarity index 79%
rename from stage23/linker_dbg.ld
rename to stage23/linker_bios.ld.in
index fc34d273..6e37e09a 100644
--- a/stage23/linker_dbg.ld
+++ b/stage23/linker_bios.ld.in
@@ -29,9 +29,26 @@ SECTIONS
         *.s2.o(.data .data.*)
         s2_data_end = .;
         *.s2.o(.rodata .rodata.*)
+#ifdef LINKER_STAGE2ONLY
+        /* stage2 missing symbols overrides */
+        stage2_map = .;
+        stage3_common = .;
+        build_id_s3 = .;
+        full_map = .;
+        getchar_internal = .;
+        getchar = .;
+        menu = .;
+        term_write = .;
+        term_textmode = .;
+        term_fallback = .;
+        stage3_addr = .;
+        data_begin = .;
+#else
         *(.stage2_map)
+#endif
     }
 
+#ifndef LINKER_STAGE2ONLY
     .stage3.text : {
         stage3_addr = .;
         *(.text .text.*)
@@ -44,11 +61,16 @@ SECTIONS
 
     .stage3.data : {
         *(.rodata .rodata.*)
+#ifdef LINKER_NOMAP
+        full_map = .;
+#else
         *(.full_map)
+#endif
         *(.no_unwind)
         data_begin = .;
         *(.data .data.*)
     }
+#endif
 
     .note.gnu.build-id : {
         *(.note.gnu.build-id)
@@ -75,6 +97,7 @@ SECTIONS
         *(.shstrtab)
     }
 
+#ifdef LINKER_DBG
     .debug_aranges 0 : {
         *(.debug_aranges)
     }
@@ -122,6 +145,7 @@ SECTIONS
     .debug_line_str 0 : {
         *(.debug_line_str)
     }
+#endif
 
     /DISCARD/ : {
         *(*)
diff --git a/stage23/linker_nomap.ld b/stage23/linker_nomap.ld
deleted file mode 100644
index 1b170d70..00000000
--- a/stage23/linker_nomap.ld
+++ /dev/null
@@ -1,81 +0,0 @@
-OUTPUT_FORMAT(elf32-i386)
-OUTPUT_ARCH(i386)
-ENTRY(_start)
-
-SECTIONS
-{
-    . = 0x8000;
-
-    .entry : {
-        *(.entry)
-    }
-
-    .realmode : {
-        *(.realmode)
-    }
-
-    .stage2.text : {
-        *.s2.o(.text .text.*)
-    }
-
-    .stage2.build-id : {
-        build_id_s2 = .;
-        *build-id.s2.o(*)
-    }
-
-    .stage2.data : {
-        *.s2.o(.no_unwind)
-        s2_data_begin = .;
-        *.s2.o(.data .data.*)
-        s2_data_end = .;
-        *.s2.o(.rodata .rodata.*)
-        *(.stage2_map)
-    }
-
-    .stage3.text : {
-        stage3_addr = .;
-        *(.text .text.*)
-    }
-
-    .stage3.build-id : {
-        build_id_s3 = .;
-        *build-id.s3.o(*)
-    }
-
-    .stage3.data : {
-        *(.rodata .rodata.*)
-        full_map = .;
-        *(.no_unwind)
-        data_begin = .;
-        *(.data .data.*)
-    }
-
-    .note.gnu.build-id : {
-        *(.note.gnu.build-id)
-        limine_sys_size = . - 0x8000;
-    }
-
-    .bss : {
-        bss_begin = .;
-        *(COMMON)
-        *(.bss .bss.*)
-        bss_end = .;
-        data_end = .;
-    }
-
-    .symtab 0 : {
-        *(.symtab)
-    }
-
-    .strtab 0 : {
-        *(.strtab)
-    }
-
-    .shstrtab 0 : {
-        *(.shstrtab)
-    }
-
-    /DISCARD/ : {
-        *(*)
-    }
-}
diff --git a/stage23/linker_stage2only.ld b/stage23/linker_stage2only.ld
deleted file mode 100644
index 7ec516e5..00000000
--- a/stage23/linker_stage2only.ld
+++ /dev/null
@@ -1,74 +0,0 @@
-OUTPUT_FORMAT(elf32-i386)
-OUTPUT_ARCH(i386)
-ENTRY(_start)
-
-SECTIONS
-{
-    . = 0x8000;
-
-    .entry : {
-        *(.entry)
-    }
-
-    .realmode : {
-        *(.realmode)
-    }
-
-    .stage2.text : {
-        *.s2.o(.text .text.*)
-    }
-
-    .stage2.build-id : {
-        build_id_s2 = .;
-        *build-id.s2.o(*)
-    }
-
-    .stage2.data : {
-        *.s2.o(.no_unwind)
-        s2_data_begin = .;
-        *.s2.o(.data .data.*)
-        s2_data_end = .;
-        *.s2.o(.rodata .rodata.*)
-        stage2_map = .;
-        stage3_common = .;
-        build_id_s3 = .;
-        full_map = .;
-        getchar_internal = .;
-        getchar = .;
-        menu = .;
-        term_write = .;
-        term_textmode = .;
-        term_fallback = .;
-        stage3_addr = .;
-        data_begin = .;
-    }
-
-    .note.gnu.build-id : {
-        *(.note.gnu.build-id)
-        limine_sys_size = . - 0x8000;
-    }
-
-    .bss : {
-        bss_begin = .;
-        *(COMMON)
-        *(.bss .bss.*)
-        bss_end = .;
-        data_end = .;
-    }
-
-    .symtab 0 : {
-        *(.symtab)
-    }
-
-    .strtab 0 : {
-        *(.strtab)
-    }
-
-    .shstrtab 0 : {
-        *(.shstrtab)
-    }
-
-    /DISCARD/ : {
-        *(*)
-    }
-}
diff --git a/stage23/linker_uefi.ld b/stage23/linker_uefi.ld
deleted file mode 100644
index 3035ec20..00000000
--- a/stage23/linker_uefi.ld
+++ /dev/null
@@ -1,92 +0,0 @@
-/* The following code originates from gnu-efi */
-
-OUTPUT_FORMAT("elf64-x86-64", "elf64-x86-64", "elf64-x86-64")
-OUTPUT_ARCH(i386:x86-64)
-ENTRY(_start)
-SECTIONS
-{
-  . = 0;
-  ImageBase = .;
-  /* .hash and/or .gnu.hash MUST come first! */
-  .hash : { *(.hash) }
-  .gnu.hash : { *(.gnu.hash) }
-  . = ALIGN(4096);
-  .eh_frame :
-  {
-    *(.eh_frame)
-  }
-  . = ALIGN(4096);
-  .text :
-  {
-   _text = .;
-   *(.text)
-   *(.text.*)
-   *(.gnu.linkonce.t.*)
-   . = ALIGN(16);
-  }
-  _etext = .;
-  _text_size = . - _text;
-  . = ALIGN(4096);
-  .reloc :
-  {
-   *(.reloc)
-  }
-  . = ALIGN(4096);
-  .data :
-  {
-   _data = .;
-   *(.rodata*)
-   *(.got.plt)
-   *(.got)
-   *(.full_map)
-   *(.no_unwind)
-   data_begin = .;
-   *(.data*)
-   *(.sdata)
-   /* the EFI loader doesn't seem to like a .bss section, so we stick
-      it all into .data: */
-   *(.sbss)
-   *(.scommon)
-   *(.dynbss)
-   *(.bss)
-   *(COMMON)
-   data_end = .;
-   *(.rel.local)
-  }
-  .note.gnu.build-id : { *(.note.gnu.build-id) }
-
-  _edata = .;
-  _data_size = . - _etext;
-
-  . = ALIGN(4096);
-  .sbat :
-  {
-    _sbat = .;
-    *(.sbat)
-    *(.sbat.*)
-  }
-  _esbat = .;
-  _sbat_size = . - _sbat;
-
-  . = ALIGN(4096);
-  .dynamic  : { *(.dynamic) }
-  . = ALIGN(4096);
-  .rela :
-  {
-    *(.rela.data*)
-    *(.rela.got)
-    *(.rela.stab)
-  }
-  . = ALIGN(4096);
-  .dynsym   : { *(.dynsym) }
-  . = ALIGN(4096);
-  .dynstr   : { *(.dynstr) }
-  . = ALIGN(4096);
-  .ignored.reloc :
-  {
-    *(.rela.reloc)
-    *(.eh_frame)
-    *(.note.GNU-stack)
-  }
-  .comment 0 : { *(.comment) }
-}
diff --git a/stage23/linker_uefi32.ld b/stage23/linker_uefi32.ld
deleted file mode 100644
index c0a6f88d..00000000
--- a/stage23/linker_uefi32.ld
+++ /dev/null
@@ -1,103 +0,0 @@
-/* The following code originates from gnu-efi */
-
-OUTPUT_FORMAT("elf32-i386", "elf32-i386", "elf32-i386")
-OUTPUT_ARCH(i386)
-ENTRY(_start)
-SECTIONS
-{
-  . = 0;
-  ImageBase = .;
-  /* .hash and/or .gnu.hash MUST come first! */
-  .hash : { *(.hash) }
-  .gnu.hash : { *(.gnu.hash) }
-  . = ALIGN(4096);
-  .text :
-  {
-   _text = .;
-   *(.text)
-   *(.text.*)
-   *(.gnu.linkonce.t.*)
-   . = ALIGN(16);
-  }
-  _etext = .;
-  _text_size = . - _text;
-  . = ALIGN(4096);
-  .sdata :
-  {
-   _data = .;
-   *(.got.plt)
-   *(.got)
-   *(.srodata)
-   *(.sdata)
-   *(.sbss)
-   *(.scommon)
-  }
-  . = ALIGN(4096);
-  .data :
-  {
-   *(.rodata*)
-   *(.got.plt)
-   *(.got)
-   *(.full_map)
-   *(.no_unwind)
-   data_begin = .;
-   *(.data)
-   *(.data1)
-   *(.data.*)
-   *(.sdata)
-   /* the EFI loader doesn't seem to like a .bss section, so we stick
-      it all into .data: */
-   *(.sbss)
-   *(.scommon)
-   *(.dynbss)
-   *(.bss)
-   *(COMMON)
-   data_end = .;
-  }
-  .note.gnu.build-id : { *(.note.gnu.build-id) }
-
-  . = ALIGN(4096);
-  .dynamic  : { *(.dynamic) }
-  . = ALIGN(4096);
-  .rel :
-  {
-    *(.rel.data)
-    *(.rel.data.*)
-    *(.rel.got)
-    *(.rel.stab)
-    *(.data.rel.ro.local)
-    *(.data.rel.local)
-    *(.data.rel.ro)
-    *(.data.rel*)
-  }
-  _edata = .;
-  _data_size = . - _etext;
-
-  . = ALIGN(4096);
-  .sbat :
-  {
-    _sbat = .;
-    *(.sbat)
-    *(.sbat.*)
-  }
-  _esbat = .;
-  _sbat_size = . - _sbat;
-
-  . = ALIGN(4096);
-  .reloc :		/* This is the PECOFF .reloc section! */
-  {
-    *(.reloc)
-  }
-  . = ALIGN(4096);
-  .dynsym   : { *(.dynsym) }
-  . = ALIGN(4096);
-  .dynstr   : { *(.dynstr) }
-  . = ALIGN(4096);
-  /DISCARD/ :
-  {
-    *(.rel.reloc)
-    *(.eh_frame)
-    *(.note.GNU-stack)
-  }
-  .comment 0 : { *(.comment) }
-}
diff --git a/stage23/linker_uefi32_nomap.ld b/stage23/linker_uefi32.ld.in
similarity index 97%
rename from stage23/linker_uefi32_nomap.ld
rename to stage23/linker_uefi32.ld.in
index 4e7e6fed..9944b043 100644
--- a/stage23/linker_uefi32_nomap.ld
+++ b/stage23/linker_uefi32.ld.in
@@ -38,7 +38,11 @@ SECTIONS
    *(.rodata*)
    *(.got.plt)
    *(.got)
+#ifdef LINKER_NOMAP
    full_map = .;
+#else
+   *(.full_map)
+#endif
    *(.no_unwind)
    data_begin = .;
    *(.data)
diff --git a/stage23/linker_uefi_nomap.ld b/stage23/linker_uefi64.ld.in
similarity index 96%
rename from stage23/linker_uefi_nomap.ld
rename to stage23/linker_uefi64.ld.in
index 3b9fce5c..a2a10bad 100644
--- a/stage23/linker_uefi_nomap.ld
+++ b/stage23/linker_uefi64.ld.in
@@ -38,7 +38,11 @@ SECTIONS
    *(.rodata*)
    *(.got.plt)
    *(.got)
+#ifdef LINKER_NOMAP
    full_map = .;
+#else
+   *(.full_map)
+#endif
    *(.no_unwind)
    data_begin = .;
    *(.data*)
tab: 248 wrap: offon