vapier      15/05/25 08:42:32

  Added:                88_all_gold-copy-relocs.patch
  Log:
  add fix from upstream for handling of COPY relocs in gold #549276 by Marcin 
Mirosław

Revision  Changes    Path
1.1                  src/patchsets/binutils/2.25/88_all_gold-copy-relocs.patch

file : 
http://sources.gentoo.org/viewvc.cgi/gentoo/src/patchsets/binutils/2.25/88_all_gold-copy-relocs.patch?rev=1.1&view=markup
plain: 
http://sources.gentoo.org/viewvc.cgi/gentoo/src/patchsets/binutils/2.25/88_all_gold-copy-relocs.patch?rev=1.1&content-type=text/plain

Index: 88_all_gold-copy-relocs.patch
===================================================================
https://bugs.gentoo.org/549276
https://sourceware.org/bugzilla/show_bug.cgi?id=16992

>From e9c1bdad269c0c3352eebcc9481ed65144001b0b Mon Sep 17 00:00:00 2001
From: Cary Coutant <[email protected]>
Date: Mon, 16 Feb 2015 22:15:12 -0800
Subject: [PATCH] Fix --dynamic-list so that symbols not in the list are still
 exported.

In PR 13577, the complaint was that -Bsymbolic was overriding the binding
behavior for symbols listed in the --dynamic-list by setting the DT_SYMBOLIC
tag in the dynamic table. In reading the Gnu ld manual, I decided that
--dynamic-list should be mutually exclusive of -Bsymbolic, and modified
gold so that --dynamic-list would treat symbols listed as preemptible,
and all other symbols as internally bound. I was wrong.

PR 16992 shows that with --dynamic-list (and not -Bsymbolic), a symbol
not listed in the dynamic list is being internally bound within the
shared library, but because it's still in the dynamic symbol table, we
expose it to a COPY relocation, and things go really bad from there.

(I can reproduce the same failure, simply by turning on -Bsymbolic-functions
with the Gnu linker. Even though the symbol is bound internally, it's
still exported to the dynamic symbol table, and is exposed to a COPY
relocation.)

I've backed out part of the fix for PR 13577, and -Bsymbolic (or
-Bsymbolic-functions) can now be used with --dynamic-list, but if the
two are used together, we do not set DT_SYMBOLIC or DF_SYMBOLIC
(this matches Gnu ld behavior). We now treat symbols listed in the
dynamic list as premptible, but we do not automatically treat symbols
not listed there as non-premptible.

gold/
        PR gold/13577
        PR gold/16992
        * layout.cc (Layout::finish_dynamic_section): Don't set DT_SYMBOLIC or
        DF_SYMBOLIC if --dynamic-list option is used.
        * options.cc (General_options::finalize): --dynamic-list is not
        mutually exclusive with -Bsymbolic.
        * symtab.h (Symbol::is_preemptible): Don't exclude dynamic symbols not
        listed in --dynamic-list.
        * testsuite/Makefile.am (dynamic_list_lib2.so): Add
        -Bsymbolic-functions.
        * testsuite/Makefile.in: Regenerate.
---
 gold/ChangeLog             | 14 ++++++++++++++
 gold/layout.cc             |  3 ++-
 gold/options.cc            |  7 -------
 gold/symtab.h              |  6 ++----
 gold/testsuite/Makefile.am |  2 +-
 gold/testsuite/Makefile.in |  2 +-
 6 files changed, 20 insertions(+), 14 deletions(-)

2015-02-16  Cary Coutant  <[email protected]>

        PR gold/13577
        PR gold/16992
        * layout.cc (Layout::finish_dynamic_section): Don't set DT_SYMBOLIC or
        DF_SYMBOLIC if --dynamic-list option is used.
        * options.cc (General_options::finalize): --dynamic-list is not
        mutually exclusive with -Bsymbolic.
        * symtab.h (Symbol::is_preemptible): Don't exclude dynamic symbols not
        listed in --dynamic-list.
        * testsuite/Makefile.am (dynamic_list_lib2.so): Add
        -Bsymbolic-functions.
        * testsuite/Makefile.in: Regenerate.

