diff options
author | Cary Coutant <ccoutant@google.com> | 2015-02-16 22:15:12 -0800 |
---|---|---|
committer | Cary Coutant <ccoutant@google.com> | 2015-02-16 22:15:12 -0800 |
commit | e9c1bdad269c0c3352eebcc9481ed65144001b0b (patch) | |
tree | 0dabc7d3f20256f18f091b51f72de9b4c4f421bb /gold | |
parent | 0ed4b0bf3d2ca248778a2ffbcb2c5cafbfdd64dc (diff) | |
download | fsf-binutils-gdb-e9c1bdad269c0c3352eebcc9481ed65144001b0b.zip fsf-binutils-gdb-e9c1bdad269c0c3352eebcc9481ed65144001b0b.tar.gz fsf-binutils-gdb-e9c1bdad269c0c3352eebcc9481ed65144001b0b.tar.bz2 |
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.
Diffstat (limited to 'gold')
-rw-r--r-- | gold/ChangeLog | 14 | ||||
-rw-r--r-- | gold/layout.cc | 3 | ||||
-rw-r--r-- | gold/options.cc | 7 | ||||
-rw-r--r-- | gold/symtab.h | 6 | ||||
-rw-r--r-- | gold/testsuite/Makefile.am | 2 | ||||
-rw-r--r-- | gold/testsuite/Makefile.in | 2 |
6 files changed, 20 insertions, 14 deletions
diff --git a/gold/ChangeLog b/gold/ChangeLog index 3c431e9..3eed17a 100644 --- a/gold/ChangeLog +++ b/gold/ChangeLog @@ -1,5 +1,19 @@ 2015-02-16 Cary Coutant <ccoutant@google.com> + 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. + +2015-02-16 Cary Coutant <ccoutant@google.com> + PR gold/17971 * incremental.cc: Remove redundant include of "output.h". 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 $@ $< |