This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[gold][patch] Fix plugin API so that add_symbols is not required


This patch fixes the gold plugin API so that the add_symbols callback
does not need to be called if the claimed file has no global symbols.
Previously, gold would issue a link error in this case and then go on
to try to process the claimed file as an ordinary object.

The patch also moves the LDPT_MESSAGE entry to the front of the
transfer vector so that the plugin can use that API while processing
subsequent entries, and fixes a possible array bounds error if the
plugin asks for more symbols than it provided.

OK?

-cary


	* plugin.cc (Plugin::load): Move LDPT_MESSAGE to front of transfer
	vector.
	(Plugin_manager::claim_file): Create plugin object even if
	plugin did not call the add_symbols callback.
	(Plugin_obj::get_symbol_resolution_info): Guard against plugin
	asking for more symbols than were added.

	* testsuite/Makefile.am (plugin_test_1): Add test case with
	no global symbols.
	(empty.syms): New target.
	* testsuite/Makefile.in: Regenerate.
	* testsuite/plugin_test.c (claim_file_hook): Add new debug
	message. Don't call add_symbols if no globals.
	(all_symbols_read_hook): Don't provide replacement for empty
	claimed file.


Index: plugin.cc
===================================================================
RCS file: /cvs/src/src/gold/plugin.cc,v
retrieving revision 1.4
diff -u -p -r1.4 plugin.cc
--- plugin.cc	5 Dec 2008 21:34:50 -0000	1.4
+++ plugin.cc	16 Dec 2008 00:33:58 -0000
@@ -116,7 +116,13 @@ Plugin::load()
   int tv_size = this->args_.size() + tv_fixed_size;
   ld_plugin_tv *tv = new ld_plugin_tv[tv_size];

+  // Put LDPT_MESSAGE at the front of the list so the plugin can use it
+  // while processing subsequent entries.
   int i = 0;
+  tv[i].tv_tag = LDPT_MESSAGE;
+  tv[i].tv_u.tv_message = message;
+
+  ++i;
   tv[i].tv_tag = LDPT_API_VERSION;
   tv[i].tv_u.tv_val = LD_PLUGIN_API_VERSION;

@@ -165,10 +171,6 @@ Plugin::load()
   tv[i].tv_u.tv_add_input_file = add_input_file;

   ++i;
-  tv[i].tv_tag = LDPT_MESSAGE;
-  tv[i].tv_u.tv_message = message;
-
-  ++i;
   tv[i].tv_tag = LDPT_NULL;
   tv[i].tv_u.tv_val = 0;

