Commit 5c181756 by Alexandre Oliva Committed by Alexandre Oliva

gcc.c (init_gcc_specs): Get -shared-libgcc along with -shared to link with shared_name only.

* gcc.c (init_gcc_specs): Get -shared-libgcc along with -shared to
link with shared_name only.
* doc/invoke.texi (Link Options): Document new behavior.

From-SVN: r50025
parent f36bcb2d
2002-02-25 Alexandre Oliva <aoliva@redhat.com>
* gcc.c (init_gcc_specs): Get -shared-libgcc along with -shared to
link with shared_name only.
* doc/invoke.texi (Link Options): Document new behavior.
2002-02-25 Aldy Hernandez <aldyh@redhat.com> 2002-02-25 Aldy Hernandez <aldyh@redhat.com>
* c-typeck.c (push_init_level): Handle vectors. * c-typeck.c (push_init_level): Handle vectors.
......
...@@ -4428,15 +4428,26 @@ of these is when the application wishes to throw and catch exceptions ...@@ -4428,15 +4428,26 @@ of these is when the application wishes to throw and catch exceptions
across different shared libraries. In that case, each of the libraries across different shared libraries. In that case, each of the libraries
as well as the application itself should use the shared @file{libgcc}. as well as the application itself should use the shared @file{libgcc}.
Therefore, whenever you specify the @option{-shared} option, the GCC Therefore, the G++ and GCJ drivers automatically add
driver automatically adds @option{-shared-libgcc}, unless you explicitly @option{-shared-libgcc} whenever you build a shared library or a main
specify @option{-static-libgcc}. The G++ driver automatically adds executable, because C++ and Java programs typically use exceptions, so
@option{-shared-libgcc} when you build a main executable as well because this is the right thing to do.
for C++ programs that is typically the right thing to do.
(Exception-handling will not work reliably otherwise.) If, instead, you use the GCC driver to create shared libraries, you may
find that they will not always be linked with the shared @file{libgcc}.
However, when linking a main executable written in C, you must If GCC finds, at its configuration time, that you have a GNU linker that
explicitly say @option{-shared-libgcc} if you want to use the shared does not support option @option{--eh-frame-hdr}, it will link the shared
version of @file{libgcc} into shared libraries by default. Otherwise,
it will take advantage of the linker and optimize away the linking with
the shared version of @file{libgcc}, linking with the static version of
libgcc by default. This allows exceptions to propagate through such
shared libraries, without incurring relocation costs at library load
time.
However, if a library or main executable is supposed to throw or catch
exceptions, you must link it using the G++ or GCJ driver, as appropriate
for the languages used in the program, or using the option
@option{-shared-libgcc}, such that it is linked with the shared
@file{libgcc}. @file{libgcc}.
@item -symbolic @item -symbolic
......
...@@ -1414,31 +1414,23 @@ init_gcc_specs (obstack, shared_name, static_name, eh_name) ...@@ -1414,31 +1414,23 @@ init_gcc_specs (obstack, shared_name, static_name, eh_name)
const char *static_name; const char *static_name;
const char *eh_name; const char *eh_name;
{ {
char buffer[128]; char *buf;
const char *p;
/* If we see -shared-libgcc, then use the shared version. */ buf = concat ("%{!shared:%{!shared-libgcc:", static_name, " ",
sprintf (buffer, "%%{shared-libgcc:%s %s}", shared_name, static_name); eh_name, "}%{shared-libgcc:", shared_name, " ",
obstack_grow (obstack, buffer, strlen (buffer)); static_name, "}}",
/* If we see -static-libgcc, then use the static version. */ "%{shared:%{static-libgcc:", static_name, " ",
sprintf (buffer, "%%{static-libgcc:%s %s}", static_name, eh_name); eh_name, "}%{!static-libgcc:",
obstack_grow (obstack, buffer, strlen (buffer));
/* Otherwise, if we see -shared, then use the shared version
if using EH registration routines or static version without
exception handling routines otherwise. */
p = "%{!shared-libgcc:%{!static-libgcc:%{shared:";
obstack_grow (obstack, p, strlen (p));
#ifdef LINK_EH_SPEC #ifdef LINK_EH_SPEC
sprintf (buffer, "%s}}}", static_name); "%{shared-libgcc:", shared_name,
"}%{!shared-libgcc:", static_name, "}",
#else #else
sprintf (buffer, "%s}}}", shared_name); shared_name,
#endif #endif
obstack_grow (obstack, buffer, strlen (buffer)); "}}", NULL);
/* Otherwise, use the static version. */
sprintf (buffer, obstack_grow (obstack, buf, strlen (buf));
"%%{!shared-libgcc:%%{!static-libgcc:%%{!shared:%s %s}}}", free (buf);
static_name, eh_name);
obstack_grow (obstack, buffer, strlen (buffer));
} }
#endif /* ENABLE_SHARED_LIBGCC */ #endif /* ENABLE_SHARED_LIBGCC */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment