On Mon, Jan 26, 2026 at 06:59:33AM -0500, Nicholas Vinson wrote:
> 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?

> 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

s/ld/lds/ and I would rename i386-cygwin-img-ld.sc to
i386-cygwin-img-ld.lds too. Of course in separate patch...

> @@ -0,0 +1,38 @@
> +ENTRY(_start)
> +
> +PHDRS {
> +    text PT_LOAD FLAGS(7);

text PT_LOAD FLAGS(7); /* PF_R | PF_W | PF_X */

> +}
> +
> +SECTIONS
> +{
> +    . = _grub_text_base;
> +    .text : {
> +        _start = .;
> +        *(.text .text.*)
> +    } :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...

> +        _edata = .;
> +    } :text
> +    .bss : {
> +        __bss_start = .;
> +        *(.bss .bss.*)
> +        *(COMMON)
> +        . = ALIGN(0x10);

Ditto...

> +        _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';

Could not we stick to "," and do not make a change to "="?

>    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';

Ditto...

>    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';

Ditto and below...

>    objcopyflags = '-O binary';
>    enable = i386_pc;
> @@ -486,10 +493,13 @@ image = {
>
>  image = {
>    name = cdboot;
> -

Please drop this change...

>    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;

Hmmm... Looks like a mistake...

Daniel

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

Reply via email to