Re: [PATCH v2 1/1] Check linker for --image-base support
On 1/19/26 10:08, Daniel Kiper wrote: Hi, Adding Nicholas and Mike... On Sun, Jan 18, 2026 at 01:21:14PM +0100, Hustler One via Grub-devel wrote: I had to revert the commit when updating GRUB to 2.14 on [nixpkgs](https:// github.com/NixOS/nixpkgs/pull/481112). Also, Leah Rowe has also done the same on [Libreboot](https://codeberg.org/ libreboot/lbmk/src/branch/master/config/grub/nvme/patches/0010-Revert- configure-Check-linker-for-image-base-support.patch ). For me, at least, behavior was universally broken on both clang (LLVM21) and GCC. It looks it is related to newer linker versions. Older ones work without any issue. Anyway, sorry for the issues... Nicholas, may I ask you to investigate this breakage and post a fix? I've already started looking. I'll let you know when I have something. Thanks, Nicholas Vinson Daniel ___ Grub-devel mailing list [email protected] https://lists.gnu.org/mailman/listinfo/grub-devel
Re: [PATCH v2 1/1] Check linker for --image-base support
Hi, Adding Nicholas and Mike... On Sun, Jan 18, 2026 at 01:21:14PM +0100, Hustler One via Grub-devel wrote: > I had to revert the commit when updating GRUB to 2.14 on [nixpkgs](https:// > github.com/NixOS/nixpkgs/pull/481112). > > Also, Leah Rowe has also done the same on [Libreboot](https://codeberg.org/ > libreboot/lbmk/src/branch/master/config/grub/nvme/patches/0010-Revert- > configure-Check-linker-for-image-base-support.patch > ). > > For me, at least, behavior was universally broken on both clang (LLVM21) and > GCC. It looks it is related to newer linker versions. Older ones work without any issue. Anyway, sorry for the issues... Nicholas, may I ask you to investigate this breakage and post a fix? Daniel ___ Grub-devel mailing list [email protected] https://lists.gnu.org/mailman/listinfo/grub-devel
Re: Re: [PATCH v2 1/1] Check linker for --image-base support
I can confirm myself that this patch does the complete opposite of what it tries to achieve. I had to revert the commit when updating GRUB to 2.14 on [nixpkgs](https://github.com/NixOS/nixpkgs/pull/481112). Also, Leah Rowe has also done the same on [Libreboot](https://codeberg.org/libreboot/lbmk/src/branch/master/config/grub/nvme/patches/0010-Revert-configure-Check-linker-for-image-base-support.patch ). For me, at least, behavior was universally broken on both clang (LLVM21) and GCC. ___ Grub-devel mailing list [email protected] https://lists.gnu.org/mailman/listinfo/grub-devel
RE: [PATCH v2 1/1] Check linker for --image-base support
I had to revert the commit when updating GRUB to 2.14 on [nixpkgs](https://github.com/NixOS/nixpkgs/pull/481112). Also, Leah Rowe has also done the same on [Libreboot](https://codeberg.org/libreboot/lbmk/src/branch/master/config/grub/nvme/patches/0010-Revert-configure-Check-linker-for-image-base-support.patch ). For me, at least, behavior was universally broken on both clang (LLVM21) and GCC. ___ Grub-devel mailing list [email protected] https://lists.gnu.org/mailman/listinfo/grub-devel
Re: [PATCH v2 1/1] Check linker for --image-base support
Nicholas Vinson on Tue, 2025/11/18 19:38:
> In several scenarios, configure tests assume it's safe to use
> '-Wl,-Ttext,', but starting with ld.lld-21, blindly using that
> flag may result in configure-test failures due to ld.lld failing to
> link. The failure is because ld.lld-21 no longer allows the specified
> address is less than the base address.
>
> However, ld.lld-21+ and ld.bfd-2.44+ both provide support for the
> --image-base flag making it preferable over the older `-Ttext` flag.
This breaks the start address in i386-pc/kernel.img, which should be 0x9000,
but became 0x9074.
The error message is:
/usr/bin/grub-install: error: `/usr/lib/grub/i386-pc/kernel.img' is
miscompiled: its start address is 0x9074 instead of 0x9000: ld.gold bug?.
--
main(a){char*c=/*Schoene Gruesse */"B?IJj;MEH"
"CX:;",b;for(a/*Best regards my address:*/=0;b=c[a++];)
putchar(b-1/(/*Chriscc -ox -xc - && ./x*/b/42*2-3)*42);}
pgpq0U48cqeSq.pgp
Description: OpenPGP digital signature
___
Grub-devel mailing list
[email protected]
https://lists.gnu.org/mailman/listinfo/grub-devel
RE: [PATCH v2 1/1] Check linker for --image-base support
The issue seems to be that --image-base sets the base address of the ELF image
(i.e. the text segment), whereas -Ttext sets the actual section start of it.
See the documentation here
https://sourceware.org/binutils/docs/ld/Options.html#index-image-base-address_002c-cmd-line
Given that .text is offset from the start of the file due to the ELF headers,
it puts the actual address of .text to 0x9000 + offset, whereas -Ttext puts
.text at 0x9000.
This becomes pretty clear in the readelf -e output:
--
ELF Header:
Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
Class: ELF32
Data: 2's complement, little endian
Version: 1 (current)
OS/ABI:UNIX - System V
ABI Version: 0
Type: EXEC (Executable file)
Machine: Intel 80386
Version: 0x1
Entry point address: 0x9074
Start of program headers: 52 (bytes into file)
Start of section headers: 37336 (bytes into file)
Flags: 0x0
Size of this header: 52 (bytes)
Size of program headers: 32 (bytes)
Number of program headers: 2
Size of section headers: 40 (bytes)
Number of section headers: 8
Section header string table index: 7
Section Headers:
[Nr] Name TypeAddr OffSize ES Flg Lk Inf
Al
[ 0] NULL 00 00 00 0 0
0
[ 1] .text PROGBITS9074 74 006cb0 00 WAX 0 0
1
[ 2] .rodata PROGBITSfd40 006d40 001ae3 00 A 0 0
32
[ 3] .module_license PROGBITS00011824 008824 0f 00 A 0 0
4
[ 4] .data PROGBITS00011840 008840 00093c 00 WA 0 0
32
[ 5] .bss NOBITS 00012180 00917c 0077c4 00 WA 0 0
32
[ 6] .gnu_debuglinkPROGBITS 00917c 18 00 0 0
4
[ 7] .shstrtab STRTAB 009194 43 00 0 0
1
Key to Flags:
W (write), A (alloc), X (execute), M (merge), S (strings), I (info),
L (link order), O (extra OS processing required), G (group), T (TLS),
C (compressed), x (unknown), o (OS specific), E (exclude),
D (mbind), p (processor specific)
Program Headers:
Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
LOAD 0x74 0x9074 0x9074 0x09108 0x108d0 RWE 0x20
GNU_STACK 0x00 0x 0x 0x0 0x0 RW 0x10
Section to Segment mapping:
Segment Sections...
00 .text .rodata .module_license .data .bss
01
--
0x74 is 116, which is precisely 52 + 2 * 32. Expected is the following layout
though:
Program Headers:
Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
LOAD 0x80 0x9000 0x9000 0x090fc 0x108c4 RWE 0x20
GNU_STACK 0x00 0x 0x 0x0 0x0 RW 0x10
Section to Segment mapping:
Segment Sections...
00 .text .rodata .module_license .data .bss
01
In this case, 0x74 gets increased to 0x20 to fit the alignment.
> -Original Message-
> From: Christian Hesse
> Sent: 01 December 2025 16:03
> To: Nicholas Vinson
> Cc: The development of GNU GRUB ; cpfeiffer@rev-
> crew.info
> Subject: Re: [PATCH v2 1/1] Check linker for --image-base support
>
> Nicholas Vinson on Tue, 2025/11/18 19:38:
> > In several scenarios, configure tests assume it's safe to use
> > '-Wl,-Ttext,', but starting with ld.lld-21, blindly using
> > that flag may result in configure-test failures due to ld.lld failing
> > to link. The failure is because ld.lld-21 no longer allows the
> > specified address is less than the base address.
> >
> > However, ld.lld-21+ and ld.bfd-2.44+ both provide support for the
> > --image-base flag making it preferable over the older `-Ttext` flag.
>
> This breaks the start address in i386-pc/kernel.img, which should be 0x9000,
> but became 0x9074.
>
> The error message is:
>
> /usr/bin/grub-install: error: `/usr/lib/grub/i386-pc/kernel.img' is
> miscompiled: its start address is 0x9074 instead of 0x9000: ld.gold bug?.
> --
> main(a){char*c=/*Schoene Gruesse */"B?IJj;MEH"
> "CX:;",b;for(a/*Best regards my address:*/=0;b=c[a++];)
> putchar(b-1/(/*Chriscc -ox -xc - && ./x*/b/42*2-3)*42);}
smime.p7s
Description: S/MIME cryptographic signature
___
Grub-devel mailing list
[email protected]
https://lists.gnu.org/mailman/listinfo/grub-devel
Re: [PATCH v2 1/1] Check linker for --image-base support
On Tue, Nov 18, 2025 at 07:38:07PM -0500, Nicholas Vinson wrote:
> In several scenarios, configure tests assume it's safe to use
> '-Wl,-Ttext,', but starting with ld.lld-21, blindly using that
> flag may result in configure-test failures due to ld.lld failing to
> link. The failure is because ld.lld-21 no longer allows the specified
> address is less than the base address.
>
> However, ld.lld-21+ and ld.bfd-2.44+ both provide support for the
> --image-base flag making it preferable over the older `-Ttext` flag.
>
> Fixes: 67662
> Signed-off-by: Nicholas Vinson
To save time for people who got the following error as I did after
applying this patch, it means that 'autoconf-archive' is missing in the
system.
configure.ac:1800: error: possibly undefined macro: AC_LANG_SOURCE
If this token and others are legitimate, please use m4_pattern_allow.
See the Autoconf documentation.
autoreconf: /usr/bin/autoconf failed with exit status: 1
The error is completely misleading. The real missing macro is
"AX_CHECK_LINK_FLAG" and 'autoconf' could not detect the error
correctly...
Gary Lin
> ---
> acinclude.m4 | 5 +
> configure.ac | 14 --
> 2 files changed, 17 insertions(+), 2 deletions(-)
>
> diff --git a/acinclude.m4 b/acinclude.m4
> index fa7840f09..70c1912f8 100644
> --- a/acinclude.m4
> +++ b/acinclude.m4
> @@ -79,6 +79,11 @@ 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)
> diff --git a/configure.ac b/configure.ac
> index 17937baf4..a282bf7bf 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -1461,7 +1461,6 @@ 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
> @@ -1469,7 +1468,6 @@ 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
>
> @@ -1795,6 +1793,18 @@ LIBS=""
> grub_ASM_USCORE
> grub_PROG_TARGET_CC
> if test "x$TARGET_APPLE_LINKER" != x1 ; then
> +AX_CHECK_LINK_FLAG([-Wl,--image-base,0x40],
> +[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
> --
> 2.51.2
>
>
> ___
> Grub-devel mailing list
> [email protected]
> https://lists.gnu.org/mailman/listinfo/grub-devel
___
Grub-devel mailing list
[email protected]
https://lists.gnu.org/mailman/listinfo/grub-devel
Re: [PATCH v2 1/1] Check linker for --image-base support
On Tue, Nov 18, 2025 at 07:38:07PM -0500, Nicholas Vinson wrote: > In several scenarios, configure tests assume it's safe to use > '-Wl,-Ttext,', but starting with ld.lld-21, blindly using that > flag may result in configure-test failures due to ld.lld failing to > link. The failure is because ld.lld-21 no longer allows the specified > address is less than the base address. > > However, ld.lld-21+ and ld.bfd-2.44+ both provide support for the > --image-base flag making it preferable over the older `-Ttext` flag. > > Fixes: 67662 > Signed-off-by: Nicholas Vinson Reviewed-by: Daniel Kiper Daniel ___ Grub-devel mailing list [email protected] https://lists.gnu.org/mailman/listinfo/grub-devel
