OSDN Git Service

PR 10979
[pf3gnuchains/pf3gnuchains3x.git] / gold / layout.h
index 71afa96..604f19b 100644 (file)
@@ -362,11 +362,21 @@ class Layout
   // Add an Output_section_data to the layout.  This is used for
   // special sections like the GOT section.  IS_DYNAMIC_LINKER_SECTION
   // is true for sections which are used by the dynamic linker, such
-  // as dynamic reloc sections.
+  // as dynamic reloc sections.  IS_RELRO is true for relro sections.
+  // IS_LAST_RELRO is true for the last relro section.
+  // IS_FIRST_NON_RELRO is true for the first section after the relro
+  // sections.
   Output_section*
   add_output_section_data(const char* name, elfcpp::Elf_Word type,
                          elfcpp::Elf_Xword flags,
-                         Output_section_data*, bool is_dynamic_linker_section);
+                         Output_section_data*, bool is_dynamic_linker_section,
+                         bool is_relro, bool is_last_relro,
+                         bool is_first_non_relro);
+
+  // Increase the size of the relro segment by this much.
+  void
+  increase_relro(unsigned int s)
+  { this->increase_relro_ += s; }
 
   // Create dynamic sections if necessary.
   void
@@ -423,6 +433,11 @@ class Layout
   is_linkonce(const char* name)
   { return strncmp(name, ".gnu.linkonce", sizeof(".gnu.linkonce") - 1) == 0; }
 
+  // Whether we have added an input section.
+  bool
+  have_added_input_section() const
+  { return this->have_added_input_section_; }
+
   // Return true if a section is a debugging section.
   static inline bool
   is_debug_info_section(const char* name)
@@ -708,6 +723,10 @@ class Layout
   void
   finish_dynamic_section(const Input_objects*, const Symbol_table*);
 
+  // Set the size of the _DYNAMIC symbol.
+  void
+  set_dynamic_symbol_size(const Symbol_table*);
+
   // Create the .interp section and PT_INTERP segment.
   void
   create_interp(const Target* target);
@@ -748,20 +767,24 @@ class Layout
   Output_section*
   get_output_section(const char* name, Stringpool::Key name_key,
                     elfcpp::Elf_Word type, elfcpp::Elf_Xword flags,
-                    bool is_interp, bool is_dynamic_linker_section);
+                    bool is_interp, bool is_dynamic_linker_section,
+                    bool is_relro, bool is_last_relro,
+                    bool is_first_non_relro);
 
   // Choose the output section for NAME in RELOBJ.
   Output_section*
   choose_output_section(const Relobj* relobj, const char* name,
                        elfcpp::Elf_Word type, elfcpp::Elf_Xword flags,
                        bool is_input_section, bool is_interp,
-                       bool is_dynamic_linker_section);
+                       bool is_dynamic_linker_section, bool is_relro,
+                       bool is_last_relro, bool is_first_non_relro);
 
   // Create a new Output_section.
   Output_section*
   make_output_section(const char* name, elfcpp::Elf_Word type,
                      elfcpp::Elf_Xword flags, bool is_interp,
-                     bool is_dynamic_linker_section);
+                     bool is_dynamic_linker_section, bool is_relro,
+                     bool is_last_relro, bool is_first_non_relro);
 
   // Attach a section to a segment.
   void
@@ -937,6 +960,9 @@ class Layout
   Output_segment* tls_segment_;
   // A pointer to the PT_GNU_RELRO segment if there is one.
   Output_segment* relro_segment_;
+  // A backend may increase the size of the PT_GNU_RELRO segment if
+  // there is one.  This is the amount to increase it by.
+  unsigned int increase_relro_;
   // The SHT_SYMTAB output section.
   Output_section* symtab_section_;
   // The SHT_SYMTAB_SHNDX for the regular symbol table if there is one.
@@ -947,6 +973,8 @@ class Layout
   Output_symtab_xindex* dynsym_xindex_;
   // The SHT_DYNAMIC output section if there is one.
   Output_section* dynamic_section_;
+  // The _DYNAMIC symbol if there is one.
+  Symbol* dynamic_symbol_;
   // The dynamic data which goes into dynamic_section_.
   Output_data_dynamic* dynamic_data_;
   // The exception frame output section if there is one.
@@ -967,6 +995,8 @@ class Layout
   Group_signatures group_signatures_;
   // The size of the output file.
   off_t output_file_size_;
+  // Whether we have added an input section to an output section.
+  bool have_added_input_section_;
   // Whether we have attached the sections to the segments.
   bool sections_are_attached_;
   // Whether we have seen an object file marked to require an