Regen ld potfile
[deliverable/binutils-gdb.git] / gold / layout.cc
index 351c4b4d4ff3878a5e740dbecd5dc7be8fd34423..2eb7b7c8429484b49ab55ad95e7322cec2c32638 100644 (file)
@@ -1,6 +1,6 @@
 // layout.cc -- lay out output file sections for gold
 
-// Copyright (C) 2006-2017 Free Software Foundation, Inc.
+// Copyright (C) 2006-2018 Free Software Foundation, Inc.
 // Written by Ian Lance Taylor <iant@google.com>.
 
 // This file is part of gold.
@@ -1153,15 +1153,14 @@ template<int size, bool big_endian>
 Output_section*
 Layout::layout(Sized_relobj_file<size, big_endian>* object, unsigned int shndx,
               const char* name, const elfcpp::Shdr<size, big_endian>& shdr,
-              unsigned int reloc_shndx, unsigned int, off_t* off)
+              unsigned int sh_type, unsigned int reloc_shndx,
+              unsigned int, off_t* off)
 {
   *off = 0;
 
   if (!this->include_section(object, name, shdr))
     return NULL;
 
-  elfcpp::Elf_Word sh_type = shdr.get_sh_type();
-
   // In a relocatable link a grouped section must not be combined with
   // any other sections.
   Output_section* os;
@@ -1315,7 +1314,7 @@ Layout::insert_section_segment_map(Const_section_id secn,
 
 template<int size, bool big_endian>
 Output_section*
-Layout::layout_reloc(Sized_relobj_file<size, big_endian>* object,
+Layout::layout_reloc(Sized_relobj_file<size, big_endian>*,
                     unsigned int,
                     const elfcpp::Shdr<size, big_endian>& shdr,
                     Output_section* data_section,
@@ -1335,24 +1334,19 @@ Layout::layout_reloc(Sized_relobj_file<size, big_endian>* object,
     gold_unreachable();
   name += data_section->name();
 
-  // In a relocatable link relocs for a grouped section must not be
-  // combined with other reloc sections.
-  Output_section* os;
-  if (!parameters->options().relocatable()
-      || (data_section->flags() & elfcpp::SHF_GROUP) == 0)
-    os = this->choose_output_section(object, name.c_str(), sh_type,
-                                    shdr.get_sh_flags(), false,
-                                    ORDER_INVALID, false, true, false);
-  else
+  // If the output data section already has a reloc section, use that;
+  // otherwise, make a new one.
+  Output_section* os = data_section->reloc_section();
+  if (os == NULL)
     {
       const char* n = this->namepool_.add(name.c_str(), true, NULL);
       os = this->make_output_section(n, sh_type, shdr.get_sh_flags(),
                                     ORDER_INVALID, false);
+      os->set_should_link_to_symtab();
+      os->set_info_section(data_section);
+      data_section->set_reloc_section(os);
     }
 
-  os->set_should_link_to_symtab();
-  os->set_info_section(data_section);
-
   Output_section_data* posd;
   if (sh_type == elfcpp::SHT_REL)
     {
@@ -1442,8 +1436,11 @@ Layout::layout_eh_frame(Sized_relobj_file<size, big_endian>* object,
                        unsigned int reloc_shndx, unsigned int reloc_type,
                        off_t* off)
 {
+  const unsigned int unwind_section_type =
+      parameters->target().unwind_section_type();
+
   gold_assert(shdr.get_sh_type() == elfcpp::SHT_PROGBITS
-             || shdr.get_sh_type() == elfcpp::SHT_X86_64_UNWIND);
+             || shdr.get_sh_type() == unwind_section_type);
   gold_assert((shdr.get_sh_flags() & elfcpp::SHF_ALLOC) != 0);
 
   Output_section* os = this->make_eh_frame_section(object);
@@ -1530,10 +1527,11 @@ Layout::finalize_eh_frame_section()
 Output_section*
 Layout::make_eh_frame_section(const Relobj* object)
 {
-  // FIXME: On x86_64, this could use SHT_X86_64_UNWIND rather than
-  // SHT_PROGBITS.
+  const unsigned int unwind_section_type =
+      parameters->target().unwind_section_type();
+
   Output_section* os = this->choose_output_section(object, ".eh_frame",
-                                                  elfcpp::SHT_PROGBITS,
+                                                  unwind_section_type,
                                                   elfcpp::SHF_ALLOC, false,
                                                   ORDER_EHFRAME, false, false,
                                                   false);
@@ -1551,7 +1549,7 @@ Layout::make_eh_frame_section(const Relobj* object)
        {
          Output_section* hdr_os =
            this->choose_output_section(NULL, ".eh_frame_hdr",
-                                       elfcpp::SHT_PROGBITS,
+                                       unwind_section_type,
                                        elfcpp::SHF_ALLOC, false,
                                        ORDER_EHFRAME, false, false,
                                        false);
@@ -1905,6 +1903,19 @@ Layout::default_section_order(Output_section* os, bool is_relro_local)
            return ORDER_INIT;
          else if (strcmp(os->name(), ".fini") == 0)
            return ORDER_FINI;
+         else if (parameters->options().keep_text_section_prefix())
+           {
+             // -z,keep-text-section-prefix introduces additional
+             // output sections.
+             if (strcmp(os->name(), ".text.hot") == 0)
+               return ORDER_TEXT_HOT;
+             else if (strcmp(os->name(), ".text.startup") == 0)
+               return ORDER_TEXT_STARTUP;
+             else if (strcmp(os->name(), ".text.exit") == 0)
+               return ORDER_TEXT_EXIT;
+             else if (strcmp(os->name(), ".text.unlikely") == 0)
+               return ORDER_TEXT_UNLIKELY;
+           }
        }
       return is_execinstr ? ORDER_TEXT : ORDER_READONLY;
     }
@@ -5134,6 +5145,20 @@ const Layout::Section_name_mapping Layout::section_name_mapping[] =
   MAPPING_INIT(".ARM.exidx", ".ARM.exidx"),
   MAPPING_INIT(".gnu.linkonce.armexidx.", ".ARM.exidx"),
 };
+
+// Mapping for ".text" section prefixes with -z,keep-text-section-prefix.
+const Layout::Section_name_mapping Layout::text_section_name_mapping[] =
+{
+  MAPPING_INIT(".text.hot.", ".text.hot"),
+  MAPPING_INIT_EXACT(".text.hot", ".text.hot"),
+  MAPPING_INIT(".text.unlikely.", ".text.unlikely"),
+  MAPPING_INIT_EXACT(".text.unlikely", ".text.unlikely"),
+  MAPPING_INIT(".text.startup.", ".text.startup"),
+  MAPPING_INIT_EXACT(".text.startup", ".text.startup"),
+  MAPPING_INIT(".text.exit.", ".text.exit"),
+  MAPPING_INIT_EXACT(".text.exit", ".text.exit"),
+  MAPPING_INIT(".text.", ".text"),
+};
 #undef MAPPING_INIT
 #undef MAPPING_INIT_EXACT
 
@@ -5141,6 +5166,39 @@ const int Layout::section_name_mapping_count =
   (sizeof(Layout::section_name_mapping)
    / sizeof(Layout::section_name_mapping[0]));
 
+const int Layout::text_section_name_mapping_count =
+  (sizeof(Layout::text_section_name_mapping)
+   / sizeof(Layout::text_section_name_mapping[0]));
+
+// Find section name NAME in PSNM and return the mapped name if found
+// with the length set in PLEN.
+const char *
+Layout::match_section_name(const Layout::Section_name_mapping* psnm,
+                          const int count,
+                          const char* name, size_t* plen)
+{
+  for (int i = 0; i < count; ++i, ++psnm)
+    {
+      if (psnm->fromlen > 0)
+       {
+         if (strncmp(name, psnm->from, psnm->fromlen) == 0)
+           {
+             *plen = psnm->tolen;
+             return psnm->to;
+           }
+       }
+      else
+       {
+         if (strcmp(name, psnm->from) == 0)
+           {
+             *plen = psnm->tolen;
+             return psnm->to;
+           }
+       }
+    }
+  return NULL;
+}
+
 // Choose the output section name to use given an input section name.
 // Set *PLEN to the length of the name.  *PLEN is initialized to the
 // length of NAME.
@@ -5184,27 +5242,21 @@ Layout::output_section_name(const Relobj* relobj, const char* name,
   // not found in the table, we simply use it as the output section
   // name.
 
-  const Section_name_mapping* psnm = section_name_mapping;
-  for (int i = 0; i < section_name_mapping_count; ++i, ++psnm)
+  if (parameters->options().keep_text_section_prefix()
+      && is_prefix_of(".text", name))
     {
-      if (psnm->fromlen > 0)
-       {
-         if (strncmp(name, psnm->from, psnm->fromlen) == 0)
-           {
-             *plen = psnm->tolen;
-             return psnm->to;
-           }
-       }
-      else
-       {
-         if (strcmp(name, psnm->from) == 0)
-           {
-             *plen = psnm->tolen;
-             return psnm->to;
-           }
-       }
+      const char* match = match_section_name(text_section_name_mapping,
+                                            text_section_name_mapping_count,
+                                            name, plen);
+      if (match != NULL)
+       return match;
     }
 
+  const char* match = match_section_name(section_name_mapping,
+                                        section_name_mapping_count, name, plen);
+  if (match != NULL)
+    return match;
+
   // As an additional complication, .ctors sections are output in
   // either .ctors or .init_array sections, and .dtors sections are
   // output in either .dtors or .fini_array sections.
@@ -5861,7 +5913,7 @@ Layout::layout<32, false>(Sized_relobj_file<32, false>* object,
                          unsigned int shndx,
                          const char* name,
                          const elfcpp::Shdr<32, false>& shdr,
-                         unsigned int, unsigned int, off_t*);
+                         unsigned int, unsigned int, unsigned int, off_t*);
 #endif
 
 #ifdef HAVE_TARGET_32_BIG
@@ -5871,7 +5923,7 @@ Layout::layout<32, true>(Sized_relobj_file<32, true>* object,
                         unsigned int shndx,
                         const char* name,
                         const elfcpp::Shdr<32, true>& shdr,
-                        unsigned int, unsigned int, off_t*);
+                        unsigned int, unsigned int, unsigned int, off_t*);
 #endif
 
 #ifdef HAVE_TARGET_64_LITTLE
@@ -5881,7 +5933,7 @@ Layout::layout<64, false>(Sized_relobj_file<64, false>* object,
                          unsigned int shndx,
                          const char* name,
                          const elfcpp::Shdr<64, false>& shdr,
-                         unsigned int, unsigned int, off_t*);
+                         unsigned int, unsigned int, unsigned int, off_t*);
 #endif
 
 #ifdef HAVE_TARGET_64_BIG
@@ -5891,7 +5943,7 @@ Layout::layout<64, true>(Sized_relobj_file<64, true>* object,
                         unsigned int shndx,
                         const char* name,
                         const elfcpp::Shdr<64, true>& shdr,
-                        unsigned int, unsigned int, off_t*);
+                        unsigned int, unsigned int, unsigned int, off_t*);
 #endif
 
 #ifdef HAVE_TARGET_32_LITTLE
This page took 0.027414 seconds and 4 git commands to generate.