@@ -265,14 +267,13 @@ Plugin_manager::claim_file(Input_file* i
     {
       if ((*this->current_)->claim_file(&this->plugin_input_file_))
         {
-          if (this->objects_.size() <= handle)
-            {
-              gold_error(_("%s: plugin claimed the file "
-                           "but did not provide any symbols"),
-                         this->plugin_input_file_.name);
-              return NULL;
-            }
-          return this->objects_[handle];
+          if (this->objects_.size() > handle)
+            return this->objects_[handle];
+
+          // If the plugin claimed the file but did not call the
+          // add_symbols callback, we need to create the Pluginobj now.
+          Pluginobj* obj = this->make_plugin_object(handle);
+          return obj;
         }
     }

@@ -369,7 +370,7 @@ Pluginobj::Pluginobj(const std::string&
 ld_plugin_status
 Pluginobj::get_symbol_resolution_info(int nsyms, ld_plugin_symbol* syms) const
 {
-  if (this->nsyms_ == 0)
+  if (nsyms > this->nsyms_)
     return LDPS_NO_SYMS;
   for (int i = 0; i < nsyms; i++)
     {
Index: testsuite/Makefile.am
===================================================================
RCS file: /cvs/src/src/gold/testsuite/Makefile.am,v
retrieving revision 1.80
diff -u -p -r1.80 Makefile.am
--- testsuite/Makefile.am	5 Dec 2008 21:34:50 -0000	1.80
+++ testsuite/Makefile.am	16 Dec 2008 00:33:58 -0000
@@ -958,8 +958,8 @@ check_PROGRAMS += plugin_test_1
 check_SCRIPTS += plugin_test_1.sh
 check_DATA += plugin_test_1.err
 MOSTLYCLEANFILES += plugin_test_1.err
-plugin_test_1: two_file_test_main.o two_file_test_1.syms
two_file_test_1b.syms two_file_test_2.syms gcctestdir/ld
plugin_test.so
-	$(CXXLINK) -Bgcctestdir/
-Wl,--no-demangle,--plugin,"./plugin_test.so",--plugin-opt,"_Z4f13iv"
two_file_test_main.o two_file_test_1.syms two_file_test_1b.syms
two_file_test_2.syms 2>plugin_test_1.err
+plugin_test_1: two_file_test_main.o two_file_test_1.syms
two_file_test_1b.syms two_file_test_2.syms empty.syms gcctestdir/ld
plugin_test.so
+	$(CXXLINK) -Bgcctestdir/
-Wl,--no-demangle,--plugin,"./plugin_test.so",--plugin-opt,"_Z4f13iv"
two_file_test_main.o two_file_test_1.syms two_file_test_1b.syms
two_file_test_2.syms empty.syms 2>plugin_test_1.err
 plugin_test_1.err: plugin_test_1
 	@touch plugin_test_1.err

@@ -985,6 +985,9 @@ two_file_test_1b.syms: two_file_test_1b.
 	$(TEST_READELF) -sW $< >$@ 2>/dev/null
 two_file_test_2.syms: two_file_test_2.o
 	$(TEST_READELF) -sW $< >$@ 2>/dev/null
+empty.syms:
+	@echo "" >empty.syms
+	@echo "Symbol table" >>empty.syms

 endif PLUGINS

Index: testsuite/Makefile.in
===================================================================
RCS file: /cvs/src/src/gold/testsuite/Makefile.in,v
retrieving revision 1.85
diff -u -p -r1.85 Makefile.in
--- testsuite/Makefile.in	5 Dec 2008 21:34:54 -0000	1.85
+++ testsuite/Makefile.in	16 Dec 2008 00:33:58 -0000
@@ -1463,9 +1463,9 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_
 	      exit 1;; \
 	  esac; \
 	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu  testsuite/Makefile'; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign  testsuite/Makefile'; \
 	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --gnu  testsuite/Makefile
+	  $(AUTOMAKE) --foreign  testsuite/Makefile
 .PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
@@ -2453,8 +2453,8 @@ uninstall-am: uninstall-info-am
 @GCC_TRUE@@NATIVE_LINKER_TRUE@alt/thin_archive_test_4.o: thin_archive_test_4.cc
 @GCC_TRUE@@NATIVE_LINKER_TRUE@	test -d alt || mkdir -p alt
 @GCC_TRUE@@NATIVE_LINKER_TRUE@	$(CXXCOMPILE) -c -o $@ $<
-@GCC_TRUE@@NATIVE_LINKER_TRUE@@PLUGINS_TRUE@plugin_test_1:
two_file_test_main.o two_file_test_1.syms two_file_test_1b.syms
two_file_test_2.syms gcctestdir/ld plugin_test.so
-@GCC_TRUE@@NATIVE_LINKER_TRUE@@PLUGINS_TRUE@	$(CXXLINK) -Bgcctestdir/
-Wl,--no-demangle,--plugin,"./plugin_test.so",--plugin-opt,"_Z4f13iv"
two_file_test_main.o two_file_test_1.syms two_file_test_1b.syms
two_file_test_2.syms 2>plugin_test_1.err
+@GCC_TRUE@@NATIVE_LINKER_TRUE@@PLUGINS_TRUE@plugin_test_1:
two_file_test_main.o two_file_test_1.syms two_file_test_1b.syms
two_file_test_2.syms empty.syms gcctestdir/ld plugin_test.so
+@GCC_TRUE@@NATIVE_LINKER_TRUE@@PLUGINS_TRUE@	$(CXXLINK) -Bgcctestdir/
-Wl,--no-demangle,--plugin,"./plugin_test.so",--plugin-opt,"_Z4f13iv"
two_file_test_main.o two_file_test_1.syms two_file_test_1b.syms
two_file_test_2.syms empty.syms 2>plugin_test_1.err
 @GCC_TRUE@@NATIVE_LINKER_TRUE@@PLUGINS_TRUE@plugin_test_1.err: plugin_test_1
 @GCC_TRUE@@NATIVE_LINKER_TRUE@@PLUGINS_TRUE@	@touch plugin_test_1.err
 @GCC_TRUE@@NATIVE_LINKER_TRUE@@PLUGINS_TRUE@plugin_test_2:
two_file_test_main.o two_file_test_1.syms two_file_test_1b.syms
two_file_shared_2.so gcctestdir/ld plugin_test.so
@@ -2475,6 +2475,9 @@ uninstall-am: uninstall-info-am
 @GCC_TRUE@@NATIVE_LINKER_TRUE@@PLUGINS_TRUE@	$(TEST_READELF) -sW $<
>$@ 2>/dev/null
 @GCC_TRUE@@NATIVE_LINKER_TRUE@@PLUGINS_TRUE@two_file_test_2.syms:
two_file_test_2.o
 @GCC_TRUE@@NATIVE_LINKER_TRUE@@PLUGINS_TRUE@	$(TEST_READELF) -sW $<
>$@ 2>/dev/null
+@GCC_TRUE@@NATIVE_LINKER_TRUE@@PLUGINS_TRUE@empty.syms:
+@GCC_TRUE@@NATIVE_LINKER_TRUE@@PLUGINS_TRUE@	@echo "" >empty.syms
+@GCC_TRUE@@NATIVE_LINKER_TRUE@@PLUGINS_TRUE@	@echo "Symbol table" >>empty.syms
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
Index: testsuite/plugin_test.c
===================================================================
RCS file: /cvs/src/src/gold/testsuite/plugin_test.c,v
retrieving revision 1.1
diff -u -p -r1.1 plugin_test.c
--- testsuite/plugin_test.c	19 Sep 2008 22:54:57 -0000	1.1
+++ testsuite/plugin_test.c	16 Dec 2008 00:33:58 -0000
@@ -319,7 +319,11 @@ claim_file_hook (const struct ld_plugin_
     last_claimed_file->next = claimed_file;
   last_claimed_file = claimed_file;

-  (*add_symbols)(file->handle, nsyms, syms);
+  (*message)(LDPL_INFO, "%s: claiming file, adding %d symbols",
+             file->name, nsyms);
+
+  if (nsyms > 0)
+    (*add_symbols)(file->handle, nsyms, syms);

   *claimed = 1;
   return LDPS_OK;
@@ -398,6 +402,8 @@ all_symbols_read_hook(void)
        claimed_file != NULL;
        claimed_file = claimed_file->next)
     {
+      if (claimed_file->nsyms == 0)
+        continue;
       if (strlen(claimed_file->name) >= sizeof(buf))
         {
           (*message)(LDPL_FATAL, "%s: filename too long", claimed_file->name);


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]