PowerPC gold, fix 32-bit branch address arithmetic
[platform/upstream/binutils.git] / gold / layout.cc
index 65c3de6..7cbbe39 100644 (file)
@@ -1,7 +1,6 @@
 // layout.cc -- lay out output file sections for gold
 
-// Copyright 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013
-// 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.
@@ -293,7 +292,8 @@ Hash_task::is_runnable()
 void
 Layout::Relaxation_debug_check::check_output_data_for_reset_values(
     const Layout::Section_list& sections,
-    const Layout::Data_list& special_outputs)
+    const Layout::Data_list& special_outputs,
+    const Layout::Data_list& relax_outputs)
 {
   for(Layout::Section_list::const_iterator p = sections.begin();
       p != sections.end();
@@ -304,6 +304,8 @@ Layout::Relaxation_debug_check::check_output_data_for_reset_values(
       p != special_outputs.end();
       ++p)
     gold_assert((*p)->address_and_file_offset_have_reset_values());
+
+  gold_assert(relax_outputs.empty());
 }
 
 // Save information of SECTIONS for checking later.
@@ -428,6 +430,7 @@ Layout::Layout(int number_of_input_files, Script_options* script_options)
     section_list_(),
     unattached_section_list_(),
     special_output_list_(),
+    relax_output_list_(),
     section_headers_(NULL),
     tls_segment_(NULL),
     relro_segment_(NULL),
@@ -560,7 +563,9 @@ static const char* gdb_fast_lookup_sections[] =
 {
   "aranges",
   "pubnames",
+  "gnu_pubnames",
   "pubtypes",
+  "gnu_pubtypes",
 };
 
 // Returns whether the given debug section is in the list of
@@ -641,7 +646,13 @@ Layout::include_section(Sized_relobj_file<size, big_endian>*, const char* name,
       && (shdr.get_sh_flags() & elfcpp::SHF_EXCLUDE))
     return false;
 
-  switch (shdr.get_sh_type())
+  elfcpp::Elf_Word sh_type = shdr.get_sh_type();
+
+  if ((sh_type >= elfcpp::SHT_LOOS && sh_type <= elfcpp::SHT_HIOS)
+      || (sh_type >= elfcpp::SHT_LOPROC && sh_type <= elfcpp::SHT_HIPROC))
+    return parameters->target().should_include_section(sh_type);
+
+  switch (sh_type)
     {
     case elfcpp::SHT_NULL:
     case elfcpp::SHT_SYMTAB:
@@ -2341,6 +2352,20 @@ Layout::clean_up_after_relaxation()
        ++p)
     delete *p;
   this->script_output_section_data_list_.clear();
+
+  // Special-case fill output objects are recreated each time through
+  // the relaxation loop.
+  this->reset_relax_output();
+}
+
+void
+Layout::reset_relax_output()
+{
+  for (Data_list::const_iterator p = this->relax_output_list_.begin();
+       p != this->relax_output_list_.end();
+       ++p)
+    delete *p;
+  this->relax_output_list_.clear();
 }
 
 // Prepare for relaxation.
@@ -2363,12 +2388,29 @@ Layout::prepare_for_relaxation()
 
   if (is_debugging_enabled(DEBUG_RELAXATION))
     this->relaxation_debug_check_->check_output_data_for_reset_values(
-       this->section_list_, this->special_output_list_);
+       this->section_list_, this->special_output_list_,
+       this->relax_output_list_);
 
   // Also enable recording of output section data from scripts.
   this->record_output_section_data_from_script_ = true;
 }
 
+// If the user set the address of the text segment, that may not be
+// compatible with putting the segment headers and file headers into
+// that segment.  For isolate_execinstr() targets, it's the rodata
+// segment rather than text where we might put the headers.
+static inline bool
+load_seg_unusable_for_headers(const Target* target)
+{
+  const General_options& options = parameters->options();
+  if (target->isolate_execinstr())
+    return (options.user_set_Trodata_segment()
+           && options.Trodata_segment() % target->abi_pagesize() != 0);
+  else
+    return (options.user_set_Ttext()
+           && options.Ttext() % target->abi_pagesize() != 0);
+}
+
 // Relaxation loop body:  If target has no relaxation, this runs only once
 // Otherwise, the target relaxation hook is called at the end of
 // each iteration.  If the hook returns true, it means re-layout of
@@ -2421,11 +2463,7 @@ Layout::relaxation_loop_body(
       != General_options::OBJECT_FORMAT_ELF)
     load_seg = NULL;
 
