Re: [PATCH] Add --with-static-standard-libraries to the top level

2019-08-19 Thread Tom Tromey
> "Jonathan" == Jonathan Wakely  writes:

Jonathan> Given that the problem does exist, I think being able to disable the
Jonathan> GCC build flags for non-GCC components in the build tree makes sense.
Jonathan> I'm not sure if Jeff deferring to me means I can approve the patch
Jonathan> (normally I can't approve top-level config stuff) but for whatever
Jonathan> it's worth, I approve the patch.

Thanks.  I understood his message as deferring to your judgment, so I am
going to check it in.

Tom


Re: [PATCH] Add --with-static-standard-libraries to the top level

2019-08-16 Thread Jonathan Wakely

On 13/08/19 09:18 -0600, Tom Tromey wrote:

Jonathan> What I don't understand is why GDB crashes. It should still be able to
Jonathan> catch exceptions from a shared library even if linked to libstdc++.a,
Jonathan> unless the static libstdc++.a is somehow incompatible with the shared
Jonathan> libstdc++.so the shared lib linked to.

Jonathan> Is this on GNU/Linux, or something with a different linking model?

GNU/Linux, Fedora 29 in particular.  I didn't look into why it fails but
the gcc docs specifically mention this problem:

'-static-libgcc'
[...]
There are several situations in which an application should use the
shared 'libgcc' instead of the static version.  The most common of
these is when the application wishes to throw and catch exceptions
across different shared libraries.  In that case, each of the
libraries as well as the application itself should use the shared
'libgcc'.


I was able to reproduce it with a simple test program:

   $ cd /tmp
   $ cat t.cc
   void thrower() {
 throw 23;
   }
   $ g++ -fPIC -shared -o libt.so t.cc
   $ cat a.cc
   extern void thrower ();

   int main () {
 try {
   thrower ();
 } catch (...) {
 }
 return 0;
   }
   $ g++ -o a -static-libgcc -static-libstdc++ a.cc -L$(pwd) -lt
   $ LD_LIBRARY_PATH=$(pwd) ./a
   Aborted (core dumped)


This works perfectly for me on F29, but I have no idea why I get
different results. I'll look into that separately.

Given that the problem does exist, I think being able to disable the
GCC build flags for non-GCC components in the build tree makes sense.
I'm not sure if Jeff deferring to me means I can approve the patch
(normally I can't approve top-level config stuff) but for whatever
it's worth, I approve the patch.




Re: [PATCH] Add --with-static-standard-libraries to the top level

2019-08-13 Thread Tom Tromey
Jonathan> What I don't understand is why GDB crashes. It should still be able to
Jonathan> catch exceptions from a shared library even if linked to libstdc++.a,
Jonathan> unless the static libstdc++.a is somehow incompatible with the shared
Jonathan> libstdc++.so the shared lib linked to.

Jonathan> Is this on GNU/Linux, or something with a different linking model?

GNU/Linux, Fedora 29 in particular.  I didn't look into why it fails but
the gcc docs specifically mention this problem:

'-static-libgcc'
[...]
 There are several situations in which an application should use the
 shared 'libgcc' instead of the static version.  The most common of
 these is when the application wishes to throw and catch exceptions
 across different shared libraries.  In that case, each of the
 libraries as well as the application itself should use the shared
 'libgcc'.


I was able to reproduce it with a simple test program:

$ cd /tmp
$ cat t.cc 
void thrower() {
  throw 23;
}
$ g++ -fPIC -shared -o libt.so t.cc
$ cat a.cc
extern void thrower ();

int main () {
  try {
thrower ();
  } catch (...) {
  }
  return 0;
}
$ g++ -o a -static-libgcc -static-libstdc++ a.cc -L$(pwd) -lt
$ LD_LIBRARY_PATH=$(pwd) ./a
Aborted (core dumped)

thanks,
Tom


Re: [PATCH] Add --with-static-standard-libraries to the top level

2019-08-13 Thread Jonathan Wakely

On 08/08/19 14:53 -0600, Jeff Law wrote:

On 8/5/19 12:02 PM, Tom Tromey wrote:

gdb should normally not be linked with -static-libstdc++.  Currently
this has not caused problems, but it's incompatible with catching an
exception thrown from a shared library -- and a subsequent patch
changes gdb to do just this.

This patch adds a new --with-static-standard-libraries flag to the
top-level configure.  It defaults to "auto", which means enabled if
gcc is being built, and disabled otherwise.

Tom

2019-07-27  Tom Tromey  

* configure: Rebuild.
* configure.ac: Add --with-static-standard-libraries.

Deferring to Jon.

It might be worth reviewing:

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=56750

And this thread:


https://gcc.gnu.org/ml/gcc-patches/2018-02/msg00403.html


While I NAK'd Aldy's patch in the email thread, if Jon thinks we should
have this capability I won't object.


The new option (and its default value) seem reasonable to me. I don't
see why GDB should be forced to link to libstdc++.a just because GCC
wants to.

What I don't understand is why GDB crashes. It should still be able to
catch exceptions from a shared library even if linked to libstdc++.a,
unless the static libstdc++.a is somehow incompatible with the shared
libstdc++.so the shared lib linked to.

Is this on GNU/Linux, or something with a different linking model?



Re: [PATCH] Add --with-static-standard-libraries to the top level

2019-08-08 Thread Jeff Law
On 8/5/19 12:02 PM, Tom Tromey wrote:
> gdb should normally not be linked with -static-libstdc++.  Currently
> this has not caused problems, but it's incompatible with catching an
> exception thrown from a shared library -- and a subsequent patch
> changes gdb to do just this.
> 
> This patch adds a new --with-static-standard-libraries flag to the
> top-level configure.  It defaults to "auto", which means enabled if
> gcc is being built, and disabled otherwise.
> 
> Tom
> 
> 2019-07-27  Tom Tromey  
> 
>   * configure: Rebuild.
>   * configure.ac: Add --with-static-standard-libraries.
Deferring to Jon.

It might be worth reviewing:

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=56750

And this thread:

> https://gcc.gnu.org/ml/gcc-patches/2018-02/msg00403.html

While I NAK'd Aldy's patch in the email thread, if Jon thinks we should
have this capability I won't object.


jeff


[PATCH] Add --with-static-standard-libraries to the top level

2019-08-05 Thread Tom Tromey
gdb should normally not be linked with -static-libstdc++.  Currently
this has not caused problems, but it's incompatible with catching an
exception thrown from a shared library -- and a subsequent patch
changes gdb to do just this.

This patch adds a new --with-static-standard-libraries flag to the
top-level configure.  It defaults to "auto", which means enabled if
gcc is being built, and disabled otherwise.

Tom

2019-07-27  Tom Tromey  

* configure: Rebuild.
* configure.ac: Add --with-static-standard-libraries.

diff --git a/configure.ac b/configure.ac
index 854f71a34e5..7433badc217 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1602,6 +1602,19 @@ AC_ARG_WITH(stage1-libs,
 [stage1_libs=])
 AC_SUBST(stage1_libs)
 
+# Whether or not to use -static-libstdc++ and -static-libgcc.  The
+# default is yes if gcc is being built; no otherwise.  The reason for
+# this default is that gdb is sometimes linked against GNU Source
+# Highlight, which is a shared library that uses C++ exceptions.  In
+# this case, -static-libstdc++ will cause crashes.
+AC_ARG_WITH(static-standard-libraries,
+[AS_HELP_STRING([--with-static-standard-libraries],
+[use -static-libstdc++ and -static-libgcc (default=auto)])],
+[], [with_static_standard_libraries=auto])
+if test "$with_static_standard_libraries" = auto; then
+  with_static_standard_libraries=$have_compiler
+fi
+
 # Linker flags to use for stage1 or when not bootstrapping.
 AC_ARG_WITH(stage1-ldflags,
 [AS_HELP_STRING([--with-stage1-ldflags=FLAGS], [linker flags for stage1])],
@@ -1614,7 +1627,8 @@ AC_ARG_WITH(stage1-ldflags,
  # In stage 1, default to linking libstdc++ and libgcc statically with GCC
  # if supported.  But if the user explicitly specified the libraries to use,
  # trust that they are doing what they want.
- if test "$stage1_libs" = "" -a "$have_static_libs" = yes; then
+ if test "$with_static_standard_libraries" = yes -a "$stage1_libs" = "" \
+ -a "$have_static_libs" = yes; then
stage1_ldflags="-static-libstdc++ -static-libgcc"
  fi])
 AC_SUBST(stage1_ldflags)
-- 
2.20.1