summaryrefslogtreecommitdiffstats
path: root/third_party/binutils/plugin-dso-fix.patch
blob: 558975686dce55a65cb43faca3bb2e8d5481d602 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
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;