diff mbox series

Use a non-empty test program to test ability to link

Message ID e2e8405a-aede-7937-df79-83ded532d066@codesourcery.com
State New
Headers show
Series Use a non-empty test program to test ability to link | expand

Commit Message

Sandra Loosemore Feb. 5, 2020, 6:52 p.m. UTC
This patch is for PR 79193 and 88999, problems where libstdc++ is 
mis-configuring itself when building for a bare-metal target because it 
thinks it can link programs without pulling in the BSP that provides 
low-level I/O support.  (Specifically, this was observed on nios2-elf 
with Newlib and GDB semihosting.)  It'll build just fine if it 
recognizes that it can only compile programs and not link them, but it's 
confused because using an empty program to test for ability to link 
succeeds.

Is this configure change OK, and suitable for stage 4?

BTW, I did run autoconf in every subdirectory that contains a 
configure.ac, but it appears only libstc++-v3 actually uses this test; 
all the other regenerated configure scripts were unchanged.

-Sandra

Comments

Jonathan Wakely Feb. 6, 2020, 8:57 a.m. UTC | #1
On 05/02/20 11:52 -0700, Sandra Loosemore wrote:
>This patch is for PR 79193 and 88999, problems where libstdc++ is 
>mis-configuring itself when building for a bare-metal target because 
>it thinks it can link programs without pulling in the BSP that 
>provides low-level I/O support.  (Specifically, this was observed on 
>nios2-elf with Newlib and GDB semihosting.)  It'll build just fine if 
>it recognizes that it can only compile programs and not link them, but 
>it's confused because using an empty program to test for ability to 
>link succeeds.
>
>Is this configure change OK, and suitable for stage 4?
>
>BTW, I did run autoconf in every subdirectory that contains a 
>configure.ac, but it appears only libstc++-v3 actually uses this test; 
>all the other regenerated configure scripts were unchanged.

Thanks for making this work properly.

No objection from me, but I can't approve the top-level configury
change, and the whole "no executables" thing is a bit of a mystery to
me.  Joseph is probably the right person to approve that, if no other
relevant maintainer responds.
Richard Sandiford Feb. 6, 2020, 9:18 a.m. UTC | #2
Sandra Loosemore <sandra@codesourcery.com> writes:
> This patch is for PR 79193 and 88999, problems where libstdc++ is 
> mis-configuring itself when building for a bare-metal target because it 
> thinks it can link programs without pulling in the BSP that provides 
> low-level I/O support.  (Specifically, this was observed on nios2-elf 
> with Newlib and GDB semihosting.)  It'll build just fine if it 
> recognizes that it can only compile programs and not link them, but it's 
> confused because using an empty program to test for ability to link 
> succeeds.
>
> Is this configure change OK, and suitable for stage 4?
>
> BTW, I did run autoconf in every subdirectory that contains a 
> configure.ac, but it appears only libstc++-v3 actually uses this test; 
> all the other regenerated configure scripts were unchanged.

LGTM FWIW.  AIUI the effect will be to use the hard-coded list of
supported newlib features (as intended) instead of trying to detech them
at configure time.  But I guess there's a risk that this could unmask
latent problems on other targets by enabling features that some BSPs don't
support, either due to a limited libgloss or due to some other restriction.
Jeff's autotesters will probably pick that up though.

Thanks,
Richard

