Modify gold testsuite to disable plugins added by GCC driver.
[deliverable/binutils-gdb.git] / gold / object.cc
index 34343031f8f11606c01b7a5474a43c1efa5bd3d2..11c22c6e478ff9eaf29b136bb91b0c8caaf348cf 100644 (file)
@@ -1,7 +1,6 @@
 // object.cc -- support for an object file for linking in gold
 
-// Copyright 2006, 2007, 2008, 2009, 2010, 2011, 2012
-// Free Software Foundation, Inc.
+// Copyright (C) 2006-2014 Free Software Foundation, Inc.
 // Written by Ian Lance Taylor <iant@google.com>.
 
 // This file is part of gold.
@@ -389,6 +388,23 @@ Sized_relobj<size, big_endian>::do_for_all_local_got_entries(
     }
 }
 
+// Get the address of an output section.
+
+template<int size, bool big_endian>
+uint64_t
+Sized_relobj<size, big_endian>::do_output_section_address(
+    unsigned int shndx)
+{
+  // If the input file is linked as --just-symbols, the output
+  // section address is the input section address.
+  if (this->just_symbols())
+    return this->section_address(shndx);
+
+  const Output_section* os = this->do_output_section(shndx);
+  gold_assert(os != NULL);
+  return os->address();
+}
+
 // Class Sized_relobj_file.
 
 template<int size, bool big_endian>
@@ -1687,6 +1703,28 @@ Sized_relobj_file<size, big_endian>::do_layout(Symbol_table* symtab,
   if (!is_pass_two)
     layout->layout_gnu_stack(seen_gnu_stack, gnu_stack_flags, this);
 
+  // Handle the .eh_frame sections after the other sections.
+  gold_assert(!is_pass_one || eh_frame_sections.empty());
+  for (std::vector<unsigned int>::const_iterator p = eh_frame_sections.begin();
+       p != eh_frame_sections.end();
+       ++p)
+    {
+      unsigned int i = *p;
+      const unsigned char* pshdr;
+      pshdr = section_headers_data + i * This::shdr_size;
+      typename This::Shdr shdr(pshdr);
+
+      this->layout_eh_frame_section(layout,
+                                   symbols_data,
+                                   symbols_size,
+                                   symbol_names_data,
+                                   symbol_names_size,
+                                   i,
+                                   shdr,
+                                   reloc_shndx[i],
+                                   reloc_type[i]);
+    }
+
   // When doing a relocatable link handle the reloc sections at the
   // end.  Garbage collection  and Identical Code Folding is not
   // turned on for relocatable code.
@@ -1739,28 +1777,6 @@ Sized_relobj_file<size, big_endian>::do_layout(Symbol_table* symtab,
       out_section_offsets[i] = invalid_address;
     }
 
-  // Handle the .eh_frame sections at the end.
-  gold_assert(!is_pass_one || eh_frame_sections.empty());
-  for (std::vector<unsigned int>::const_iterator p = eh_frame_sections.begin();
-       p != eh_frame_sections.end();
-       ++p)
-    {
-      unsigned int i = *p;
-      const unsigned char* pshdr;
-      pshdr = section_headers_data + i * This::shdr_size;
-      typename This::Shdr shdr(pshdr);
-
-      this->layout_eh_frame_section(layout,
-                                   symbols_data,
-                                   symbols_size,
-                                   symbol_names_data,
-                                   symbol_names_size,
-                                   i,
-                                   shdr,
-                                   reloc_shndx[i],
-                                   reloc_type[i]);
-    }
-
   // When building a .gdb_index section, scan the .debug_info and
   // .debug_types sections.
   gold_assert(!is_pass_one
@@ -1815,19 +1831,21 @@ Sized_relobj_file<size, big_endian>::do_layout_deferred_sections(Layout* layout)
        ++deferred)
     {
       typename This::Shdr shdr(deferred->shdr_data_);
-      // If the section is not included, it is because the garbage collector
-      // decided it is not needed.  Avoid reverting that decision.
-      if (!this->is_section_included(deferred->shndx_))
-       continue;
 
-      if (parameters->options().relocatable()
-         || deferred->name_ != ".eh_frame"
-         || !this->check_eh_frame_flags(&shdr))
-       this->layout_section(layout, deferred->shndx_, deferred->name_.c_str(),
-                            shdr, deferred->reloc_shndx_,
-                            deferred->reloc_type_);
-      else
+      if (!parameters->options().relocatable()
+         && deferred->name_ == ".eh_frame"
+         && this->check_eh_frame_flags(&shdr))
        {
+         // Checking is_section_included is not reliable for
+         // .eh_frame sections, because they do not have an output
+         // section.  This is not a problem normally because we call
+         // layout_eh_frame_section unconditionally, but when
+         // deferring sections that is not true.  We don't want to
+         // keep all .eh_frame sections because that will cause us to
+         // keep all sections that they refer to, which is the wrong
+         // way around.  Instead, the eh_frame code will discard
+         // .eh_frame sections that refer to discarded sections.
+
          // Reading the symbols again here may be slow.
          Read_symbols_data sd;
          this->read_symbols(&sd);
@@ -1840,7 +1858,17 @@ Sized_relobj_file<size, big_endian>::do_layout_deferred_sections(Layout* layout)
                                        shdr,
                                        deferred->reloc_shndx_,
                                        deferred->reloc_type_);
+         continue;
        }
+
+      // If the section is not included, it is because the garbage collector
+      // decided it is not needed.  Avoid reverting that decision.
+      if (!this->is_section_included(deferred->shndx_))
+       continue;
+
+      this->layout_section(layout, deferred->shndx_, deferred->name_.c_str(),
+                          shdr, deferred->reloc_shndx_,
+                          deferred->reloc_type_);
     }
 
   this->deferred_layout_.clear();
