Correctly determine libc.so 'OUTPUT_FORMAT' when cross-compiling.

Message ID 20210701210019.5594-1-ludo@gnu.org
State Committed
Commit 361d6454c034a920f2c96517c277990d390b9652
Headers
Series Correctly determine libc.so 'OUTPUT_FORMAT' when cross-compiling. |

Checks

Context Check Description
dj/TryBot-apply_patch success Patch applied to master at the time it was sent
dj/TryBot-32bit success Build for i686

Commit Message

Ludovic Courtès July 1, 2021, 9 p.m. UTC
  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.
---
 aclocal.m4   |  2 --
 configure    | 96 ++++++++++++++++++++++++++++++++++++++++++++++++++--
 configure.ac |  1 +
 3 files changed, 94 insertions(+), 5 deletions(-)


base-commit: eb68d7d23cc411acdf68a60f194343a6774d6194
  

Comments

Carlos O'Donell Oct. 6, 2022, 2:55 p.m. UTC | #1
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
>
  
Ludovic Courtès Oct. 7, 2022, 9:41 a.m. UTC | #2
Hi Carlos,

Carlos O'Donell <carlos@redhat.com> skribis:

> 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? :-)

I don’t have commit access AFAIK so I’ll happily defer to you.  :-)

Thanks for taking the time to look at the backlog!

Ludo’.
  
Fangrui Song Oct. 13, 2022, 8:56 p.m. UTC | #3
On 2022-10-07, Ludovic Court?s via Libc-alpha wrote:
>Hi Carlos,
>
>Carlos O'Donell <carlos@redhat.com> skribis:
>
>> 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? :-)
>
>I don?t have commit access AFAIK so I?ll happily defer to you.  :-)
>
>Thanks for taking the time to look at the backlog!
>
>Ludo?.

Thanks. This looks good.
  
Carlos O'Donell Oct. 29, 2022, 1:45 a.m. UTC | #4
On 10/13/22 16:56, Fangrui Song wrote:
> On 2022-10-07, Ludovic Courtès via Libc-alpha wrote:
>> Hi Carlos,
>>
>> Carlos O'Donell <carlos@redhat.com> skribis:
>>
>>> 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? :-)
>>
>> I don’t have commit access AFAIK so I’ll happily defer to you.  :-)
>>
>> Thanks for taking the time to look at the backlog!
>>
>> Ludo’.
> 
> Thanks. This looks good.
 
Tested again with bmg to cross x86_64 to aarch64. No regressions.

Pushed. Thank you!
  

Patch

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