>
> -Sandra
>
> From 44b769a9b5e01a58c9b89b24ca5a00fc1ff53012 Mon Sep 17 00:00:00 2001
> From: Sandra Loosemore <sandra@codesourcery.com>
> Date: Wed, 5 Feb 2020 10:03:58 -0800
> Subject: [PATCH] Use a non-empty test program to test ability to link.
>
> On bare-metal targets, I/O support is typically provided by a BSP and
> requires a linker script and/or hosting library to be specified on the
> linker command line.  Linking an empty program with the default linker
> script may succeed, however, which confuses libstdc++ configuration
> when programs that probe for the presence of various I/O features fail
> with link errors.
>
> 2020-02-05  Sandra Loosemore  <sandra@codesourcery.com>
>
> 	PR libstdc++/79193
> 	PR libstdc++/88999
>
> 	config/
> 	* no-executables.m4: Use a non-empty program to test for linker
> 	support.
>
> 	libstdc++v-3/
> 	* configure: Regenerated.
> ---
>  config/ChangeLog         | 8 ++++++++
>  config/no-executables.m4 | 4 +++-
>  libstdc++-v3/ChangeLog   | 7 +++++++
>  libstdc++-v3/configure   | 4 ++--
>  4 files changed, 20 insertions(+), 3 deletions(-)
>
> diff --git a/config/ChangeLog b/config/ChangeLog
> index f1fec81..d2a12bd 100644
> --- a/config/ChangeLog
> +++ b/config/ChangeLog
> @@ -1,3 +1,11 @@
> +2020-02-05  Sandra Loosemore  <sandra@codesourcery.com>
> +
> +	PR libstdc++/79193
> +	PR libstdc++/88999
> +
> +	* no-executables.m4: Use a non-empty program to test for linker
> +	support.
> +
>  2020-02-01  Andrew Burgess  <andrew.burgess@embecosm.com>
>  
>  	* lib-link.m4 (AC_LIB_LINKFLAGS_BODY): Update shell syntax.
> diff --git a/config/no-executables.m4 b/config/no-executables.m4
> index 9061624..6842f84 100644
> --- a/config/no-executables.m4
> +++ b/config/no-executables.m4
> @@ -25,7 +25,9 @@ AC_BEFORE([$0], [_AC_COMPILER_EXEEXT])
>  AC_BEFORE([$0], [AC_LINK_IFELSE])
>  
>  m4_define([_AC_COMPILER_EXEEXT],
> -[AC_LANG_CONFTEST([AC_LANG_PROGRAM()])
> +[AC_LANG_CONFTEST([AC_LANG_PROGRAM(
> +		     [#include <stdio.h>],
> +		     [printf ("hello world\n");])])
>  # FIXME: Cleanup?
>  AS_IF([AC_TRY_EVAL(ac_link)], [gcc_no_link=no], [gcc_no_link=yes])
>  if test x$gcc_no_link = xyes; then
> diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
> index 76a6e2b..46ab7c0 100644
> --- a/libstdc++-v3/ChangeLog
> +++ b/libstdc++-v3/ChangeLog
> @@ -1,3 +1,10 @@
> +2020-02-05  Sandra Loosemore  <sandra@codesourcery.com>
> +
> +	PR libstdc++/79193
> +	PR libstdc++/88999
> +
> +	* configure: Regenerated.
> +
>  2020-02-05  Jonathan Wakely  <jwakely@redhat.com>
>  
>  	* include/bits/iterator_concepts.h (iter_reference_t)
> diff --git a/libstdc++-v3/configure b/libstdc++-v3/configure
> index a39c33b..9f9c5a2 100755
> --- a/libstdc++-v3/configure
> +++ b/libstdc++-v3/configure
> @@ -4130,11 +4130,11 @@ done
>  
>  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
>  /* end confdefs.h.  */
> -
> +#include <stdio.h>
>  int
>  main ()
>  {
> -
> +printf ("hello world\n");
>    ;
>    return 0;
>  }
Joseph Myers Feb. 7, 2020, 10:24 p.m. UTC | #3
On Wed, 5 Feb 2020, Sandra Loosemore wrote:

> This patch is for PR 79193 and 88999, problems where libstdc++ is
> mis-configuring itself when building for a bare-metal target because it thinks
> it can link programs without pulling in the BSP that provides low-level I/O
> support.  (Specifically, this was observed on nios2-elf with Newlib and GDB
> semihosting.)  It'll build just fine if it recognizes that it can only compile
> programs and not link them, but it's confused because using an empty program
> to test for ability to link succeeds.
> 
> Is this configure change OK, and suitable for stage 4?
> 
> BTW, I did run autoconf in every subdirectory that contains a configure.ac,
> but it appears only libstc++-v3 actually uses this test; all the other
> regenerated configure scripts were unchanged.

There's some problem with that regeneration, then; every directory where 
configure.ac mentions GCC_NO_EXECUTABLES should have a resulting change (I 
tested regenerating in libgcc/ with this patch applied and got such a 
change, for example).
Sandra Loosemore Feb. 8, 2020, 11:08 p.m. UTC | #4
On 2/7/20 3:24 PM, Joseph Myers wrote:
> On Wed, 5 Feb 2020, Sandra Loosemore wrote:
> 
>> This patch is for PR 79193 and 88999, problems where libstdc++ is
>> mis-configuring itself when building for a bare-metal target because it thinks
>> it can link programs without pulling in the BSP that provides low-level I/O
>> support.  (Specifically, this was observed on nios2-elf with Newlib and GDB
>> semihosting.)  It'll build just fine if it recognizes that it can only compile
>> programs and not link them, but it's confused because using an empty program
>> to test for ability to link succeeds.
>>
>> Is this configure change OK, and suitable for stage 4?
>>
>> BTW, I did run autoconf in every subdirectory that contains a configure.ac,
>> but it appears only libstc++-v3 actually uses this test; all the other
>> regenerated configure scripts were unchanged.
> 
> There's some problem with that regeneration, then; every directory where
> configure.ac mentions GCC_NO_EXECUTABLES should have a resulting change (I
> tested regenerating in libgcc/ with this patch applied and got such a
> change, for example).

Hmmm.  I just tried that again and got nothing.  Do I have to do 
something other than just run "autoconf" in that directory?  I'm always 
confused by anything involving configuration changes.  :-(

-Sandra
Joseph Myers Feb. 10, 2020, 10:58 p.m. UTC | #5
On Sat, 8 Feb 2020, Sandra Loosemore wrote:

> > > BTW, I did run autoconf in every subdirectory that contains a
> > > configure.ac,
> > > but it appears only libstc++-v3 actually uses this test; all the other
> > > regenerated configure scripts were unchanged.
> > 
> > There's some problem with that regeneration, then; every directory where
> > configure.ac mentions GCC_NO_EXECUTABLES should have a resulting change (I
> > tested regenerating in libgcc/ with this patch applied and got such a
> > change, for example).
> 
> Hmmm.  I just tried that again and got nothing.  Do I have to do something
> other than just run "autoconf" in that directory?  I'm always confused by
> anything involving configuration changes.  :-(

Just running autoconf in that directory should suffice to get configure 
regenerated with the change.
Sandra Loosemore Feb. 12, 2020, 8:55 p.m. UTC | #6
On 2/10/20 3:58 PM, Joseph Myers wrote:
> On Sat, 8 Feb 2020, Sandra Loosemore wrote:
> 
>>>> BTW, I did run autoconf in every subdirectory that contains a
>>>> configure.ac,
>>>> but it appears only libstc++-v3 actually uses this test; all the other
>>>> regenerated configure scripts were unchanged.
>>>
>>> There's some problem with that regeneration, then; every directory where
>>> configure.ac mentions GCC_NO_EXECUTABLES should have a resulting change (I
>>> tested regenerating in libgcc/ with this patch applied and got such a
>>> change, for example).
>>
>> Hmmm.  I just tried that again and got nothing.  Do I have to do something
>> other than just run "autoconf" in that directory?  I'm always confused by
>> anything involving configuration changes.  :-(
> 
> Just running autoconf in that directory should suffice to get configure
> regenerated with the change.

Hmmm, I tried again and saw that autoconf didn't even touch the 
timestamp on the existing configure file, but I was able to force it to 
regenerate the files by removing the old ones first.  Is this version of 
the patch OK to check in?

-Sandra
Joseph Myers Feb. 12, 2020, 9:03 p.m. UTC | #7
On Wed, 12 Feb 2020, Sandra Loosemore wrote:

> Hmmm, I tried again and saw that autoconf didn't even touch the timestamp on
> the existing configure file, but I was able to force it to regenerate the
> files by removing the old ones first.  Is this version of the patch OK to
> check in?

OK.
diff mbox series

Patch

From 44b769a9b5e01a58c9b89b24ca5a00fc1ff53012 Mon Sep 17 00:00:00 2001
From: Sandra Loosemore <sandra@codesourcery.com>
Date: Wed, 5 Feb 2020 10:03:58 -0800
Subject: [PATCH] Use a non-empty test program to test ability to link.

On bare-metal targets, I/O support is typically provided by a BSP and
requires a linker script and/or hosting library to be specified on the
linker command line.  Linking an empty program with the default linker
script may succeed, however, which confuses libstdc++ configuration
when programs that probe for the presence of various I/O features fail
with link errors.

2020-02-05  Sandra Loosemore  <sandra@codesourcery.com>

	PR libstdc++/79193
	PR libstdc++/88999

	config/
	* no-executables.m4: Use a non-empty program to test for linker
	support.

	libstdc++v-3/
	* configure: Regenerated.
---
 config/ChangeLog         | 8 ++++++++
 config/no-executables.m4 | 4 +++-
 libstdc++-v3/ChangeLog   | 7 +++++++
 libstdc++-v3/configure   | 4 ++--
 4 files changed, 20 insertions(+), 3 deletions(-)

diff --git a/config/ChangeLog b/config/ChangeLog
index f1fec81..d2a12bd 100644
--- a/config/ChangeLog
+++ b/config/ChangeLog
@@ -1,3 +1,11 @@ 
+2020-02-05  Sandra Loosemore  <sandra@codesourcery.com>
+
+	PR libstdc++/79193
+	PR libstdc++/88999
+
+	* no-executables.m4: Use a non-empty program to test for linker
+	support.
+
 2020-02-01  Andrew Burgess  <andrew.burgess@embecosm.com>
 
 	* lib-link.m4 (AC_LIB_LINKFLAGS_BODY): Update shell syntax.
diff --git a/config/no-executables.m4 b/config/no-executables.m4
index 9061624..6842f84 100644
--- a/config/no-executables.m4
+++ b/config/no-executables.m4
@@ -25,7 +25,9 @@  AC_BEFORE([$0], [_AC_COMPILER_EXEEXT])
 AC_BEFORE([$0], [AC_LINK_IFELSE])
 
 m4_define([_AC_COMPILER_EXEEXT],
-[AC_LANG_CONFTEST([AC_LANG_PROGRAM()])
+[AC_LANG_CONFTEST([AC_LANG_PROGRAM(
+		     [#include <stdio.h>],
+		     [printf ("hello world\n");])])
 # FIXME: Cleanup?
 AS_IF([AC_TRY_EVAL(ac_link)], [gcc_no_link=no], [gcc_no_link=yes])
 if test x$gcc_no_link = xyes; then
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index 76a6e2b..46ab7c0 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,3 +1,10 @@ 
+2020-02-05  Sandra Loosemore  <sandra@codesourcery.com>
+
+	PR libstdc++/79193
+	PR libstdc++/88999
+
+	* configure: Regenerated.
+
 2020-02-05  Jonathan Wakely  <jwakely@redhat.com>
 
 	* include/bits/iterator_concepts.h (iter_reference_t)
diff --git a/libstdc++-v3/configure b/libstdc++-v3/configure
index a39c33b..9f9c5a2 100755
--- a/libstdc++-v3/configure
+++ b/libstdc++-v3/configure
@@ -4130,11 +4130,11 @@  done
 
 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
-
+#include <stdio.h>
 int
 main ()
 {
-
+printf ("hello world\n");
   ;
   return 0;
 }
-- 
2.8.1