The i386-pc kernel image fails to build because of changes made to
address ld.lld-21 and newer linking issues. Specifically, with
ld.lld-21, if you try to set the text section address below image base
address when linking a non-relocatable binary, ld.lld wil fail to link.

Switching to using a customized linker script solves the issue.

Signed-off-by: Nicholas Vinson <[email protected]>
---
 conf/Makefile.extra-dist    |  1 +
 conf/i386-pc-kernel.ld      | 38 +++++++++++++++++++++++++++++++++++
 grub-core/Makefile.core.def | 40 +++++++++++++++++++++++++++----------
 3 files changed, 69 insertions(+), 10 deletions(-)
 create mode 100644 conf/i386-pc-kernel.ld

diff --git a/conf/Makefile.extra-dist b/conf/Makefile.extra-dist
index d22b6c862..fd904cd33 100644
--- a/conf/Makefile.extra-dist
+++ b/conf/Makefile.extra-dist
@@ -17,6 +17,7 @@ EXTRA_DIST += docs/grub.cfg
 EXTRA_DIST += docs/osdetect.cfg
 
 EXTRA_DIST += conf/i386-cygwin-img-ld.sc
+EXTRA_DIST += conf/i386-pc-kernel.ld
 
 EXTRA_DIST += grub-core/Makefile.core.def
 EXTRA_DIST += grub-core/Makefile.gcry.def
