forked from pool/binutils
128 lines
5.4 KiB
Diff
128 lines
5.4 KiB
Diff
|
From e9c1bdad269c0c3352eebcc9481ed65144001b0b Mon Sep 17 00:00:00 2001
|
||
|
From: Cary Coutant <ccoutant@google.com>
|
||
|
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/layout.cc | 3 ++-
|
||
|
gold/options.cc | 7 -------
|
||
|
gold/symtab.h | 6 ++----
|
||
|
gold/testsuite/Makefile.am | 2 +-
|
||
|
gold/testsuite/Makefile.in | 2 +-
|
||
|
5 files changed, 6 insertions(+), 14 deletions(-)
|
||
|
|
||
|
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 $@ $<
|
||
|
|
||
|
--
|
||
|
1.9.4
|