diff options
author | Sriraman Tallam <tmsriram@google.com> | 2018-02-15 17:35:16 -0800 |
---|---|---|
committer | Sriraman Tallam <tmsriram@google.com> | 2018-04-27 13:06:07 -0700 |
commit | 4ba9ba2ceb8ca16d414c5ec8f5f48792e60165e5 (patch) | |
tree | 5e5816b1f56c2105d3a0bced3773e64a3533a642 | |
parent | af0200d544c0a00a805f2ed86e9e5776cca22266 (diff) | |
download | gdb-4ba9ba2ceb8ca16d414c5ec8f5f48792e60165e5.zip gdb-4ba9ba2ceb8ca16d414c5ec8f5f48792e60165e5.tar.gz gdb-4ba9ba2ceb8ca16d414c5ec8f5f48792e60165e5.tar.bz2 |
Fix symbol resolution with linker plugins for defsym symbols.
2018-02-07 Sriraman Tallam <tmsriram@google.com>
* expression.cc (Symbol_expression::set_expr_sym_in_real_elf):
New method.
(Unary_expression::set_expr_sym_in_real_elf): New method.
(Binary_expression::set_expr_sym_in_real_elf): New method.
(Trinary_expression::set_expr_sym_in_real_elf): New method.
* plugin.cc (get_symbol_resolution_info): Fix symbol resolution if
defined or used in defsyms.
* plugin.h (Plugin_manager::is_defsym_def): New method.
(Plugin_manager::Plugin_manager): Initialize defsym_defines_set_.
(Plugin_manager::defsym_defines_set_): New member.
(Plugin_manager::Defsym_defines_set): New typedef.
* script.cc (Script_options::set_defsym_uses_in_real_elf): New method.
(Script_options::find_defsym_defs): New method.
* script.h (Expression::set_expr_sym_in_real_elf): New method.
(Symbol_assignment::is_defsym): New method.
(Symbol_assignment::value): New method.
(Script_options::find_defsym_defs): New method.
(Script_options::set_defsym_uses_in_real_elf): New method.
* testsuite/Makefile.am (plugin_test_defsym): New test.
* testsuite/Makefile.in: Regenerate.
* testsuite/plugin_test.c: Check for new symbol resolution.
* testsuite/plugin_test_defsym.sh: New script.
* testsuite/plugin_test_defsym.c: New test source.
(cherry picked from commit 3281b315c89caf1d539a316e41cc095e46482f75)
-rw-r--r-- | gold/ChangeLog | 29 | ||||
-rw-r--r-- | gold/expression.cc | 27 | ||||
-rw-r--r-- | gold/plugin.cc | 19 | ||||
-rw-r--r-- | gold/plugin.h | 13 | ||||
-rw-r--r-- | gold/script.cc | 23 | ||||
-rw-r--r-- | gold/script.h | 21 | ||||
-rw-r--r-- | gold/testsuite/Makefile.am | 13 | ||||
-rw-r--r-- | gold/testsuite/Makefile.in | 63 | ||||
-rw-r--r-- | gold/testsuite/plugin_test_defsym.c | 32 | ||||
-rwxr-xr-x | gold/testsuite/plugin_test_defsym.sh | 52 |
10 files changed, 272 insertions, 20 deletions
diff --git a/gold/ChangeLog b/gold/ChangeLog index ddcc0d7..b6d08fc6 100644 --- a/gold/ChangeLog +++ b/gold/ChangeLog @@ -1,3 +1,32 @@ +2018-04-27 Sriraman Tallam <tmsriram@google.com> + Apply from master: + 2018-02-07 Sriraman Tallam <tmsriram@google.com> + + * expression.cc (Symbol_expression::set_expr_sym_in_real_elf): + New method. + (Unary_expression::set_expr_sym_in_real_elf): New method. + (Binary_expression::set_expr_sym_in_real_elf): New method. + (Trinary_expression::set_expr_sym_in_real_elf): New method. + * plugin.cc (get_symbol_resolution_info): Fix symbol resolution if + defined or used in defsyms. + * plugin.h (Plugin_manager::is_defsym_def): New method. + (Plugin_manager::Plugin_manager): Initialize defsym_defines_set_. + (Plugin_manager::defsym_defines_set_): New member. + (Plugin_manager::Defsym_defines_set): New typedef. + * script.cc (Script_options::set_defsym_uses_in_real_elf): New method. + (Script_options::find_defsym_defs): New method. + * script.h (Expression::set_expr_sym_in_real_elf): New method. + (Symbol_assignment::is_defsym): New method. + (Symbol_assignment::value): New method. + (Script_options::find_defsym_defs): New method. + (Script_options::set_defsym_uses_in_real_elf): New method. + * testsuite/Makefile.am (plugin_test_defsym): New test. + * testsuite/Makefile.in: Regenerate. + * testsuite/plugin_test.c: Check for new symbol resolution. + * testsuite/plugin_test_defsym.sh: New script. + * testsuite/plugin_test_defsym.c: New test source. + + 2018-04-04 Eric Christopher <echristo@gmail.com> Apply from master: diff --git a/gold/expression.cc b/gold/expression.cc index 2b598cd..42c45eb 100644 --- a/gold/expression.cc +++ b/gold/expression.cc @@ -206,6 +206,14 @@ class Symbol_expression : public Expression value(const Expression_eval_info*); void + set_expr_sym_in_real_elf(Symbol_table* symtab) const + { + Symbol* sym = symtab->lookup(this->name_.c_str()); + if (sym != NULL) + sym->set_in_real_elf(); + } + + void print(FILE* f) const { fprintf(f, "%s", this->name_.c_str()); } @@ -318,6 +326,10 @@ class Unary_expression : public Expression arg_print(FILE* f) const { this->arg_->print(f); } + void + set_expr_sym_in_real_elf(Symbol_table* symtab) const + { return this->arg_->set_expr_sym_in_real_elf(symtab); } + private: Expression* arg_; }; @@ -437,6 +449,13 @@ class Binary_expression : public Expression fprintf(f, ")"); } + void + set_expr_sym_in_real_elf(Symbol_table* symtab) const + { + this->left_->set_expr_sym_in_real_elf(symtab); + this->right_->set_expr_sym_in_real_elf(symtab); + } + private: Expression* left_; Expression* right_; @@ -622,6 +641,14 @@ class Trinary_expression : public Expression arg3_print(FILE* f) const { this->arg3_->print(f); } + void + set_expr_sym_in_real_elf(Symbol_table* symtab) const + { + this->arg1_->set_expr_sym_in_real_elf(symtab); + this->arg2_->set_expr_sym_in_real_elf(symtab); + this->arg3_->set_expr_sym_in_real_elf(symtab); + } + private: Expression* arg1_; Expression* arg2_; diff --git a/gold/plugin.cc b/gold/plugin.cc index c051805..0284162 100644 --- a/gold/plugin.cc +++ b/gold/plugin.cc @@ -557,6 +557,11 @@ Plugin_manager::all_symbols_read(Workqueue* workqueue, Task* task, this->mapfile_ = mapfile; this->this_blocker_ = NULL; + // Set symbols used in defsym expressions as seen in real ELF. + Layout *layout = parameters->options().plugins()->layout(); + layout->script_options()->set_defsym_uses_in_real_elf(symtab); + layout->script_options()->find_defsym_defs(this->defsym_defines_set_); + for (this->current_ = this->plugins_.begin(); this->current_ != this->plugins_.end(); ++this->current_) @@ -964,6 +969,7 @@ Pluginobj::get_symbol_resolution_info(Symbol_table* symtab, return version > 2 ? LDPS_NO_SYMS : LDPS_OK; } + Plugin_manager* plugins = parameters->options().plugins(); for (int i = 0; i < nsyms; i++) { ld_plugin_symbol* isym = &syms[i]; @@ -972,9 +978,16 @@ Pluginobj::get_symbol_resolution_info(Symbol_table* symtab, lsym = symtab->resolve_forwards(lsym); ld_plugin_symbol_resolution res = LDPR_UNKNOWN; - if (lsym->is_undefined()) - // The symbol remains undefined. - res = LDPR_UNDEF; + if (plugins->is_defsym_def(lsym->name())) + { + // The symbol is redefined via defsym. + res = LDPR_PREEMPTED_REG; + } + else if (lsym->is_undefined()) + { + // The symbol remains undefined. + res = LDPR_UNDEF; + } else if (isym->def == LDPK_UNDEF || isym->def == LDPK_WEAKUNDEF || isym->def == LDPK_COMMON) diff --git a/gold/plugin.h b/gold/plugin.h index 7658668..71f2c31 100644 --- a/gold/plugin.h +++ b/gold/plugin.h @@ -135,11 +135,18 @@ class Plugin_manager options_(options), workqueue_(NULL), task_(NULL), input_objects_(NULL), symtab_(NULL), layout_(NULL), dirpath_(NULL), mapfile_(NULL), this_blocker_(NULL), extra_search_path_(), lock_(NULL), - initialize_lock_(&lock_) + initialize_lock_(&lock_), defsym_defines_set_() { this->current_ = plugins_.end(); } ~Plugin_manager(); + // Returns true if the symbol name is used in the LHS of a defsym. + bool + is_defsym_def(const char* sym_name) const + { + return defsym_defines_set_.find(sym_name) != defsym_defines_set_.end(); + } + // Add a plugin library. void add_plugin(const char* filename) @@ -383,6 +390,10 @@ class Plugin_manager std::string extra_search_path_; Lock* lock_; Initialize_lock initialize_lock_; + + // Keep track of all symbols defined by defsym. + typedef Unordered_set<std::string> Defsym_defines_set; + Defsym_defines_set defsym_defines_set_; }; diff --git a/gold/script.cc b/gold/script.cc index 67540a5..f7e0fb6 100644 --- a/gold/script.cc +++ b/gold/script.cc @@ -1112,6 +1112,29 @@ Script_options::is_pending_assignment(const char* name) return false; } +// Populates the set with symbols defined in defsym LHS. + +void Script_options::find_defsym_defs(Unordered_set<std::string>& defsym_set) +{ + for (Symbol_assignments::const_iterator p = this->symbol_assignments_.begin(); + p != this->symbol_assignments_.end(); + ++p) + { + defsym_set.insert((*p)->name()); + } +} + +void +Script_options::set_defsym_uses_in_real_elf(Symbol_table* symtab) const +{ + for (Symbol_assignments::const_iterator p = this->symbol_assignments_.begin(); + p != this->symbol_assignments_.end(); + ++p) + { + (*p)->value()->set_expr_sym_in_real_elf(symtab); + } +} + // Add a symbol to be defined. void diff --git a/gold/script.h b/gold/script.h index 4f2f4fd..10f59d2 100644 --- a/gold/script.h +++ b/gold/script.h @@ -129,13 +129,17 @@ class Expression virtual uint64_t value(const Expression_eval_info*) = 0; + // Sets all symbols used in expressions as seen in a real ELF object. + virtual void + set_expr_sym_in_real_elf(Symbol_table*) const + { return; } + private: // May not be copied. Expression(const Expression&); Expression& operator=(const Expression&); }; - // Version_script_info stores information parsed from the version // script, either provided by --version-script or as part of a linker // script. A single Version_script_info object per target is owned by @@ -344,6 +348,14 @@ class Symbol_assignment void finalize(Symbol_table*, const Layout*); + bool + is_defsym() const + { return is_defsym_; } + + Expression * + value() const + { return val_; } + // Finalize the symbol value when it can refer to the dot symbol. void finalize_with_dot(Symbol_table*, const Layout*, uint64_t dot_value, @@ -454,6 +466,13 @@ class Script_options bool define_symbol(const char* definition); + // Populates the set with symbol names used in LHS of defsym. + void + find_defsym_defs(Unordered_set<std::string>&); + + // Set symbols used in defsym expressions as seen in a real ELF object. + void set_defsym_uses_in_real_elf(Symbol_table*) const; + // Create sections required by any linker scripts. void create_script_sections(Layout*); diff --git a/gold/testsuite/Makefile.am b/gold/testsuite/Makefile.am index 738adfa..9b7b6be 100644 --- a/gold/testsuite/Makefile.am +++ b/gold/testsuite/Makefile.am @@ -2318,11 +2318,22 @@ plugin_test_start_lib: unused.o plugin_start_lib_test.o plugin_start_lib_test_2. plugin_test_start_lib.err: plugin_test_start_lib @touch plugin_test_start_lib.err +check_PROGRAMS += plugin_test_defsym +check_SCRIPTS += plugin_test_defsym.sh +check_DATA += plugin_test_defsym.err +MOSTLYCLEANFILES += plugin_test_defsym.err +plugin_test_defsym.syms: plugin_test_defsym.o + $(TEST_READELF) -sW $< >$@ 2>/dev/null +plugin_test_defsym.o: plugin_test_defsym.c + $(COMPILE) -c -o $@ $< +plugin_test_defsym: plugin_test_defsym.o plugin_test_defsym.syms gcctestdir/ld plugin_test.so + $(CXXLINK) -Bgcctestdir/ -Wl,--no-demangle,--plugin,"./plugin_test.so" -Wl,--defsym,bar=foo plugin_test_defsym.syms 2>plugin_test_defsym.err +plugin_test_defsym.err: plugin_test_defsym + @touch plugin_test_defsym.err plugin_start_lib_test_2.syms: plugin_start_lib_test_2.o $(TEST_READELF) -sW $< >$@ 2>/dev/null - plugin_test.so: plugin_test.o gcctestdir/ld $(LINK) -Bgcctestdir/ -shared plugin_test.o plugin_test.o: plugin_test.c diff --git a/gold/testsuite/Makefile.in b/gold/testsuite/Makefile.in index 2aa2737..5a82886 100644 --- a/gold/testsuite/Makefile.in +++ b/gold/testsuite/Makefile.in @@ -522,7 +522,8 @@ check_PROGRAMS = $(am__EXEEXT_1) $(am__EXEEXT_2) $(am__EXEEXT_3) \ @GCC_TRUE@@NATIVE_LINKER_TRUE@@PLUGINS_TRUE@ plugin_test_8 \ @GCC_TRUE@@NATIVE_LINKER_TRUE@@PLUGINS_TRUE@ plugin_test_10 \ @GCC_TRUE@@NATIVE_LINKER_TRUE@@PLUGINS_TRUE@ plugin_test_11 \ -@GCC_TRUE@@NATIVE_LINKER_TRUE@@PLUGINS_TRUE@ plugin_test_start_lib +@GCC_TRUE@@NATIVE_LINKER_TRUE@@PLUGINS_TRUE@ plugin_test_start_lib \ +@GCC_TRUE@@NATIVE_LINKER_TRUE@@PLUGINS_TRUE@ plugin_test_defsym @GCC_TRUE@@NATIVE_LINKER_TRUE@@PLUGINS_TRUE@am__append_45 = \ @GCC_TRUE@@NATIVE_LINKER_TRUE@@PLUGINS_TRUE@ plugin_test_1.sh \ @GCC_TRUE@@NATIVE_LINKER_TRUE@@PLUGINS_TRUE@ plugin_test_2.sh \ @@ -532,7 +533,8 @@ check_PROGRAMS = $(am__EXEEXT_1) $(am__EXEEXT_2) $(am__EXEEXT_3) \ @GCC_TRUE@@NATIVE_LINKER_TRUE@@PLUGINS_TRUE@ plugin_test_7.sh \ @GCC_TRUE@@NATIVE_LINKER_TRUE@@PLUGINS_TRUE@ plugin_test_10.sh \ @GCC_TRUE@@NATIVE_LINKER_TRUE@@PLUGINS_TRUE@ plugin_test_11.sh \ -@GCC_TRUE@@NATIVE_LINKER_TRUE@@PLUGINS_TRUE@ plugin_test_start_lib.sh +@GCC_TRUE@@NATIVE_LINKER_TRUE@@PLUGINS_TRUE@ plugin_test_start_lib.sh \ +@GCC_TRUE@@NATIVE_LINKER_TRUE@@PLUGINS_TRUE@ plugin_test_defsym.sh # Test that symbols known in the IR file but not in the replacement file # produce an unresolved symbol error. @@ -551,7 +553,8 @@ check_PROGRAMS = $(am__EXEEXT_1) $(am__EXEEXT_2) $(am__EXEEXT_3) \ @GCC_TRUE@@NATIVE_LINKER_TRUE@@PLUGINS_TRUE@ plugin_test_9b.err \ @GCC_TRUE@@NATIVE_LINKER_TRUE@@PLUGINS_TRUE@ plugin_test_10.sections \ @GCC_TRUE@@NATIVE_LINKER_TRUE@@PLUGINS_TRUE@ plugin_test_11.err \ -@GCC_TRUE@@NATIVE_LINKER_TRUE@@PLUGINS_TRUE@ plugin_test_start_lib.err +@GCC_TRUE@@NATIVE_LINKER_TRUE@@PLUGINS_TRUE@ plugin_test_start_lib.err \ +@GCC_TRUE@@NATIVE_LINKER_TRUE@@PLUGINS_TRUE@ plugin_test_defsym.err # Make a copy of two_file_test_1.o, which does not define the symbol _Z4t16av. @GCC_TRUE@@NATIVE_LINKER_TRUE@@PLUGINS_TRUE@am__append_47 = \ @GCC_TRUE@@NATIVE_LINKER_TRUE@@PLUGINS_TRUE@ plugin_test_1.err \ @@ -567,7 +570,8 @@ check_PROGRAMS = $(am__EXEEXT_1) $(am__EXEEXT_2) $(am__EXEEXT_3) \ @GCC_TRUE@@NATIVE_LINKER_TRUE@@PLUGINS_TRUE@ plugin_test_10.sections \ @GCC_TRUE@@NATIVE_LINKER_TRUE@@PLUGINS_TRUE@ plugin_test_11.err \ @GCC_TRUE@@NATIVE_LINKER_TRUE@@PLUGINS_TRUE@ plugin_test_thin.a \ -@GCC_TRUE@@NATIVE_LINKER_TRUE@@PLUGINS_TRUE@ plugin_test_start_lib.err +@GCC_TRUE@@NATIVE_LINKER_TRUE@@PLUGINS_TRUE@ plugin_test_start_lib.err \ +@GCC_TRUE@@NATIVE_LINKER_TRUE@@PLUGINS_TRUE@ plugin_test_defsym.err @GCC_TRUE@@NATIVE_LINKER_TRUE@@PLUGINS_TRUE@@TLS_TRUE@am__append_48 = plugin_test_tls @GCC_TRUE@@NATIVE_LINKER_TRUE@@PLUGINS_TRUE@@TLS_TRUE@am__append_49 = plugin_test_tls.sh @GCC_TRUE@@NATIVE_LINKER_TRUE@@PLUGINS_TRUE@@TLS_TRUE@am__append_50 = plugin_test_tls.err @@ -1175,7 +1179,8 @@ libgoldtest_a_OBJECTS = $(am_libgoldtest_a_OBJECTS) @GCC_TRUE@@NATIVE_LINKER_TRUE@@PLUGINS_TRUE@ plugin_test_8$(EXEEXT) \ @GCC_TRUE@@NATIVE_LINKER_TRUE@@PLUGINS_TRUE@ plugin_test_10$(EXEEXT) \ @GCC_TRUE@@NATIVE_LINKER_TRUE@@PLUGINS_TRUE@ plugin_test_11$(EXEEXT) \ -@GCC_TRUE@@NATIVE_LINKER_TRUE@@PLUGINS_TRUE@ plugin_test_start_lib$(EXEEXT) +@GCC_TRUE@@NATIVE_LINKER_TRUE@@PLUGINS_TRUE@ plugin_test_start_lib$(EXEEXT) \ +@GCC_TRUE@@NATIVE_LINKER_TRUE@@PLUGINS_TRUE@ plugin_test_defsym$(EXEEXT) @GCC_TRUE@@NATIVE_LINKER_TRUE@@PLUGINS_TRUE@@TLS_TRUE@am__EXEEXT_25 = plugin_test_tls$(EXEEXT) @GCC_TRUE@@NATIVE_LINKER_TRUE@am__EXEEXT_26 = \ @GCC_TRUE@@NATIVE_LINKER_TRUE@ exclude_libs_test$(EXEEXT) \ @@ -1888,6 +1893,13 @@ plugin_test_8_DEPENDENCIES = libgoldtest.a ../libgold.a \ ../../libiberty/libiberty.a $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) +plugin_test_defsym_SOURCES = plugin_test_defsym.c +plugin_test_defsym_OBJECTS = plugin_test_defsym.$(OBJEXT) +plugin_test_defsym_LDADD = $(LDADD) +plugin_test_defsym_DEPENDENCIES = libgoldtest.a ../libgold.a \ + ../../libiberty/libiberty.a $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) plugin_test_start_lib_SOURCES = plugin_test_start_lib.c plugin_test_start_lib_OBJECTS = plugin_test_start_lib.$(OBJEXT) plugin_test_start_lib_LDADD = $(LDADD) @@ -2421,15 +2433,16 @@ SOURCES = $(libgoldtest_a_SOURCES) basic_pic_test.c basic_pie_test.c \ $(many_sections_test_SOURCES) $(object_unittest_SOURCES) \ $(overflow_unittest_SOURCES) permission_test.c \ $(pie_copyrelocs_test_SOURCES) plugin_test_1.c \ - plugin_test_10.c plugin_test_11.c plugin_test_2.c \ - plugin_test_3.c plugin_test_4.c plugin_test_5.c \ - plugin_test_6.c plugin_test_7.c plugin_test_8.c \ - plugin_test_start_lib.c plugin_test_tls.c pr17704a_test.c \ - $(pr20216a_test_SOURCES) $(pr20216b_test_SOURCES) \ - $(pr20216c_test_SOURCES) $(pr20216d_test_SOURCES) \ - $(pr20216e_test_SOURCES) $(pr20308a_test_SOURCES) \ - $(pr20308b_test_SOURCES) $(pr20308c_test_SOURCES) \ - $(pr20308d_test_SOURCES) $(pr20308e_test_SOURCES) pr20976.c \ + plugin_test_10.c plugin_test_11.c \ + plugin_test_2.c plugin_test_3.c plugin_test_4.c \ + plugin_test_5.c plugin_test_6.c plugin_test_7.c \ + plugin_test_8.c plugin_test_defsym.c plugin_test_start_lib.c \ + plugin_test_tls.c pr17704a_test.c $(pr20216a_test_SOURCES) \ + $(pr20216b_test_SOURCES) $(pr20216c_test_SOURCES) \ + $(pr20216d_test_SOURCES) $(pr20216e_test_SOURCES) \ + $(pr20308a_test_SOURCES) $(pr20308b_test_SOURCES) \ + $(pr20308c_test_SOURCES) $(pr20308d_test_SOURCES) \ + $(pr20308e_test_SOURCES) pr20976.c pr22266.c \ $(protected_1_SOURCES) $(protected_2_SOURCES) \ $(relro_now_test_SOURCES) $(relro_script_test_SOURCES) \ $(relro_strip_test_SOURCES) $(relro_test_SOURCES) \ @@ -4047,6 +4060,15 @@ pie_copyrelocs_test$(EXEEXT): $(pie_copyrelocs_test_OBJECTS) $(pie_copyrelocs_te @PLUGINS_FALSE@plugin_test_8$(EXEEXT): $(plugin_test_8_OBJECTS) $(plugin_test_8_DEPENDENCIES) $(EXTRA_plugin_test_8_DEPENDENCIES) @PLUGINS_FALSE@ @rm -f plugin_test_8$(EXEEXT) @PLUGINS_FALSE@ $(LINK) $(plugin_test_8_OBJECTS) $(plugin_test_8_LDADD) $(LIBS) +@GCC_FALSE@plugin_test_defsym$(EXEEXT): $(plugin_test_defsym_OBJECTS) $(plugin_test_defsym_DEPENDENCIES) $(EXTRA_plugin_test_defsym_DEPENDENCIES) +@GCC_FALSE@ @rm -f plugin_test_defsym$(EXEEXT) +@GCC_FALSE@ $(LINK) $(plugin_test_defsym_OBJECTS) $(plugin_test_defsym_LDADD) $(LIBS) +@NATIVE_LINKER_FALSE@plugin_test_defsym$(EXEEXT): $(plugin_test_defsym_OBJECTS) $(plugin_test_defsym_DEPENDENCIES) $(EXTRA_plugin_test_defsym_DEPENDENCIES) +@NATIVE_LINKER_FALSE@ @rm -f plugin_test_defsym$(EXEEXT) +@NATIVE_LINKER_FALSE@ $(LINK) $(plugin_test_defsym_OBJECTS) $(plugin_test_defsym_LDADD) $(LIBS) +@PLUGINS_FALSE@plugin_test_defsym$(EXEEXT): $(plugin_test_defsym_OBJECTS) $(plugin_test_defsym_DEPENDENCIES) $(EXTRA_plugin_test_defsym_DEPENDENCIES) +@PLUGINS_FALSE@ @rm -f plugin_test_defsym$(EXEEXT) +@PLUGINS_FALSE@ $(LINK) $(plugin_test_defsym_OBJECTS) $(plugin_test_defsym_LDADD) $(LIBS) @GCC_FALSE@plugin_test_start_lib$(EXEEXT): $(plugin_test_start_lib_OBJECTS) $(plugin_test_start_lib_DEPENDENCIES) $(EXTRA_plugin_test_start_lib_DEPENDENCIES) @GCC_FALSE@ @rm -f plugin_test_start_lib$(EXEEXT) @GCC_FALSE@ $(LINK) $(plugin_test_start_lib_OBJECTS) $(plugin_test_start_lib_LDADD) $(LIBS) @@ -4452,6 +4474,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plugin_test_6.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plugin_test_7.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plugin_test_8.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plugin_test_defsym.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plugin_test_start_lib.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plugin_test_tls.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pr17704a_test.Po@am__quote@ @@ -5220,6 +5243,8 @@ plugin_test_11.sh.log: plugin_test_11.sh @p='plugin_test_11.sh'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) plugin_test_start_lib.sh.log: plugin_test_start_lib.sh @p='plugin_test_start_lib.sh'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) +plugin_test_defsym.sh.log: plugin_test_defsym.sh + @p='plugin_test_defsym.sh'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) plugin_test_tls.sh.log: plugin_test_tls.sh @p='plugin_test_tls.sh'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) plugin_final_layout.sh.log: plugin_final_layout.sh @@ -5580,6 +5605,8 @@ plugin_test_11.log: plugin_test_11$(EXEEXT) @p='plugin_test_11$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) plugin_test_start_lib.log: plugin_test_start_lib$(EXEEXT) @p='plugin_test_start_lib$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) +plugin_test_defsym.log: plugin_test_defsym$(EXEEXT) + @p='plugin_test_defsym$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) plugin_test_tls.log: plugin_test_tls$(EXEEXT) @p='plugin_test_tls$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post) exclude_libs_test.log: exclude_libs_test$(EXEEXT) @@ -6929,6 +6956,14 @@ uninstall-am: @GCC_TRUE@@NATIVE_LINKER_TRUE@@PLUGINS_TRUE@ -Wl,--start-lib plugin_start_lib_test_2.syms -Wl,--end-lib 2>plugin_test_start_lib.err @GCC_TRUE@@NATIVE_LINKER_TRUE@@PLUGINS_TRUE@plugin_test_start_lib.err: plugin_test_start_lib @GCC_TRUE@@NATIVE_LINKER_TRUE@@PLUGINS_TRUE@ @touch plugin_test_start_lib.err +@GCC_TRUE@@NATIVE_LINKER_TRUE@@PLUGINS_TRUE@plugin_test_defsym.syms: plugin_test_defsym.o +@GCC_TRUE@@NATIVE_LINKER_TRUE@@PLUGINS_TRUE@ $(TEST_READELF) -sW $< >$@ 2>/dev/null +@GCC_TRUE@@NATIVE_LINKER_TRUE@@PLUGINS_TRUE@plugin_test_defsym.o: plugin_test_defsym.c +@GCC_TRUE@@NATIVE_LINKER_TRUE@@PLUGINS_TRUE@ $(COMPILE) -c -o $@ $< +@GCC_TRUE@@NATIVE_LINKER_TRUE@@PLUGINS_TRUE@plugin_test_defsym: plugin_test_defsym.o plugin_test_defsym.syms gcctestdir/ld plugin_test.so +@GCC_TRUE@@NATIVE_LINKER_TRUE@@PLUGINS_TRUE@ $(CXXLINK) -Bgcctestdir/ -Wl,--no-demangle,--plugin,"./plugin_test.so" -Wl,--defsym,bar=foo plugin_test_defsym.syms 2>plugin_test_defsym.err +@GCC_TRUE@@NATIVE_LINKER_TRUE@@PLUGINS_TRUE@plugin_test_defsym.err: plugin_test_defsym +@GCC_TRUE@@NATIVE_LINKER_TRUE@@PLUGINS_TRUE@ @touch plugin_test_defsym.err @GCC_TRUE@@NATIVE_LINKER_TRUE@@PLUGINS_TRUE@plugin_start_lib_test_2.syms: plugin_start_lib_test_2.o @GCC_TRUE@@NATIVE_LINKER_TRUE@@PLUGINS_TRUE@ $(TEST_READELF) -sW $< >$@ 2>/dev/null diff --git a/gold/testsuite/plugin_test_defsym.c b/gold/testsuite/plugin_test_defsym.c new file mode 100644 index 0000000..3b004c6 --- /dev/null +++ b/gold/testsuite/plugin_test_defsym.c @@ -0,0 +1,32 @@ +/* plugin_test_defsym.c -- a test case for gold + + Copyright (C) 2018 onwards Free Software Foundation, Inc. + Written by Sriraman Tallam <tmsriram@google.com> + + This file is part of gold. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +int foo(void); +int foo(void) { + return 0; +} + +int bar(void); + +int main(void) { + return bar(); +} diff --git a/gold/testsuite/plugin_test_defsym.sh b/gold/testsuite/plugin_test_defsym.sh new file mode 100755 index 0000000..6066f9b --- /dev/null +++ b/gold/testsuite/plugin_test_defsym.sh @@ -0,0 +1,52 @@ +#!/bin/sh + +# plugin_test_defsym.sh -- a test case for the plugin API. + +# Copyright (C) 2018 onwards Free Software Foundation, Inc. +# Written by Sriraman Tallam <tmsriram@google.com>. + +# This file is part of gold. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, +# MA 02110-1301, USA. + +# This file goes with plugin_test.c, a simple plug-in library that +# exercises the basic interfaces and prints out version numbers and +# options passed to the plugin. + +# This checks if the symbol resolution withe export dynamic symbol is +# as expected. + +check() +{ + if ! grep -q "$2" "$1" + then + echo "Did not find expected output in $1:" + echo " $2" + echo "" + echo "Actual output below:" + cat "$1" + exit 1 + fi +} + +check plugin_test_defsym.err "API version:" +check plugin_test_defsym.err "gold version:" +check plugin_test_defsym.err "plugin_test_defsym.syms: claim file hook called" +check plugin_test_defsym.err "plugin_test_defsym.syms: bar: PREEMPTED_REG" +check plugin_test_defsym.err "plugin_test_defsym.syms: foo: PREVAILING_DEF_REG" +check plugin_test_defsym.err "cleanup hook called" + +exit 0 |