diff --git a/conf/i386-pc-kernel.ld b/conf/i386-pc-kernel.ld
new file mode 100644
index 000000000..80d5734b3
--- /dev/null
+++ b/conf/i386-pc-kernel.ld
@@ -0,0 +1,38 @@
+ENTRY(_start)
+
+PHDRS {
+    text PT_LOAD FLAGS(7);
+}
+
+SECTIONS
+{
+    . = _grub_text_base;
+    .text : {
+        _start = .;
+        *(.text .text.*)
+    } :text
+    .rodata : {
+        *(.rodata .rodata.*)
+    } :text
+    .module_license : {
+        *(.module_license)
+    } :text
+    .data : {
+        *(.data .data.*)
+        . = ALIGN(0x10);
+        _edata = .;
+    } :text
+    .bss : {
+        __bss_start = .;
+        *(.bss .bss.*)
+        *(COMMON)
+        . = ALIGN(0x10);
+        _end = .;
+    } :text
+    /DISCARD/ : {
+        *(.interp)
+        *(.note*)
+        *(.comment)
+        *(.build-id)
+    }
+}
diff --git a/grub-core/Makefile.core.def b/grub-core/Makefile.core.def
index 0cf155128..7cc7963c7 100644
--- a/grub-core/Makefile.core.def
+++ b/grub-core/Makefile.core.def
@@ -82,7 +82,8 @@ kernel = {
   riscv64_efi_stripflags   = '--strip-unneeded -K start -R .note -R .comment 
-R .note.gnu.gold-version -R .eh_frame';
 
   i386_pc_ldflags          = '$(TARGET_IMG_LDFLAGS)';
-  i386_pc_ldflags          = '$(TARGET_IMG_BASE_LDOPT),0x9000';
+  i386_pc_ldflags          = '-Wl,-T$(top_srcdir)/conf/i386-pc-kernel.ld';
+  i386_pc_ldflags          = '$(TARGET_IMG_BASE_LDOPT)=0x9000';
   i386_qemu_ldflags        = '$(TARGET_IMG_LDFLAGS)';
   i386_qemu_ldflags        = '$(TARGET_IMG_BASE_LDOPT),0x9000';
   i386_coreboot_ldflags    = '$(TARGET_IMG_LDFLAGS)';
@@ -449,8 +450,11 @@ image = {
   i386_qemu = boot/i386/qemu/boot.S;
   sparc64_ieee1275 = boot/sparc64/ieee1275/boot.S;
 
+  i386_pc_extra_dist = '$(top_srcdir)/conf/i386-pc-kernel.ld';
+
   i386_pc_ldflags = '$(TARGET_IMG_LDFLAGS)';
-  i386_pc_ldflags = '$(TARGET_IMG_BASE_LDOPT),0x7C00';
+  i386_pc_ldflags = '-Wl,-T$(top_srcdir)/conf/i386-pc-kernel.ld';
+  i386_pc_ldflags = '$(TARGET_IMG_BASE_LDOPT)=0x7C00';
 
   i386_qemu_ldflags = '$(TARGET_IMG_LDFLAGS)';
   i386_qemu_ldflags = 
'$(TARGET_IMG_BASE_LDOPT),$(GRUB_BOOT_MACHINE_LINK_ADDR)';
@@ -475,10 +479,13 @@ image = {
   name = boot_hybrid;
   i386_pc = boot/i386/pc/boot.S;
 
+  i386_pc_extra_dist = '$(top_srcdir)/conf/i386-pc-kernel.ld';
+
   cppflags = '-DHYBRID_BOOT=1';
   
   i386_pc_ldflags = '$(TARGET_IMG_LDFLAGS)';
-  i386_pc_ldflags = '$(TARGET_IMG_BASE_LDOPT),0x7C00';
+  i386_pc_ldflags = '-Wl,-T$(top_srcdir)/conf/i386-pc-kernel.ld';
+  i386_pc_ldflags = '$(TARGET_IMG_BASE_LDOPT)=0x7C00';
 
   objcopyflags = '-O binary';
   enable = i386_pc;
@@ -486,10 +493,13 @@ image = {
 
 image = {
   name = cdboot;
-
   i386_pc = boot/i386/pc/cdboot.S;
+
+  i386_pc_extra_dist = '$(top_srcdir)/conf/i386-pc-kernel.ld';
+
   i386_pc_ldflags = '$(TARGET_IMG_LDFLAGS)';
-  i386_pc_ldflags = '$(TARGET_IMG_BASE_LDOPT),0x7C00';
+  i386_pc_ldflags = '-Wl,-T$(top_srcdir)/conf/i386-pc-kernel.ld';
+  i386_pc_ldflags = '$(TARGET_IMG_BASE_LDOPT)=0x7C00';
 
   sparc64_ieee1275 = boot/sparc64/ieee1275/boot.S;
 
@@ -508,8 +518,11 @@ image = {
   name = pxeboot;
   i386_pc = boot/i386/pc/pxeboot.S;
 
+  i386_pc_extra_dist = '$(top_srcdir)/conf/i386-pc-kernel.ld';
+
   i386_pc_ldflags = '$(TARGET_IMG_LDFLAGS)';
-  i386_pc_ldflags = '$(TARGET_IMG_BASE_LDOPT),0x7C00';
+  i386_pc_ldflags = '-Wl,-T$(top_srcdir)/conf/i386-pc-kernel.ld';
+  i386_pc_ldflags = '$(TARGET_IMG_BASE_LDOPT)=0x7C00';
 
   objcopyflags = '-O binary';
   enable = i386_pc;
@@ -519,8 +532,11 @@ image = {
   name = diskboot;
   i386_pc = boot/i386/pc/diskboot.S;
 
+  i386_pc_extra_dist = '$(top_srcdir)/conf/i386-pc-kernel.ld';
+
   i386_pc_ldflags = '$(TARGET_IMG_LDFLAGS)';
-  i386_pc_ldflags = '$(TARGET_IMG_BASE_LDOPT),0x8000';
+  i386_pc_ldflags = '-Wl,-T$(top_srcdir)/conf/i386-pc-kernel.ld';
+  i386_pc_ldflags = '$(TARGET_IMG_BASE_LDOPT)=0x8000';
 
   sparc64_ieee1275 = boot/sparc64/ieee1275/diskboot.S;
   sparc64_ieee1275_ldflags = '-Wl,-Ttext=0x4200';
@@ -535,8 +551,11 @@ image = {
   name = lnxboot;
   i386_pc = boot/i386/pc/lnxboot.S;
 
+  i386_pc_extra_dist = '$(top_srcdir)/conf/i386-pc-kernel.ld';
+
   i386_pc_ldflags = '$(TARGET_IMG_LDFLAGS)';
-  i386_pc_ldflags = '$(TARGET_IMG_BASE_LDOPT),0x6000';
+  i386_pc_ldflags = '-Wl,-T$(top_srcdir)/conf/i386-pc-kernel.ld';
+  i386_pc_ldflags = '$(TARGET_IMG_BASE_LDOPT)=0x6000';
 
   objcopyflags = '-O binary';
   enable = i386_pc;
@@ -576,10 +595,11 @@ image = {
   name = lzma_decompress;
   i386_pc = boot/i386/pc/startup_raw.S;
   i386_pc_nodist = rs_decoder.h;
+  i386_pc_extra_dist = '$(top_srcdir)/conf/i386-pc-kernel.ld';
 
   objcopyflags = '-O binary';
-  ldflags = '$(TARGET_IMG_LDFLAGS) $(TARGET_IMG_BASE_LDOPT),0x8200';
-  enable = i386_pc;
+  ldflags = '$(TARGET_IMG_LDFLAGS) -Wl,-T$(top_srcdir)/conf/i386-pc-kernel.ld 
$(TARGET_IMG_BASE_LDOPT)=0x8200';
+  lnable = i386_pc;
 };
 
 image = {
-- 
2.52.0


_______________________________________________
Grub-devel mailing list
[email protected]
https://lists.gnu.org/mailman/listinfo/grub-devel

Reply via email to