sim: msp430: drop duplicate sim_load_file call
[deliverable/binutils-gdb.git] / gold / plugin.cc
index 62807b81d250735449e551b3bd31ee5b49392dcb..c01e4cd6c34f28e6417d2b98d568109ab737e406 100644 (file)
@@ -1,6 +1,6 @@
 // plugin.cc -- plugin manager for gold      -*- C++ -*-
 
-// Copyright (C) 2008-2014 Free Software Foundation, Inc.
+// Copyright (C) 2008-2016 Free Software Foundation, Inc.
 // Written by Cary Coutant <ccoutant@google.com>.
 
 // This file is part of gold.
@@ -427,6 +427,7 @@ Plugin_manager::~Plugin_manager()
        ++obj)
     delete *obj;
   this->objects_.clear();
+  delete this->lock_;
 }
 
 // Load all plugin libraries.
@@ -447,6 +448,10 @@ Pluginobj*
 Plugin_manager::claim_file(Input_file* input_file, off_t offset,
                            off_t filesize, Object* elf_object)
 {
+  bool lock_initialized = this->initialize_lock_.initialize();
+
+  gold_assert(lock_initialized);
+  Hold_lock hl(*this->lock_);
   if (this->in_replacement_phase_)
     return NULL;
 
@@ -909,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
 {
@@ -938,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())
@@ -1053,8 +1061,6 @@ Sized_pluginobj<size, big_endian>::do_add_symbols(Symbol_table* symtab,
   elfcpp::Sym<size, big_endian> sym(symbuf);
   elfcpp::Sym_write<size, big_endian> osym(symbuf);
 
-  typedef typename elfcpp::Elf_types<size>::Elf_WXword Elf_size_type;
-
   this->symbols_.resize(this->nsyms_);
 
   for (int i = 0; i < this->nsyms_; ++i)
@@ -1125,7 +1131,7 @@ Sized_pluginobj<size, big_endian>::do_add_symbols(Symbol_table* symtab,
 
       osym.put_st_name(0);
       osym.put_st_value(0);
-      osym.put_st_size(static_cast<Elf_size_type>(isym->size));
+      osym.put_st_size(0);
       osym.put_st_info(bind, elfcpp::STT_NOTYPE);
       osym.put_st_other(vis, 0);
       osym.put_st_shndx(shndx);
@@ -1209,7 +1215,7 @@ Sized_pluginobj<size, big_endian>::do_section_size(unsigned int)
 
 template<int size, bool big_endian>
 std::string
-Sized_pluginobj<size, big_endian>::do_section_name(unsigned int)
+Sized_pluginobj<size, big_endian>::do_section_name(unsigned int) const
 {
   gold_unreachable();
   return std::string();
@@ -1508,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
@@ -1525,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.
@@ -1721,10 +1731,10 @@ update_section_order(const struct ld_plugin_section* section_list,
     {
       Object* obj = parameters->options().plugins()->get_elf_object(
           section_list[i].handle);
-      if (obj == NULL)
+      if (obj == NULL || obj->is_dynamic())
        return LDPS_BAD_HANDLE;
       unsigned int shndx = section_list[i].shndx;
-      Section_id secn_id(obj, shndx);
+      Section_id secn_id(static_cast<Relobj*>(obj), shndx);
       (*order_map)[secn_id] = i + 1;
     }
 
@@ -1790,10 +1800,10 @@ unique_segment_for_sections(const char* segment_name,
     {
       Object* obj = parameters->options().plugins()->get_elf_object(
           section_list[i].handle);
-      if (obj == NULL)
+      if (obj == NULL || obj->is_dynamic())
        return LDPS_BAD_HANDLE;
       unsigned int shndx = section_list[i].shndx;
-      Const_section_id secn_id(obj, shndx);
+      Const_section_id secn_id(static_cast<Relobj*>(obj), shndx);
       layout->insert_section_segment_map(secn_id, s);
     }
 
This page took 0.042888 seconds and 4 git commands to generate.