This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
[gold commit] PR 23268: Fix problem where gold does not create base version for executables
- From: ccoutant at gmail dot com
- To: binutils at sourceware dot org
- Date: Wed, 20 Jun 2018 01:29:00 -0700
- Subject: [gold commit] PR 23268: Fix problem where gold does not create base version for executables
Gold previously did not create a base version in the verdefs table
when building an executable, nor did it assign anything other than
the global version index for definitions in an executable. This
patch removes those checks so that, for the most part, we will
build version definitions for an executable the same as for a
shared object.
-cary
2018-06-20 Cary Coutant <ccoutant@gmail.com>
gold/
PR gold/23268
* dynobj.cc (Versions::Versions): Change init for needs_base_version_.
(Versions::record_version): Add verdefs for both shared objects and
executables.
(Versions::add_def): Likewise for base version.
(Versions::add_need): Don't add base version for executables.
(Versions::version_index): Look up version for both shared objects and
executables.
* testsuite/Makefile.am (ver_test_14): New test case.
* testsuite/Makefile.in: Regenerate.
* testsuite/ver_test_14.script: New version script.
* testsuite/ver_test_14.sh: New test script.
diff --git a/gold/dynobj.cc b/gold/dynobj.cc
index 7012802d4f..75e7e7574e 100644
--- a/gold/dynobj.cc
+++ b/gold/dynobj.cc
@@ -1439,7 +1439,7 @@ Versions::Versions(const Version_script_info& version_script,
Stringpool* dynpool)
: defs_(), needs_(), version_table_(),
is_finalized_(false), version_script_(version_script),
- needs_base_version_(parameters->options().shared())
+ needs_base_version_(true)
{
if (!this->version_script_.empty())
{
@@ -1536,8 +1536,7 @@ Versions::record_version(const Symbol_table* symtab,
if (!sym->is_from_dynobj() && !sym->is_copied_from_dynobj())
{
- if (parameters->options().shared())
- this->add_def(dynpool, sym, version, version_key);
+ this->add_def(dynpool, sym, version, version_key);
}
else
{
@@ -1574,18 +1573,13 @@ Versions::add_def(Stringpool* dynpool, const Symbol* sym, const char* version,
// find a definition of a symbol with a version which is not
// in the version script.
if (parameters->options().shared())
- {
- gold_error(_("symbol %s has undefined version %s"),
- sym->demangled_name().c_str(), version);
- if (this->needs_base_version_)
- this->define_base_version(dynpool);
- }
- else
- // We only insert a base version for shared library.
- gold_assert(!this->needs_base_version_);
-
+ gold_error(_("symbol %s has undefined version %s"),
+ sym->demangled_name().c_str(), version);
+
// When creating a regular executable, automatically define
// a new version.
+ if (this->needs_base_version_)
+ this->define_base_version(dynpool);
Verdef* vd = new Verdef(version, std::vector<std::string>(),
false, false, false, false);
this->defs_.push_back(vd);
@@ -1631,7 +1625,7 @@ Versions::add_need(Stringpool* dynpool, const char* filename, const char* name,
if (vn == NULL)
{
// Create base version definition lazily for shared library.
- if (this->needs_base_version_)
+ if (parameters->options().shared() && this->needs_base_version_)
this->define_base_version(dynpool);
// We have a new filename.
@@ -1715,8 +1709,6 @@ Versions::version_index(const Symbol_table* symtab, const Stringpool* dynpool,
Key k;
if (!sym->is_from_dynobj() && !sym->is_copied_from_dynobj())
{
- if (!parameters->options().shared())
- return elfcpp::VER_NDX_GLOBAL;
k = Key(version_key, 0);
}
else
diff --git a/gold/testsuite/Makefile.am b/gold/testsuite/Makefile.am
index e019bfa5dc..b88b02f17d 100644
--- a/gold/testsuite/Makefile.am
+++ b/gold/testsuite/Makefile.am
@@ -1873,6 +1873,13 @@ ver_test_13.so: gcctestdir/ld ver_test_13.o ver_test_13.script
ver_test_13.o: ver_test_13.c
$(COMPILE) -c -fpic -o $@ $<
+check_SCRIPTS += ver_test_14.sh
+check_DATA += ver_test_14.syms
+ver_test_14.syms: ver_test_14
+ $(TEST_OBJDUMP) -T $< | $(TEST_CXXFILT) >$@
+ver_test_14: gcctestdir/ld ver_test_main.o ver_test_1.so ver_test_2.so ver_test_4.so ver_test_14.script
+ $(CXXLINK) -Bgcctestdir/ -Wl,--version-script,$(srcdir)/ver_test_14.script -Wl,-E -Wl,-R,. ver_test_main.o ver_test_1.so ver_test_2.so ver_test_4.so
+
check_PROGRAMS += protected_1
protected_1_SOURCES = \
protected_main_1.cc protected_main_2.cc protected_main_3.cc
diff --git a/gold/testsuite/Makefile.in b/gold/testsuite/Makefile.in
index 79cf6c7af5..e1b1762ecb 100644
--- a/gold/testsuite/Makefile.in
+++ b/gold/testsuite/Makefile.in
@@ -479,7 +479,7 @@ check_PROGRAMS = $(am__EXEEXT_1) $(am__EXEEXT_2) $(am__EXEEXT_3) \
@GCC_TRUE@@NATIVE_LINKER_TRUE@ ver_test_4.sh ver_test_5.sh \
@GCC_TRUE@@NATIVE_LINKER_TRUE@ ver_test_7.sh ver_test_8.sh \
@GCC_TRUE@@NATIVE_LINKER_TRUE@ ver_test_10.sh ver_test_13.sh \
-@GCC_TRUE@@NATIVE_LINKER_TRUE@ relro_test.sh \
+@GCC_TRUE@@NATIVE_LINKER_TRUE@ ver_test_14.sh relro_test.sh \
@GCC_TRUE@@NATIVE_LINKER_TRUE@ ver_matching_test.sh \
@GCC_TRUE@@NATIVE_LINKER_TRUE@ script_test_3.sh \
@GCC_TRUE@@NATIVE_LINKER_TRUE@ script_test_4.sh \
@@ -533,7 +533,8 @@ check_PROGRAMS = $(am__EXEEXT_1) $(am__EXEEXT_2) $(am__EXEEXT_3) \
@GCC_TRUE@@NATIVE_LINKER_TRUE@ ver_test_7.syms \
@GCC_TRUE@@NATIVE_LINKER_TRUE@ ver_test_8_2.so.syms \
@GCC_TRUE@@NATIVE_LINKER_TRUE@ ver_test_10.syms \
-@GCC_TRUE@@NATIVE_LINKER_TRUE@ ver_test_13.syms protected_3.err \
+@GCC_TRUE@@NATIVE_LINKER_TRUE@ ver_test_13.syms \
+@GCC_TRUE@@NATIVE_LINKER_TRUE@ ver_test_14.syms protected_3.err \
@GCC_TRUE@@NATIVE_LINKER_TRUE@ relro_test.stdout \
@GCC_TRUE@@NATIVE_LINKER_TRUE@ ver_matching_test.stdout \
@GCC_TRUE@@NATIVE_LINKER_TRUE@ script_test_3.stdout \
@@ -5794,6 +5795,13 @@ ver_test_13.sh.log: ver_test_13.sh
--log-file $$b.log --trs-file $$b.trs \
$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
"$$tst" $(AM_TESTS_FD_REDIRECT)
+ver_test_14.sh.log: ver_test_14.sh
+ @p='ver_test_14.sh'; \
+ b='ver_test_14.sh'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
relro_test.sh.log: relro_test.sh
@p='relro_test.sh'; \
b='relro_test.sh'; \
@@ -8700,6 +8708,10 @@ uninstall-am:
@GCC_TRUE@@NATIVE_LINKER_TRUE@ $(LINK) -Bgcctestdir/ -shared -Wl,--version-script,$(srcdir)/ver_test_13.script ver_test_13.o
@GCC_TRUE@@NATIVE_LINKER_TRUE@ver_test_13.o: ver_test_13.c
@GCC_TRUE@@NATIVE_LINKER_TRUE@ $(COMPILE) -c -fpic -o $@ $<
+@GCC_TRUE@@NATIVE_LINKER_TRUE@ver_test_14.syms: ver_test_14
+@GCC_TRUE@@NATIVE_LINKER_TRUE@ $(TEST_OBJDUMP) -T $< | $(TEST_CXXFILT) >$@
+@GCC_TRUE@@NATIVE_LINKER_TRUE@ver_test_14: gcctestdir/ld ver_test_main.o ver_test_1.so ver_test_2.so ver_test_4.so ver_test_14.script
+@GCC_TRUE@@NATIVE_LINKER_TRUE@ $(CXXLINK) -Bgcctestdir/ -Wl,--version-script,$(srcdir)/ver_test_14.script -Wl,-E -Wl,-R,. ver_test_main.o ver_test_1.so ver_test_2.so ver_test_4.so
@GCC_TRUE@@NATIVE_LINKER_TRUE@protected_1.so: gcctestdir/ld protected_1_pic.o protected_2_pic.o protected_3_pic.o
@GCC_TRUE@@NATIVE_LINKER_TRUE@ $(CXXLINK) -Bgcctestdir/ -shared protected_1_pic.o protected_2_pic.o protected_3_pic.o