@@ -2675,6 +2703,7 @@ Sized_relobj_file<size, big_endian>::get_symbol_location_info(
          && (static_cast<off_t>(sym.get_st_value() + sym.get_st_size())
              > offset))
        {
+         info->enclosing_symbol_type = sym.get_st_type();
          if (sym.get_st_name() > names_size)
            info->enclosing_symbol_name = "(invalid)";
          else
@@ -2984,12 +3013,10 @@ Relocate_info<size, big_endian>::location(size_t, off_t offset) const
          ret += ":";
          ret += info.source_file;
        }
-      size_t len = info.enclosing_symbol_name.length() + 100;
-      char* buf = new char[len];
-      snprintf(buf, len, _(":function %s"),
-              info.enclosing_symbol_name.c_str());
-      ret += buf;
-      delete[] buf;
+      ret += ":";
+      if (info.enclosing_symbol_type == elfcpp::STT_FUNC)
+       ret += _("function ");
+      ret += info.enclosing_symbol_name;
       return ret;
     }
 
@@ -3205,21 +3232,33 @@ Object::find_shdr<64,true>(const unsigned char*, const char*, const char*,
 #endif
 
 #ifdef HAVE_TARGET_32_LITTLE
+template
+class Sized_relobj<32, false>;
+
 template
 class Sized_relobj_file<32, false>;
 #endif
 
 #ifdef HAVE_TARGET_32_BIG
+template
+class Sized_relobj<32, true>;
+
 template
 class Sized_relobj_file<32, true>;
 #endif
 
 #ifdef HAVE_TARGET_64_LITTLE
+template
+class Sized_relobj<64, false>;
+
 template
 class Sized_relobj_file<64, false>;
 #endif
 
 #ifdef HAVE_TARGET_64_BIG
+template
+class Sized_relobj<64, true>;
+
 template
 class Sized_relobj_file<64, true>;
 #endif
This page took 0.029324 seconds and 4 git commands to generate.