Improve ld.lld-21+ compatibility when building i386-pc target
cover Improve ld.lld-21+ compatibility when building i386-pc target
Starting with ld.llvm-21, any attempt create a non-relocatable binary and set one more secton addresses below 0x400000 results in a linker error. Furthermore, the differences between ld.bfd and ld.lld made finding a proper set of command-line flags tht worked with both linkers and bypass the image base address restriction difficult. Therefore, the approach of using a custom linker script was adopted to solve the issue.
This approach was tested using:
../configure CC=clang CXX=clang++ LDFLAGS="-fuse-ld=lld" TARGET_LDFLAGS="-fuse-ld=lld" --with-platform=pc ../configure CC=clang CXX=clang++ --with-platform=pc (both with ld.lld as the default and ld.bfd as the default) ../configure CC=gcc CXX=g++ --with-platform=pc
and a VM was used for testing. To build the disk images the VM was booted with, the following scripts were used:
EFI disk:
efi_disk_image.sh new file +23 -0
@@ -0,0 +1,23 @@ +#!/bin/sh + +set -xe + +dd if=/dev/zero of=grub.img bs=1M count=100 status=progress + +sfdisk --force --no-reread --no-tell-kernel grub.img <<EOF +label: gpt +label-id: ABEB6772-65C7-4391-BF21-B616916286B9 +size=1M, type=21686148-6449-6E6F-744E-656564454649, uuid=9892A604-439E-4401-A372-AAD5E99EADBB +type=0FC63DAF-8483-4772-8E79-3D69D8477DE4, uuid=FCE5EBB3-C887-4FDE-93C5-7670CC3914BF +EOF + +LOOP_DEV=$(losetup --show -fP grub.img) +sleep 1 + +mkfs.ext4 -F "${LOOP_DEV}p2" + +mount "${LOOP_DEV}p2" /mnt/gentoo +./grub-install -v --directory ./grub-core --locale-directory /usr/share/locale --boot-directory=/mnt/gentoo "${LOOP_DEV}" + +umount "${LOOP_DEV}p2" +losetup -d "${LOOP_DEV}"
Signature · 55 lines
MBR image:
--- /dev/null 2026-01-18 13:24:44.262332704 -0500
+++ mbr_disk_image.sh 2026-01-25 11:17:24.129208591 -0500
@@ -0,0 +1,22 @@
+#!/bin/sh
+
+set -xe
+
+dd if=/dev/zero of=grub.img bs=1M count=100 status=progress
+
+sfdisk --force --no-reread --no-tell-kernel grub.img <<EOF
+label: dos
+label-id: 0x12345678
+type=83, bootable
+EOF
+
+LOOP_DEV=$(losetup --show -fP grub.img)
+sleep 1
+
+mkfs.ext4 -F -O ^has_journal "${LOOP_DEV}p1"
+
+mount "${LOOP_DEV}p1" /mnt/gentoo
+./grub-install -v --directory ./grub-core --locale-directory /usr/share/locale --boot-directory=/mnt/gentoo "${LOOP_DEV}"
+
+umount "${LOOP_DEV}p1"
+losetup -d "${LOOP_DEV}"
--
In all cases, the VM successfully booted to the standard GRUB prompt.
Nicholas Vinson (5):
i386/pc/int.h: conditionally apply regparm attr.
grub-core: Update kernel image generation
Revert "configure: Print a more helpful error if autoconf-archive is
not installed"
Revert "configure: Check linker for --image-base support"
configure: drop -Ttext checks for i386-pc
acinclude.m4 | 18 +++++++++++------
conf/Makefile.extra-dist | 1 +
conf/i386-pc-kernel.ld | 38 +++++++++++++++++++++++++++++++++++
configure.ac | 38 ++++++++++++++++++-----------------
grub-core/Makefile.core.def | 40 +++++++++++++++++++++++++++----------
include/grub/i386/pc/int.h | 5 ++++-
6 files changed, 105 insertions(+), 35 deletions(-)
create mode 100644 conf/i386-pc-kernel.ld
--
2.52.0
_______________________________________________
Grub-devel mailing list
[email protected]
https://lists.gnu.org/mailman/listinfo/grub-develPATCH 1/5 i386/pc/int.h: conditionally apply regparm attr.
Modern compilers are becoming more strict and are starting to warn when certain attributs are ignored. The regparam attribute is such an attribute.
Update the code so the regparam attribute is only appled when building against i386 targets as that is the only scenario when it is not ignored.
--- include/grub/i386/pc/int.h | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
include/grub/i386/pc/int.h +4 -1
@@ -24,7 +24,10 @@void EXPORT_FUNC (grub_bios_interrupt ) (grub_uint8_t intno, struct grub_bios_int_registers *regs) - __attribute__ ((regparm (3 ))); +#if defined(__i386__) && !defined(__x86_64__) + __attribute__ ((regparm(3))) +#endif +;#ifdef GRUB_MACHINE_PCBIOS extern struct grub_i386_idt *EXPORT_VAR (grub_realidt );
Signature · 7 lines
2.52.0 _______________________________________________ Grub-devel mailing list [email protected] https://lists.gnu.org/mailman/listinfo/grub-devel
Re: [PATCH 1/5] i386/pc/int.h: conditionally apply regparm attr.
Quoted 9 lines · Nicholas Vinson
Modern compilers are becoming more strict and are starting to warn when certain attributs are ignored. The regparam attribute is such an attribute.
Update the code so the regparam attribute is only appled when building against i386 targets as that is the only scenario when it is not ignored.
Signed-off-by Nicholas Vinson <[email protected]>
Daniel
_______________________________________________
Grub-devel mailing list
[email protected]
https://lists.gnu.org/mailman/listinfo/grub-devel
PATCH 2/5 grub-core: Update kernel image generation
In reply to Nicholas VinsonThe 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.
--- 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
conf/Makefile.extra-dist +1 -0
@@ -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
conf/i386-pc-kernel.ld new file +38 -0
@@ -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) + } +}
grub-core/Makefile.core.def +30 -10
@@ -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 = {
Signature · 7 lines
2.52.0 _______________________________________________ Grub-devel mailing list [email protected] https://lists.gnu.org/mailman/listinfo/grub-devel
Re: [PATCH 2/5] grub-core: Update kernel image generation
Quoted 4 lines · Nicholas Vinson
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.
I think in first place it begs for explanation why this is correct in our case. Should not we fix our builds to make newer linkers happy?
conf/i386-pc-kernel.ld
Quoted 27 lines
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.ldconf/Makefile.extra-dist +1
-0@@ -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.defconf/i386-pc-kernel.ld new file +0
-0
s/ld/lds/ and I would rename i386-cygwin-img-ld.sc to i386-cygwin-img-ld.lds too. Of course in separate patch...
conf/i386-pc-kernel.ld line 4
Quoted 5 lines
conf/i386-pc-kernel.ld new file +4
-0@@ -0,0 +1,38 @@ +ENTRY(_start) + +PHDRS { + text PT_LOAD FLAGS(7);
text PT_LOAD FLAGS(7); /* PF_R | PF_W | PF_X */
Quoted 8 lines
conf/i386-pc-kernel.ld new file +8
-0+} + +SECTIONS +{ + . = _grub_text_base; + .text : { + _start = .; + *(.text .text.*)
conf/i386-pc-kernel.ld line 22
Quoted 10 lines
conf/i386-pc-kernel.ld new file +10
-0+ } :text + .rodata : { + *(.rodata .rodata.*) + } :text + .module_license : { + *(.module_license) + } :text + .data : { + *(.data .data.*) + . = ALIGN(0x10);
Where does this number come from? And I would define a constant at the beginning of the linker script...
conf/i386-pc-kernel.ld line 29
Quoted 7 lines
conf/i386-pc-kernel.ld new file +7
-0+ _edata = .; + } :text + .bss : { + __bss_start = .; + *(.bss .bss.*) + *(COMMON) + . = ALIGN(0x10);
Ditto...
Quoted 14 lines
conf/i386-pc-kernel.ld new file +9
-0+ _end = .; + } :text + /DISCARD/ : { + *(.interp) + *(.note*) + *(.comment) + *(.build-id) + } +}grub-core/Makefile.core.def +0
-0
grub-core/Makefile.core.def kernel = { · line 86
Quoted 6 lines
grub-core/Makefile.core.def +2
-1@@ -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';
Could not we stick to "," and do not make a change to "="?
grub-core/Makefile.core.def image = { · line 457
Quoted 13 lines
grub-core/Makefile.core.def +4
-1i386_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';
Ditto...
Quoted 4 lines
grub-core/Makefile.core.def +0
-0i386_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;
grub-core/Makefile.core.def image = { · line 488
Quoted 10 lines
grub-core/Makefile.core.def +4
-1i386_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';
Ditto and below...
grub-core/Makefile.core.def image = { · line 489
Quoted 7 lines
grub-core/Makefile.core.def +0
-1objcopyflags = '-O binary'; enable = i386_pc;@@ -486,10 +493,13 @@ image = { image = { name = cdboot; -
Please drop this change...
Quoted 51 lines
grub-core/Makefile.core.def +17
-4i386_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;
grub-core/Makefile.core.def image = { · line 602
Quoted 10 lines
grub-core/Makefile.core.def +3
-2@@ -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;
Hmmm... Looks like a mistake...
Daniel
_______________________________________________
Grub-devel mailing list
[email protected]
https://lists.gnu.org/mailman/listinfo/grub-devel
Re: [PATCH 2/5] grub-core: Update kernel image generation
Quoted 8 lines · Daniel Kiper
Quoted 4 lines · Nicholas Vinson
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.
I think in first place it begs for explanation why this is correct in our case. Should not we fix our builds to make newer linkers happy?
Using a customized linker script actually does a better job of making newer linkers "happy" than trying to find a set of command-line flags that satisifies all supported linkers and properly produces the kernel.
Then dealing with just ld.bfd and ld.lld, the behavioral differences between the two made finding a proper subset of flags that worked impossible. The previous attempt dropped -Ttext for --image-base, which has been proven not to work. The simplest correction, -Wl,--image-base=0 -Wl,-Ttext, does not appear work. My testing with that option resulted in a GRUB kernel that entered into a tight infinite refresh loop.
Moreover, ld.lld does not order the sections the same way ld.bfd does, and that results in object files with gaps or holes when sections are stripped. I suspect, but did not investigate, that this plays a role in the infinite refresh loop I mentioned earlier.
The easiest way to resolve all this is to use customized linker scripts. These scripts, by default, override any default configuration the linker would otherwise impose, allow for complete control in aligning sections, and allows GRUB to specify where in the load segment each section goes.
Quoted 21 lines
Quoted 21 lines
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
conf/Makefile.extra-dist +1
-0@@ -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
Quoted 9 lines
conf/i386-pc-kernel.ld
Quoted 7 lines
conf/Makefile.extra-dist +0
-0EXTRA_DIST += grub-core/Makefile.core.def EXTRA_DIST += grub-core/Makefile.gcry.defconf/i386-pc-kernel.ld new file +0
-0s/ld/lds/ and I would rename i386-cygwin-img-ld.sc to
done.
Quoted 1 line
i386-cygwin-img-ld.ldstoo. Of course in separate patch...
done.
Quoted 8 lines
conf/i386-pc-kernel.ld line 4
Quoted 6 lines
conf/i386-pc-kernel.ld new file +4
-0@@ -0,0 +1,38 @@ +ENTRY(_start) + +PHDRS { + text PT_LOAD FLAGS(7);text
PT_LOADFLAGS(7); /*PF_R|PF_W|PF_X*/
done.
Quoted 14 lines
Quoted 14 lines
conf/i386-pc-kernel.ld new file +13
-0+} + +SECTIONS +{ + . = _grub_text_base; + .text : { + _start = .; + *(.text .text.*) + } :text + .rodata : { + *(.rodata .rodata.*) + } :text + .module_license : {
Quoted 9 lines
conf/i386-pc-kernel.ld line 22
Quoted 5 lines
conf/i386-pc-kernel.ld new file +5
-0+ *(.module_license) + } :text + .data : { + *(.data .data.*) + . = ALIGN(0x10);Where does this number come from? And I would define a constant at the beginning of the linker script...
done.
Quoted 10 lines
conf/i386-pc-kernel.ld line 29
Quoted 7 lines
conf/i386-pc-kernel.ld new file +7
-0+ _edata = .; + } :text + .bss : { + __bss_start = .; + *(.bss .bss.*) + *(COMMON) + . = ALIGN(0x10);Ditto...
done.
Quoted 16 lines
Quoted 16 lines
conf/i386-pc-kernel.ld new file +9
-0+ _end = .; + } :text + /DISCARD/ : { + *(.interp) + *(.note*) + *(.comment) + *(.build-id) + } +}grub-core/Makefile.core.def +0
-0@@ -82,7 +82,8 @@ kernel = { riscv64_efi_stripflags = '--strip-unneeded -K start -R .note -R .comment -R .note.gnu.gold-version -R .eh_frame';
Quoted 6 lines
grub-core/Makefile.core.def kernel = { · line 86
Quoted 4 lines
grub-core/Makefile.core.def +2
-1i386_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';Could not we stick to "," and do not make a change to "="?
No. ld.bfd and ld.lld require '=' instead of ' ' when using --defsym.
Quoted 38 lines
Quoted 5 lines
grub-core/Makefile.core.def +0
-0i386_qemu_ldflags = '$(TARGET_IMG_LDFLAGS)'; i386_qemu_ldflags = '$(TARGET_IMG_BASE_LDOPT),0x9000'; i386_coreboot_ldflags = '$(TARGET_IMG_LDFLAGS)';grub-core/Makefile.core.def image = { · line 457
Quoted 9 lines
grub-core/Makefile.core.def +4
-1@@ -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';Ditto...
Quoted 4 lines
grub-core/Makefile.core.def +0
-0i386_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;grub-core/Makefile.core.def image = { · line 488
Quoted 10 lines
grub-core/Makefile.core.def +4
-1i386_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';Ditto and below...
Quoted 4 lines
grub-core/Makefile.core.def +0
-0objcopyflags = '-O binary'; enable = i386_pc;@@ -486,10 +493,13 @@ image = {
Quoted 5 lines
grub-core/Makefile.core.def image = { · line 489
Quoted 3 lines
grub-core/Makefile.core.def +0
-1image = { name = cdboot; -Please drop this change...
done.
Quoted 57 lines
Quoted 57 lines
grub-core/Makefile.core.def +18
-4i386_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';
Quoted 7 lines
grub-core/Makefile.core.def image = { · line 602
Quoted 5 lines
grub-core/Makefile.core.def +2
-2objcopyflags = '-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;Hmmm... Looks like a mistake...
Fixed.
Thanks,
Nicholas Vinson
Quoted 2 lines
Daniel
_______________________________________________
Grub-devel mailing list
[email protected]
https://lists.gnu.org/mailman/listinfo/grub-devel
PATCH 3/5 Revert "configure: Print a more helpful error if autoconf-archive is not installed"
In reply to Nicholas VinsonThis reverts commit ac042f3f58d33ce9cd5ff61750f06da1a1d7b0eb.
--- configure.ac | 5 ----- 1 file changed, 5 deletions(-)
configure.ac +0 -5
@@ -1792,11 +1792,6 @@ LIBS="" # Defined in acinclude.m4. grub_ASM_USCORE grub_PROG_TARGET_CC - -# The error message produced by autoconf if autoconf-archive is not installed is -# quite misleading and not very helpful. So, try point people in the right direction. -m4_ifndef([AX_CHECK_LINK_FLAG], [m4_fatal([autoconf-archive is missing. You must install it to generate the configure script.])]) - if test "x$TARGET_APPLE_LINKER" != x1 ; then AX_CHECK_LINK_FLAG([-Wl,--image-base,0x400000], [TARGET_IMG_BASE_LDOPT="-Wl,--image-base"],
Signature · 7 lines
2.52.0 _______________________________________________ Grub-devel mailing list [email protected] https://lists.gnu.org/mailman/listinfo/grub-devel
Re: [PATCH 3/5] Revert "configure: Print a more helpful error if autoconf-archive is not installed"
Quoted 3 lines · Nicholas Vinson
This reverts commit
ac042f3f58d33ce9cd5ff61750f06da1a1d7b0eb.Signed-off-by Nicholas Vinson <[email protected]>
Daniel
_______________________________________________
Grub-devel mailing list
[email protected]
https://lists.gnu.org/mailman/listinfo/grub-devel
PATCH 4/5 Revert "configure: Check linker for --image-base support"
In reply to Nicholas VinsonThis reverts commit 1a5417f39a0ccefcdd5440f2a67f84d2d2e26960.
--- acinclude.m4 | 5 ----- configure.ac | 14 ++------------ 2 files changed, 2 insertions(+), 17 deletions(-)
acinclude.m4 +0 -5
@@ -79,11 +79,6 @@ AC_DEFUN([grub_PROG_OBJCOPY_ABSOLUTE], [AC_MSG_CHECKING([whether ${TARGET_OBJCOPY} works for absolute addresses]) AC_CACHE_VAL(grub_cv_prog_objcopy_absolute, [cat > conftest.c <<\EOF -asm ( - ".globl start, _start, __start\n" - ".ifdef cmain; .set start = _start = __start = cmain\n.endif\n" - ".ifdef _cmain; .set start = _start = __start = _cmain\n.endif\n" -); void cmain (void); void cmain (void)
configure.ac +2 -12
@@ -1461,6 +1461,7 @@ elif test x$grub_cv_target_cc_link_format = x-mi386pe || test x$grub_cv_target_c TARGET_IMG_LDSCRIPT='$(top_srcdir)'"/conf/i386-cygwin-img-ld.sc" TARGET_IMG_LDFLAGS="-Wl,-T${TARGET_IMG_LDSCRIPT}" TARGET_IMG_LDFLAGS_AC="-Wl,-T${srcdir}/conf/i386-cygwin-img-ld.sc" + TARGET_IMG_BASE_LDOPT="-Wl,-Ttext" TARGET_IMG_CFLAGS= else TARGET_APPLE_LINKER=0
@@ -1468,6 +1469,7 @@ else TARGET_IMG_LDSCRIPT= TARGET_IMG_LDFLAGS='-Wl,-N' TARGET_IMG_LDFLAGS_AC='-Wl,-N' + TARGET_IMG_BASE_LDOPT="-Wl,-Ttext" TARGET_IMG_CFLAGS= fi
@@ -1793,18 +1795,6 @@ LIBS="" grub_ASM_USCORE grub_PROG_TARGET_CC if test "x$TARGET_APPLE_LINKER" != x1 ; then -AX_CHECK_LINK_FLAG([-Wl,--image-base,0x400000], - [TARGET_IMG_BASE_LDOPT="-Wl,--image-base"], - [TARGET_IMG_BASE_LDOPT="-Wl,-Ttext"], - [], - [AC_LANG_SOURCE([ -asm (".globl start; start:"); -asm (".globl _start; _start:"); -asm (".globl __start; __start:"); -void __main (void); -void __main (void) {} -int main (void); - ])]) grub_PROG_OBJCOPY_ABSOLUTE fi grub_PROG_LD_BUILD_ID_NONE
Signature · 7 lines
2.52.0 _______________________________________________ Grub-devel mailing list [email protected] https://lists.gnu.org/mailman/listinfo/grub-devel
Re: [PATCH 4/5] Revert "configure: Check linker for --image-base support"
Quoted 3 lines · Nicholas Vinson
This reverts commit
1a5417f39a0ccefcdd5440f2a67f84d2d2e26960.Signed-off-by Nicholas Vinson <[email protected]>
... and commit 3c9c2a629 (INSTALL: Add note that the GNU Autoconf Archive may be needed) has to be reverted as well...
Daniel
_______________________________________________
Grub-devel mailing list
[email protected]
https://lists.gnu.org/mailman/listinfo/grub-devel
Re: [PATCH 4/5] Revert "configure: Check linker for --image-base support"
Quoted 9 lines · Daniel Kiper
Quoted 3 lines · Nicholas Vinson
This reverts commit
1a5417f39a0ccefcdd5440f2a67f84d2d2e26960.Signed-off-by Nicholas Vinson <[email protected]>Reviewed-by Daniel Kiper <[email protected]>... and commit
3c9c2a629(INSTALL: Add note that the GNU Autoconf Archive may be needed) has to be reverted as well...
done.
Quoted 2 lines
Daniel
_______________________________________________
Grub-devel mailing list
[email protected]
https://lists.gnu.org/mailman/listinfo/grub-devel
PATCH 5/5 configure: drop -Ttext checks for i386-pc
In reply to Nicholas VinsonThe i386-pc target now uses a linker script, so -Ttext is no longer required.
--- acinclude.m4 | 13 ++++++++++++- configure.ac | 21 +++++++++++++++++++-- 2 files changed, 31 insertions(+), 3 deletions(-)
acinclude.m4 +12 -1
@@ -93,7 +93,18 @@ else fi grub_cv_prog_objcopy_absolute=yes for link_addr in 0x2000 0x8000 0x7C00; do - if AC_TRY_COMMAND([${CC-cc} ${TARGET_CFLAGS} ${TARGET_LDFLAGS} -nostdlib ${TARGET_IMG_LDFLAGS_AC} ${TARGET_IMG_BASE_LDOPT},$link_addr conftest.o -o conftest.exec]); then : + + target_img_base_ld="${TARGET_IMG_BASE_LDOPT}" + case "$target_img_base_ld" in + *_grub_text_base) + target_img_base_ld="${target_img_base_ld}=$link_addr" + ;; + *) + target_img_base_ld="${target_img_base_ld},$link_addr" + ;; + esac + + if AC_TRY_COMMAND([${CC-cc} ${TARGET_CFLAGS} ${TARGET_LDFLAGS} -nostdlib ${TARGET_IMG_LDFLAGS_AC} ${target_img_base_ld} conftest.o -o conftest.exec]); then : else AC_MSG_ERROR([${CC-cc} cannot link at address $link_addr]) fi
configure.ac +19 -2
@@ -1469,7 +1469,13 @@ else TARGET_IMG_LDSCRIPT= TARGET_IMG_LDFLAGS='-Wl,-N' TARGET_IMG_LDFLAGS_AC='-Wl,-N' - TARGET_IMG_BASE_LDOPT="-Wl,-Ttext" + if test "x$target_cpu-$platform" != "xi386-pc"; then + TARGET_IMG_BASE_LDOPT="-Wl,-Ttext" + else + TARGET_IMG_BASE_LDOPT="-Wl,--defsym,_grub_text_base" + TARGET_IMG_LDSCRIPT='$(top_srcdir)'"/conf/i386-pc-kernel.ld" + TARGET_IMG_LDFLAGS_AC="-Wl,-T${srcdir}/conf/i386-pc-kernel.ld" + fi TARGET_IMG_CFLAGS= fi
@@ -1802,7 +1808,18 @@ if test "x$target_cpu" = xi386; then if test "$platform" != emu && test "x$TARGET_APPLE_LINKER" != x1 ; then if test ! -z "$TARGET_IMG_LDSCRIPT"; then # Check symbols provided by linker script. - CFLAGS="$TARGET_CFLAGS -nostdlib ${TARGET_IMG_LDFLAGS_AC} ${TARGET_IMG_BASE_LDOPT},0x8000" + target_img_base_ld="${TARGET_IMG_BASE_LDOPT}" + case "$target_img_base_ld" in + *_grub_text_base) + target_img_base_ld="${target_img_base_ld}=" + ;; + *) + target_img_base_ld="${target_img_base_ld}," + ;; + esac + target_img_base_ld="${target_img_base_ld}0x8000" + CFLAGS="$TARGET_CFLAGS -nostdlib ${TARGET_IMG_LDFLAGS_AC} ${target_img_base_ld}" + target_img_base_ld="" fi grub_CHECK_BSS_START_SYMBOL grub_CHECK_END_SYMBOL
Signature · 7 lines
2.52.0 _______________________________________________ Grub-devel mailing list [email protected] https://lists.gnu.org/mailman/listinfo/grub-devel
Re: [PATCH 5/5] configure: drop -Ttext checks for i386-pc
Quoted 4 lines · Nicholas Vinson
The i386-pc target now uses a linker script, so -Ttext is no longer required.
Signed-off-by Nicholas Vinson <[email protected]>
And you can ignore my comment WRT "=" and "," in patch #2 review. Now I understand the reason. Though I think it should be explained in the commit message of #2...
Daniel
_______________________________________________
Grub-devel mailing list
[email protected]
https://lists.gnu.org/mailman/listinfo/grub-devel
Re: [PATCH 5/5] configure: drop -Ttext checks for i386-pc
Quoted 11 lines · Daniel Kiper
Quoted 4 lines · Nicholas Vinson
The i386-pc target now uses a linker script, so -Ttext is no longer required.
Signed-off-by Nicholas Vinson <[email protected]>Reviewed-by Daniel Kiper <[email protected]>And you can ignore my comment WRT "=" and "," in patch #2 review. Now I understand the reason. Though I think it should be explained in the commit message of #2...
Done.
I found an additional issue related to ld.lld that I had originally disregarded as a testing error on my part due to its intermittent nature. Once I have a fix for it, I'll respin this patch series.
Thanks,
Nicholas Vinson
Quoted 2 lines
Daniel
_______________________________________________
Grub-devel mailing list
[email protected]
https://lists.gnu.org/mailman/listinfo/grub-devel