-  // If the user set the address of the text segment, that may not be
-  // compatible with putting the segment headers and file headers into
-  // that segment.
-  if (parameters->options().user_set_Ttext()
-      && parameters->options().Ttext() % target->abi_pagesize() != 0)
+  if (load_seg_unusable_for_headers(target))
     {
       load_seg = NULL;
       phdr_seg = NULL;
@@ -2713,12 +2751,14 @@ Layout::finalize(const Input_objects* input_objects, Symbol_table* symtab,
   // If there is a load segment that contains the file and program headers,
   // provide a symbol __ehdr_start pointing there.
   // A program can use this to examine itself robustly.
-  if (load_seg != NULL)
-    symtab->define_in_output_segment("__ehdr_start", NULL,
-                                    Symbol_table::PREDEFINED, load_seg, 0, 0,
-                                    elfcpp::STT_NOTYPE, elfcpp::STB_GLOBAL,
-                                    elfcpp::STV_HIDDEN, 0,
-                                    Symbol::SEGMENT_START, true);
+  Symbol *ehdr_start = symtab->lookup("__ehdr_start");
+  if (ehdr_start != NULL && ehdr_start->is_predefined())
+    {
+      if (load_seg != NULL)
+       ehdr_start->set_output_segment(load_seg, Symbol::SEGMENT_START);
+      else
+        ehdr_start->set_undefined();
+    }
 
   // Set the file offsets of all the non-data sections we've seen so
   // far which don't have to wait for the input sections.  We need
@@ -3319,6 +3359,20 @@ align_file_offset(off_t off, uint64_t addr, uint64_t abi_pagesize)
   return aligned_off;
 }
 
+// On targets where the text segment contains only executable code,
+// a non-executable segment is never the text segment.
+
+static inline bool
+is_text_segment(const Target* target, const Output_segment* seg)
+{
+  elfcpp::Elf_Xword flags = seg->flags();
+  if ((flags & elfcpp::PF_W) != 0)
+    return false;
+  if ((flags & elfcpp::PF_X) == 0)
+    return !target->isolate_execinstr();
+  return true;
+}
+
 // Set the file offsets of all the segments, and all the sections they
 // contain.  They have all been created.  LOAD_SEG must be be laid out
 // first.  Return the offset of the data to follow.
@@ -3411,10 +3465,16 @@ Layout::set_segment_offsets(const Target* target, Output_segment* load_seg,
            }
          else if (parameters->options().user_set_Ttext()
                   && (parameters->options().omagic()
-                      || ((*p)->flags() & elfcpp::PF_W) == 0))
+                      || is_text_segment(target, *p)))
            {
              are_addresses_set = true;
            }
