diff mbox

RFA: PATCH to add -fno-gnu-unique for c++/60731

Message ID 533C63FB.6010704@redhat.com
State New
Headers show

Commit Message

Jason Merrill April 2, 2014, 7:24 p.m. UTC
Use of STB_GNU_UNIQUE to avoid problems with variable symbols shared 
between two RTLD_LOCAL plugins and a common library dependency causes 
problems with libraries that depend on dlclose/dlopen to reinitialize 
state.  This patch adds a -fno-gnu-unique flag that such libraries can use.

Tested x86_64-pc-linux-gnu.  OK for trunk?

Comments

Richard Biener April 3, 2014, 9:49 a.m. UTC | #1
On Wed, Apr 2, 2014 at 9:24 PM, Jason Merrill <jason@redhat.com> wrote:
> Use of STB_GNU_UNIQUE to avoid problems with variable symbols shared between
> two RTLD_LOCAL plugins and a common library dependency causes problems with
> libraries that depend on dlclose/dlopen to reinitialize state.  This patch
> adds a -fno-gnu-unique flag that such libraries can use.
>
> Tested x86_64-pc-linux-gnu.  OK for trunk?

Ok.  Can you add a testcase as well please?

Thanks,
Richard.
diff mbox

Patch

commit e9f123743831274cff1c135cf65bb222507bab32
Author: Jason Merrill <jason@redhat.com>
Date:   Wed Apr 2 15:10:32 2014 -0400

    	PR c++/60731
    	* common.opt (-fno-gnu-unique): Add.
    	* config/elfos.h (USE_GNU_UNIQUE_OBJECT): Check it.

diff --git a/gcc/common.opt b/gcc/common.opt
index 62c72f0..2259f29 100644
--- a/gcc/common.opt
+++ b/gcc/common.opt
@@ -1267,6 +1267,10 @@  fgnu-tm
 Common Report Var(flag_tm)
 Enable support for GNU transactional memory
 
+fgnu-unique
+Common Report Var(flag_gnu_unique) Init(1)
+Use STB_GNU_UNIQUE if supported by the assembler
+
 floop-flatten
 Common Ignore
 Does nothing. Preserved for backward compatibility.
diff --git a/gcc/config/elfos.h b/gcc/config/elfos.h
index 1fce701..c1d5553 100644
--- a/gcc/config/elfos.h
+++ b/gcc/config/elfos.h
@@ -287,7 +287,7 @@  see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
 /* Write the extra assembler code needed to declare an object properly.  */
 
 #ifdef HAVE_GAS_GNU_UNIQUE_OBJECT
-#define USE_GNU_UNIQUE_OBJECT 1
+#define USE_GNU_UNIQUE_OBJECT flag_gnu_unique
 #else
 #define USE_GNU_UNIQUE_OBJECT 0
 #endif
diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
index eca4e8f..2e78b8b 100644
--- a/gcc/doc/invoke.texi
+++ b/gcc/doc/invoke.texi
@@ -1070,6 +1070,7 @@  See S/390 and zSeries Options.
 -ffixed-@var{reg}  -fexceptions @gol
 -fnon-call-exceptions  -fdelete-dead-exceptions  -funwind-tables @gol
 -fasynchronous-unwind-tables @gol
+-fno-gnu-unique @gol
 -finhibit-size-directive  -finstrument-functions @gol
 -finstrument-functions-exclude-function-list=@var{sym},@var{sym},@dots{} @gol
 -finstrument-functions-exclude-file-list=@var{file},@var{file},@dots{} @gol
@@ -22015,6 +22016,20 @@  Generate unwind table in DWARF 2 format, if supported by target machine.  The
 table is exact at each instruction boundary, so it can be used for stack
 unwinding from asynchronous events (such as debugger or garbage collector).
 
+@item -fno-gnu-unique
+@opindex fno-gnu-unique
+On systems with recent GNU assembler and C library, the C++ compiler
+uses the @code{STB_GNU_UNIQUE} binding to make sure that definitions
+of template static data members and static local variables in inline
+functions are unique even in the presence of @code{RTLD_LOCAL}; this
+is necessary to avoid problems with a library used by two different
+@code{RTLD_LOCAL} plugins depending on a definition in one of them and
+therefore disagreeing with the other one about the binding of the
+symbol.  But this causes @code{dlclose} to be ignored for affected
+DSOs; if your program relies on reinitialization of a DSO via
+@code{dlclose} and @code{dlopen}, you can use
+@option{-fno-gnu-unique}.
+
 @item -fpcc-struct-return
 @opindex fpcc-struct-return
 Return ``short'' @code{struct} and @code{union} values in memory like