public inbox for libc-alpha@sourceware.org
 help / color / mirror / Atom feed
From: Carlos O'Donell <carlos@redhat.com>
To: "Ludovic Courtès" <ludo@gnu.org>
Cc: libc-alpha@sourceware.org
Subject: Re: [PATCH] Correctly determine libc.so 'OUTPUT_FORMAT' when cross-compiling.
Date: Thu, 6 Oct 2022 10:55:49 -0400	[thread overview]
Message-ID: <Yz7sdZZ9myk7qhKK@fedora> (raw)
In-Reply-To: <20210701210019.5594-1-ludo@gnu.org>

On Thu, Jul 01, 2021 at 11:00:19PM +0200, Ludovic Courtès via Libc-alpha wrote:
> Commit 87d583c6e8cd0e49f64da76636ebeec033298b4d replaces the sed script
> with an "objdump -f" invocation to determine the 'OUTPUT_FORMAT' bit of
> the libc.so linker script.
> 
> However, when cross-compiling, for example from x86_64-linux-gnu to
> aarch64-linux-gnu, "objdump -f" would report the wrong
> format ("elf64-little").  Conversely, "aarch64-linux-gnu-objdump -f"
> reports "elf64-littleaarch64" as expected.
> 
> This patch changes 'configure.ac' to use AC_CHECK_TOOL rather than
> '$CC -print-prog-name=objdump' to determine the value of the OBJDUMP
> variable.  That way, OBJDUMP is set to TRIPLET-objdump when
> cross-compiling for TRIPLET.

I've been tackling a backlog of old glibc patches, and this one is up
next. Yes it's been over a year, but this patch still applies and the
idea is sound. I've tested this with build-many-glibcs (bmg) on x86_64
and it has no impact because bmg always sets OBJDUMP. My opinion is that
bmg is the "base standard" for how we build native and cross tooling and
so it your changes work here, they should work in other instances.

The change looks good to me.

No regresions on x86_64.

Would you like me to commit this? :-)

Reviewed-by: Carlos O'Donell <carlos@redhat.com>
Tested-by: Carlos O'Donell <carlos@redhat.com>

> ---
>  aclocal.m4   |  2 --
>  configure    | 96 ++++++++++++++++++++++++++++++++++++++++++++++++++--
>  configure.ac |  1 +
>  3 files changed, 94 insertions(+), 5 deletions(-)
> 
> 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
> 
> base-commit: eb68d7d23cc411acdf68a60f194343a6774d6194
> -- 
> 2.32.0
> 


  reply	other threads:[~2022-10-06 14:55 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-07-01 21:00 Ludovic Courtès
2022-10-06 14:55 ` Carlos O'Donell [this message]
2022-10-07  9:41   ` Ludovic Courtès
2022-10-13 20:56     ` Fangrui Song
2022-10-29  1:45       ` Carlos O'Donell

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=Yz7sdZZ9myk7qhKK@fedora \
    --to=carlos@redhat.com \
    --cc=libc-alpha@sourceware.org \
    --cc=ludo@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).