From 949ed7aae1e9418ea99f569efe6cb03349485508 Mon Sep 17 00:00:00 2001 From: Ludovic Courtès Date: Sun, 4 Jul 2021 22:10:06 +0200 Subject: gnu: glibc: Fix cross-compilation to aarch64-linux-gnu. Fixes . Reported by Maxime Devos . Previously, the cross-compiled libc.so linker script would read: OUTPUT_FORMAT(elf64-little) instead of: OUTPUT_FORMAT(elf64-littleaarch64) This is because glibc 2.33 runs "objdump -f" instead of "aarch64-linux-gnu-objdump -f" to determine the output format. * gnu/packages/patches/glibc-cross-objdump.patch: New file. * gnu/local.mk (dist_patch_DATA): Add it. * gnu/packages/base.scm (glibc)[source]: Use it. --- gnu/local.mk | 1 + gnu/packages/base.scm | 1 + gnu/packages/patches/glibc-cross-objdump.patch | 159 +++++++++++++++++++++++++ 3 files changed, 161 insertions(+) create mode 100644 gnu/packages/patches/glibc-cross-objdump.patch diff --git a/gnu/local.mk b/gnu/local.mk index cbc835aa85..c4d6a49606 100644 --- a/gnu/local.mk +++ b/gnu/local.mk @@ -1108,6 +1108,7 @@ dist_patch_DATA = \ %D%/packages/patches/glibc-bootstrap-system-2.2.5.patch \ %D%/packages/patches/glibc-bootstrap-system-2.16.0.patch \ %D%/packages/patches/glibc-bootstrap-system.patch \ + %D%/packages/patches/glibc-cross-objdump.patch \ %D%/packages/patches/glibc-dl-cache.patch \ %D%/packages/patches/glibc-hidden-visibility-ldconfig.patch \ %D%/packages/patches/glibc-hurd-clock_gettime_monotonic.patch \ diff --git a/gnu/packages/base.scm b/gnu/packages/base.scm index edc4c4a427..67df8a9154 100644 --- a/gnu/packages/base.scm +++ b/gnu/packages/base.scm @@ -691,6 +691,7 @@ the store.") "glibc-allow-kernel-2.6.32.patch" "glibc-reinstate-prlimit64-fallback.patch" "glibc-supported-locales.patch" + "glibc-cross-objdump.patch" "glibc-hurd-clock_t_centiseconds.patch" "glibc-hurd-clock_gettime_monotonic.patch" "glibc-hurd-mach-print.patch" diff --git a/gnu/packages/patches/glibc-cross-objdump.patch b/gnu/packages/patches/glibc-cross-objdump.patch new file mode 100644 index 0000000000..1660d915f7 --- /dev/null +++ b/gnu/packages/patches/glibc-cross-objdump.patch @@ -0,0 +1,159 @@ +Arrange so that glibc uses 'TRIPLET-objdump -f' rather than 'objdump -f' +to determine the 'OUTPUT_FORMAT' value in libc.so when cross-compiling. + +Patch submitted upstream: + . + +diff --git a/aclocal.m4 b/aclocal.m4 +index c195c4db56..13a791ffde 100644 +--- a/aclocal.m4 ++++ b/aclocal.m4 +@@ -118,8 +118,6 @@ AS=`$CC -print-prog-name=as` + LD=`$CC -print-prog-name=ld` + AR=`$CC -print-prog-name=ar` + AC_SUBST(AR) +-OBJDUMP=`$CC -print-prog-name=objdump` +-AC_SUBST(OBJDUMP) + OBJCOPY=`$CC -print-prog-name=objcopy` + AC_SUBST(OBJCOPY) + GPROF=`$CC -print-prog-name=gprof` +diff --git a/configure b/configure +index 9619c10991..fe0eda1cd5 100755 +--- a/configure ++++ b/configure +@@ -655,7 +655,6 @@ LD + AS + GPROF + OBJCOPY +-OBJDUMP + AR + LN_S + INSTALL_DATA +@@ -690,6 +689,7 @@ sysheaders + ac_ct_CXX + CXXFLAGS + CXX ++OBJDUMP + READELF + CPP + cross_compiling +@@ -2962,6 +2962,98 @@ else + READELF="$ac_cv_prog_READELF" + fi + ++if test -n "$ac_tool_prefix"; then ++ # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. ++set dummy ${ac_tool_prefix}objdump; ac_word=$2 ++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 ++$as_echo_n "checking for $ac_word... " >&6; } ++if ${ac_cv_prog_OBJDUMP+:} false; then : ++ $as_echo_n "(cached) " >&6 ++else ++ if test -n "$OBJDUMP"; then ++ ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. ++else ++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR ++for as_dir in $PATH ++do ++ IFS=$as_save_IFS ++ test -z "$as_dir" && as_dir=. ++ for ac_exec_ext in '' $ac_executable_extensions; do ++ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ++ ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" ++ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 ++ break 2 ++ fi ++done ++ done ++IFS=$as_save_IFS ++ ++fi ++fi ++OBJDUMP=$ac_cv_prog_OBJDUMP ++if test -n "$OBJDUMP"; then ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 ++$as_echo "$OBJDUMP" >&6; } ++else ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 ++$as_echo "no" >&6; } ++fi ++ ++ ++fi ++if test -z "$ac_cv_prog_OBJDUMP"; then ++ ac_ct_OBJDUMP=$OBJDUMP ++ # Extract the first word of "objdump", so it can be a program name with args. ++set dummy objdump; ac_word=$2 ++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 ++$as_echo_n "checking for $ac_word... " >&6; } ++if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : ++ $as_echo_n "(cached) " >&6 ++else ++ if test -n "$ac_ct_OBJDUMP"; then ++ ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. ++else ++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR ++for as_dir in $PATH ++do ++ IFS=$as_save_IFS ++ test -z "$as_dir" && as_dir=. ++ for ac_exec_ext in '' $ac_executable_extensions; do ++ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ++ ac_cv_prog_ac_ct_OBJDUMP="objdump" ++ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 ++ break 2 ++ fi ++done ++ done ++IFS=$as_save_IFS ++ ++fi ++fi ++ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP ++if test -n "$ac_ct_OBJDUMP"; then ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 ++$as_echo "$ac_ct_OBJDUMP" >&6; } ++else ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 ++$as_echo "no" >&6; } ++fi ++ ++ if test "x$ac_ct_OBJDUMP" = x; then ++ OBJDUMP="false" ++ else ++ case $cross_compiling:$ac_tool_warned in ++yes:) ++{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 ++$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ++ac_tool_warned=yes ;; ++esac ++ OBJDUMP=$ac_ct_OBJDUMP ++ fi ++else ++ OBJDUMP="$ac_cv_prog_OBJDUMP" ++fi ++ + + # We need the C++ compiler only for testing. + ac_ext=cpp +@@ -4553,8 +4645,6 @@ AS=`$CC -print-prog-name=as` + LD=`$CC -print-prog-name=ld` + AR=`$CC -print-prog-name=ar` + +-OBJDUMP=`$CC -print-prog-name=objdump` +- + OBJCOPY=`$CC -print-prog-name=objcopy` + + GPROF=`$CC -print-prog-name=gprof` +diff --git a/configure.ac b/configure.ac +index 34ecbba540..924af12738 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -52,6 +52,7 @@ fi + AC_SUBST(cross_compiling) + AC_PROG_CPP + AC_CHECK_TOOL(READELF, readelf, false) ++AC_CHECK_TOOL(OBJDUMP, objdump, false) + + # We need the C++ compiler only for testing. + AC_PROG_CXX -- cgit v1.2.3