Index: third_party/binutils/plugin-dso-fix.patch |
diff --git a/third_party/binutils/plugin-dso-fix.patch b/third_party/binutils/plugin-dso-fix.patch |
new file mode 100644 |
index 0000000000000000000000000000000000000000..558975686dce55a65cb43faca3bb2e8d5481d602 |
--- /dev/null |
+++ b/third_party/binutils/plugin-dso-fix.patch |
@@ -0,0 +1,97 @@ |
+commit 3c537f7fdb11f02f7082749f3f21dfdd2c2025e8 |
+Author: Peter Collingbourne <pcc@google.com> |
+Date: Wed Feb 4 09:47:28 2015 -0800 |
+ |
+ Resolve forwarding symbols in plugins. |
+ |
+ 2015-02-04 Peter Collingbourne <pcc@google.com> |
+ |
+ * plugin.cc (Pluginobj::get_symbol_resolution_info): Resolve |
+ forwarding symbols when computing symbol resolution info for plugins. |
+ |
+diff --git a/gold/plugin.cc b/gold/plugin.cc |
+index bde8c78..68da8e3 100644 |
+--- a/gold/plugin.cc |
++++ b/gold/plugin.cc |
+@@ -914,7 +914,8 @@ is_visible_from_outside(Symbol* lsym) |
+ // Get symbol resolution info. |
+ |
+ ld_plugin_status |
+-Pluginobj::get_symbol_resolution_info(int nsyms, |
++Pluginobj::get_symbol_resolution_info(Symbol_table* symtab, |
++ int nsyms, |
+ ld_plugin_symbol* syms, |
+ int version) const |
+ { |
+@@ -943,6 +944,8 @@ Pluginobj::get_symbol_resolution_info(int nsyms, |
+ { |
+ ld_plugin_symbol* isym = &syms[i]; |
+ Symbol* lsym = this->symbols_[i]; |
++ if (lsym->is_forwarder()) |
++ lsym = symtab->resolve_forwards(lsym); |
+ ld_plugin_symbol_resolution res = LDPR_UNKNOWN; |
+ |
+ if (lsym->is_undefined()) |
+@@ -1511,14 +1514,16 @@ static enum ld_plugin_status |
+ get_symbols(const void* handle, int nsyms, ld_plugin_symbol* syms) |
+ { |
+ gold_assert(parameters->options().has_plugins()); |
+- Object* obj = parameters->options().plugins()->object( |
++ Plugin_manager* plugins = parameters->options().plugins(); |
++ Object* obj = plugins->object( |
+ static_cast<unsigned int>(reinterpret_cast<intptr_t>(handle))); |
+ if (obj == NULL) |
+ return LDPS_ERR; |
+ Pluginobj* plugin_obj = obj->pluginobj(); |
+ if (plugin_obj == NULL) |
+ return LDPS_ERR; |
+- return plugin_obj->get_symbol_resolution_info(nsyms, syms, 1); |
++ Symbol_table* symtab = plugins->symtab(); |
++ return plugin_obj->get_symbol_resolution_info(symtab, nsyms, syms, 1); |
+ } |
+ |
+ // Version 2 of the above. The only difference is that this version |
+@@ -1528,14 +1533,16 @@ static enum ld_plugin_status |
+ get_symbols_v2(const void* handle, int nsyms, ld_plugin_symbol* syms) |
+ { |
+ gold_assert(parameters->options().has_plugins()); |
+- Object* obj = parameters->options().plugins()->object( |
++ Plugin_manager* plugins = parameters->options().plugins(); |
++ Object* obj = plugins->object( |
+ static_cast<unsigned int>(reinterpret_cast<intptr_t>(handle))); |
+ if (obj == NULL) |
+ return LDPS_ERR; |
+ Pluginobj* plugin_obj = obj->pluginobj(); |
+ if (plugin_obj == NULL) |
+ return LDPS_ERR; |
+- return plugin_obj->get_symbol_resolution_info(nsyms, syms, 2); |
++ Symbol_table* symtab = plugins->symtab(); |
++ return plugin_obj->get_symbol_resolution_info(symtab, nsyms, syms, 2); |
+ } |
+ |
+ // Add a new (real) input file generated by a plugin. |
+diff --git a/gold/plugin.h b/gold/plugin.h |
+index ef78b84..f926879 100644 |
+--- a/gold/plugin.h |
++++ b/gold/plugin.h |
+@@ -282,6 +282,10 @@ class Plugin_manager |
+ input_objects() const |
+ { return this->input_objects_; } |
+ |
++ Symbol_table* |
++ symtab() |
++ { return this->symtab_; } |
++ |
+ Layout* |
+ layout() |
+ { return this->layout_; } |
+@@ -396,7 +400,8 @@ class Pluginobj : public Object |
+ |
+ // Fill in the symbol resolution status for the given plugin symbols. |
+ ld_plugin_status |
+- get_symbol_resolution_info(int nsyms, |
++ get_symbol_resolution_info(Symbol_table* symtab, |
++ int nsyms, |
+ ld_plugin_symbol* syms, |
+ int version) const; |
+ |