Message ID | 20210701210019.5594-1-ludo@gnu.org |
---|---|
State | New |
Headers | show |
Series | Correctly determine libc.so 'OUTPUT_FORMAT' when cross-compiling. | expand |
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 >
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’.
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.
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!
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