The 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 supports the --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 <[email protected]> --- .gitignore | 3 ++- configure.ac | 13 +++++++++- m4/ax_check_link_flag.m4 | 53 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 67 insertions(+), 2 deletions(-) create mode 100644 m4/ax_check_link_flag.m4 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 4febd084d..94218e014 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 <[email protected]> +# Copyright (c) 2011 Maarten Bosmans <[email protected]> +# +# 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 -- 2.53.0 _______________________________________________ Grub-devel mailing list [email protected] https://lists.gnu.org/mailman/listinfo/grub-devel