+         else if (parameters->options().user_set_Trodata_segment()
+                  && ((*p)->flags() & (elfcpp::PF_W | elfcpp::PF_X)) == 0)
+           {
+             addr = parameters->options().Trodata_segment();
+             are_addresses_set = true;
+           }
          else if (parameters->options().user_set_Tdata()
                   && ((*p)->flags() & elfcpp::PF_W) != 0
                   && (!parameters->options().user_set_Tbss()
@@ -3485,7 +3545,13 @@ Layout::set_segment_offsets(const Target* target, Output_segment* load_seg,
 
          if (!parameters->options().nmagic()
              && !parameters->options().omagic())
-           off = align_file_offset(off, addr, abi_pagesize);
+           {
+             // Here we are also taking care of the case when
+             // the maximum segment alignment is larger than the page size.
+             off = align_file_offset(off, addr,
+                                     std::max(abi_pagesize,
+                                              (*p)->maximum_alignment()));
+           }
          else
            {
              // This is -N or -n with a section script which prevents
@@ -3502,7 +3568,8 @@ Layout::set_segment_offsets(const Target* target, Output_segment* load_seg,
 
          unsigned int shndx_hold = *pshndx;
          bool has_relro = false;
-         uint64_t new_addr = (*p)->set_section_addresses(this, false, addr,
+         uint64_t new_addr = (*p)->set_section_addresses(target, this,
+                                                         false, addr,
                                                          &increase_relro,
                                                          &has_relro,
                                                          &off, pshndx);
@@ -3543,7 +3610,8 @@ Layout::set_segment_offsets(const Target* target, Output_segment* load_seg,
                    increase_relro = 0;
                  has_relro = false;
 
-                 new_addr = (*p)->set_section_addresses(this, true, addr,
+                 new_addr = (*p)->set_section_addresses(target, this,
+                                                        true, addr,
                                                         &increase_relro,
                                                         &has_relro,
                                                         &off, pshndx);
@@ -3579,6 +3647,8 @@ Layout::set_segment_offsets(const Target* target, Output_segment* load_seg,
       // so they land after the segments starting at LOAD_SEG.
       off = align_file_offset(off, 0, target->abi_pagesize());
 
+      this->reset_relax_output();
+
       for (Segment_list::iterator p = this->segment_list_.begin();
           *p != load_seg;
           ++p)
@@ -3592,8 +3662,8 @@ Layout::set_segment_offsets(const Target* target, Output_segment* load_seg,
              bool has_relro = false;
              const uint64_t old_addr = (*p)->vaddr();
              const uint64_t old_end = old_addr + (*p)->memsz();
-             uint64_t new_addr = (*p)->set_section_addresses(this, true,
-                                                             old_addr,
+             uint64_t new_addr = (*p)->set_section_addresses(target, this,
+                                                             true, old_addr,
                                                              &increase_relro,
                                                              &has_relro,
                                                              &off,
@@ -4238,18 +4308,20 @@ Layout::create_dynamic_symtab(const Input_objects* input_objects,
        }
     }
 
-  // Create the hash tables.
+  // Create the hash tables.  The Gnu-style hash table must be
+  // built first, because it changes the order of the symbols
+  // in the dynamic symbol table.
 
-  if (strcmp(parameters->options().hash_style(), "sysv") == 0
+  if (strcmp(parameters->options().hash_style(), "gnu") == 0
       || strcmp(parameters->options().hash_style(), "both") == 0)
     {
       unsigned char* phash;
       unsigned int hashlen;
-      Dynobj::create_elf_hash_table(*pdynamic_symbols, local_symcount,
+      Dynobj::create_gnu_hash_table(*pdynamic_symbols, local_symcount,
                                    &phash, &hashlen);
 
       Output_section* hashsec =
-       this->choose_output_section(NULL, ".hash", elfcpp::SHT_HASH,
+       this->choose_output_section(NULL, ".gnu.hash", elfcpp::SHT_GNU_HASH,
                                    elfcpp::SHF_ALLOC, false,
                                    ORDER_DYNAMIC_LINKER, false);
 
@@ -4264,23 +4336,28 @@ Layout::create_dynamic_symtab(const Input_objects* input_objects,
        {
          if (dynsym != NULL)
            hashsec->set_link_section(dynsym);
-         hashsec->set_entsize(4);
-       }
 
-      if (odyn != NULL)
-       odyn->add_section_address(elfcpp::DT_HASH, hashsec);
+         // For a 64-bit target, the entries in .gnu.hash do not have
+         // a uniform size, so we only set the entry size for a
+         // 32-bit target.
+         if (parameters->target().get_size() == 32)
+           hashsec->set_entsize(4);
+
+         if (odyn != NULL)
+           odyn->add_section_address(elfcpp::DT_GNU_HASH, hashsec);
+       }
     }
 
-  if (strcmp(parameters->options().hash_style(), "gnu") == 0
+  if (strcmp(parameters->options().hash_style(), "sysv") == 0
       || strcmp(parameters->options().hash_style(), "both") == 0)
     {
       unsigned char* phash;
       unsigned int hashlen;
-      Dynobj::create_gnu_hash_table(*pdynamic_symbols, local_symcount,
+      Dynobj::create_elf_hash_table(*pdynamic_symbols, local_symcount,
                                    &phash, &hashlen);
 
       Output_section* hashsec =
-       this->choose_output_section(NULL, ".gnu.hash", elfcpp::SHT_GNU_HASH,
+       this->choose_output_section(NULL, ".hash", elfcpp::SHT_HASH,
                                    elfcpp::SHF_ALLOC, false,
                                    ORDER_DYNAMIC_LINKER, false);
 
@@ -4295,16 +4372,11 @@ Layout::create_dynamic_symtab(const Input_objects* input_objects,
        {
          if (dynsym != NULL)
            hashsec->set_link_section(dynsym);
-
-         // For a 64-bit target, the entries in .gnu.hash do not have
-         // a uniform size, so we only set the entry size for a
-         // 32-bit target.
-         if (parameters->target().get_size() == 32)
-           hashsec->set_entsize(4);
-
-         if (odyn != NULL)
-           odyn->add_section_address(elfcpp::DT_GNU_HASH, hashsec);
+         hashsec->set_entsize(4);
        }
+
+      if (odyn != NULL)
+       odyn->add_section_address(elfcpp::DT_HASH, hashsec);
     }
 }
 
@@ -5230,6 +5302,13 @@ Layout::write_data(const Symbol_table* symtab, Output_file* of) const
        p != this->special_output_list_.end();
        ++p)
     (*p)->write(of);
+
+  // Write out the Output_data which are not in an Output_section
+  // and are regenerated in each iteration of relaxation.
+  for (Data_list::const_iterator p = this->relax_output_list_.begin();
+       p != this->relax_output_list_.end();
+       ++p)
+    (*p)->write(of);
 }
 
 // Write out the Output_sections which can only be written after the
@@ -5417,6 +5496,10 @@ Layout::print_to_mapfile(Mapfile* mapfile) const
        p != this->segment_list_.end();
        ++p)
     (*p)->print_sections_to_mapfile(mapfile);
+  for (Section_list::const_iterator p = this->unattached_section_list_.begin();
+       p != this->unattached_section_list_.end();
+       ++p)
+    (*p)->print_to_mapfile(mapfile);
 }
 
 // Print statistical information to stderr.  This is used for --stats.
@@ -5451,6 +5534,8 @@ void
 Write_sections_task::locks(Task_locker* tl)
 {
   tl->add(this, this->output_sections_blocker_);
+  if (this->input_sections_blocker_ != NULL)
+    tl->add(this, this->input_sections_blocker_);
   tl->add(this, this->final_blocker_);
 }