| 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;
|
| +
|
|
|