From: Nicholas Vinson Date: Wed, 4 Mar 2026 02:41:19 +0000 (-0500) Subject: configure: Add --image-base check for non-i386 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ab6f735174ba95672bcd0e96a232bcfcdecba2b7;p=thirdparty%2Fgrub.git configure: Add --image-base check for non-i386 Configure check grub_PROG_OBJCOPY_ABSOLUTE is run for all non-Apple targets. With ld.lld-21, the check fails for addresses below image base address (which ld.lld-21 assumes is 0x200000). Fix by checking if linker support --image-base flag, and if it does, include "--image-base 0" to TARGET_IMG_BASE_LDOPT. The AX_CHECK_LINK_FLAG macro has been added to avoid a dependency on autoconf-archive. Note: I tried this approach with i386-pc, but I ended up with a GRUB image that failed to boot correctly. Signed-off-by: Nicholas Vinson Reviewed-by: Daniel Kiper --- diff --git a/.gitignore b/.gitignore index db16295ad..f61f4805f 100644 --- a/.gitignore +++ b/.gitignore @@ -238,7 +238,8 @@ widthspec.bin /lzocompress_test /luks1_test /luks2_test -/m4/ +/m4/* +!/m4/ax_check_link_flag.m4 /minixfs_test /missing /netboot_test diff --git a/configure.ac b/configure.ac index 470a26b0f..81f7437d2 100644 --- a/configure.ac +++ b/configure.ac @@ -1472,7 +1472,18 @@ else TARGET_IMG_LDFLAGS='-Wl,-N' TARGET_IMG_LDFLAGS_AC='-Wl,-N' if test "x$target_cpu-$platform" != "xi386-pc"; then - TARGET_IMG_BASE_LDOPT="-Wl,-Ttext" + AX_CHECK_LINK_FLAG([-Wl,--image-base,0], + [TARGET_IMG_BASE_LDOPT="-Wl,--image-base,0 -Wl,-Ttext"], + [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); + ])]) TARGET_IMG_BASE_LDOPT_ARG_SEP="," else TARGET_IMG_BASE_LDOPT="-Wl,--defsym=_grub_text_base" diff --git a/m4/ax_check_link_flag.m4 b/m4/ax_check_link_flag.m4 new file mode 100644 index 000000000..03a30ce4c --- /dev/null +++ b/m4/ax_check_link_flag.m4 @@ -0,0 +1,53 @@ +# =========================================================================== +# https://www.gnu.org/software/autoconf-archive/ax_check_link_flag.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_CHECK_LINK_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-FLAGS], [INPUT]) +# +# DESCRIPTION +# +# Check whether the given FLAG works with the linker or gives an error. +# (Warnings, however, are ignored) +# +# ACTION-SUCCESS/ACTION-FAILURE are shell commands to execute on +# success/failure. +# +# If EXTRA-FLAGS is defined, it is added to the linker's default flags +# when the check is done. The check is thus made with the flags: "LDFLAGS +# EXTRA-FLAGS FLAG". This can for example be used to force the linker to +# issue an error when a bad flag is given. +# +# INPUT gives an alternative input source to AC_LINK_IFELSE. +# +# NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. Please keep this +# macro in sync with AX_CHECK_{PREPROC,COMPILE}_FLAG. +# +# LICENSE +# +# Copyright (c) 2008 Guido U. Draheim +# Copyright (c) 2011 Maarten Bosmans +# +# Copying and distribution of this file, with or without modification, are +# permitted in any medium without royalty provided the copyright notice +# and this notice are preserved. This file is offered as-is, without any +# warranty. + +#serial 6 + +AC_DEFUN([AX_CHECK_LINK_FLAG], +[AC_PREREQ(2.64)dnl for _AC_LANG_PREFIX and AS_VAR_IF +AS_VAR_PUSHDEF([CACHEVAR],[ax_cv_check_ldflags_$4_$1])dnl +AC_CACHE_CHECK([whether the linker accepts $1], CACHEVAR, [ + ax_check_save_flags=$LDFLAGS + LDFLAGS="$LDFLAGS $4 $1" + AC_LINK_IFELSE([m4_default([$5],[AC_LANG_PROGRAM()])], + [AS_VAR_SET(CACHEVAR,[yes])], + [AS_VAR_SET(CACHEVAR,[no])]) + LDFLAGS=$ax_check_save_flags]) +AS_VAR_IF(CACHEVAR,yes, + [m4_default([$2], :)], + [m4_default([$3], :)]) +AS_VAR_POPDEF([CACHEVAR])dnl +])dnl AX_CHECK_LINK_FLAGS