diff --git a/gold/layout.cc b/gold/layout.cc
index bcdaac8..7836640 100644
--- a/gold/layout.cc
+++ b/gold/layout.cc
@@ -4873,7 +4873,8 @@ Layout::finish_dynamic_section(const Input_objects* 
input_objects,
     flags |= elfcpp::DF_STATIC_TLS;
   if (parameters->options().origin())
     flags |= elfcpp::DF_ORIGIN;
-  if (parameters->options().Bsymbolic())
+  if (parameters->options().Bsymbolic()
+      && !parameters->options().have_dynamic_list())
     {
       flags |= elfcpp::DF_SYMBOLIC;
       // Add DT_SYMBOLIC for compatibility with older loaders.
diff --git a/gold/options.cc b/gold/options.cc
index 7eb8f27..7f1f69e 100644
--- a/gold/options.cc
+++ b/gold/options.cc
@@ -1200,13 +1200,6 @@ General_options::finalize()
   // in the path, as appropriate.
   this->add_sysroot();
 
-  // --dynamic-list overrides -Bsymbolic and -Bsymbolic-functions.
-  if (this->have_dynamic_list())
-    {
-      this->set_Bsymbolic(false);
-      this->set_Bsymbolic_functions(false);
-    }
-
   // Now that we've normalized the options, check for contradictory ones.
   if (this->shared() && this->is_static())
     gold_fatal(_("-shared and -static are incompatible"));
diff --git a/gold/symtab.h b/gold/symtab.h
index aa0cb68..9413360 100644
--- a/gold/symtab.h
+++ b/gold/symtab.h
@@ -604,10 +604,8 @@ class Symbol
     if (parameters->options().in_dynamic_list(this->name()))
       return true;
 
-    // If the user used -Bsymbolic or provided a --dynamic-list script,
-    // then nothing (else) is preemptible.
-    if (parameters->options().Bsymbolic()
-        || parameters->options().have_dynamic_list())
+    // If the user used -Bsymbolic, then nothing (else) is preemptible.
+    if (parameters->options().Bsymbolic())
       return false;
 
     // If the user used -Bsymbolic-functions, then functions are not
diff --git a/gold/testsuite/Makefile.am b/gold/testsuite/Makefile.am
index f767c21..7b73f9d 100644
--- a/gold/testsuite/Makefile.am
+++ b/gold/testsuite/Makefile.am
@@ -1518,7 +1518,7 @@ dynamic_list_lib1.o: dynamic_list_lib1.cc
        $(CXXCOMPILE) -c -fpic -o $@ $<
 
 dynamic_list_lib2.so: gcctestdir/ld dynamic_list_lib2.o 
$(srcdir)/dynamic_list_2.t
-       $(CXXLINK) -Bgcctestdir/ -shared 
-Wl,--dynamic-list,$(srcdir)/dynamic_list_2.t dynamic_list_lib2.o
+       $(CXXLINK) -Bgcctestdir/ -shared -Wl,-Bsymbolic-functions 
-Wl,--dynamic-list,$(srcdir)/dynamic_list_2.t dynamic_list_lib2.o
 dynamic_list_lib2.o: dynamic_list_lib2.cc
        $(CXXCOMPILE) -c -fpic -o $@ $<
 
diff --git a/gold/testsuite/Makefile.in b/gold/testsuite/Makefile.in
index 217e472..b4ae3fd 100644
--- a/gold/testsuite/Makefile.in
+++ b/gold/testsuite/Makefile.in
@@ -5319,7 +5319,7 @@ uninstall-am:
 @GCC_TRUE@@NATIVE_LINKER_TRUE@ $(CXXCOMPILE) -c -fpic -o $@ $<
 
 @GCC_TRUE@@NATIVE_LINKER_TRUE@dynamic_list_lib2.so: gcctestdir/ld 
dynamic_list_lib2.o $(srcdir)/dynamic_list_2.t
-@GCC_TRUE@@NATIVE_LINKER_TRUE@ $(CXXLINK) -Bgcctestdir/ -shared 
-Wl,--dynamic-list,$(srcdir)/dynamic_list_2.t dynamic_list_lib2.o
+@GCC_TRUE@@NATIVE_LINKER_TRUE@ $(CXXLINK) -Bgcctestdir/ -shared 
-Wl,-Bsymbolic-functions -Wl,--dynamic-list,$(srcdir)/dynamic_list_2.t 
dynamic_list_lib2.o
 @GCC_TRUE@@NATIVE_LINKER_TRUE@dynamic_list_lib2.o: dynamic_list_lib2.cc
 @GCC_TRUE@@NATIVE_LINKER_TRUE@ $(CXXCOMPILE) -c -fpic -o $@ $<
 
-- 
2.4.1





Reply via email to