From Craig Silverstein and Cary Coutant: fix assignment of section
authorIan Lance Taylor <iant@google.com>
Wed, 7 Nov 2007 22:33:30 +0000 (22:33 +0000)
committerIan Lance Taylor <iant@google.com>
Wed, 7 Nov 2007 22:33:30 +0000 (22:33 +0000)
indexes to sections which are not associated with segments.

gold/layout.cc
gold/layout.h

index d9593904f33d08c3837cf6c5362bd09379a1b53b..84e8722714c607a2d7e7af00b219cee4b12be985 100644 (file)
@@ -637,7 +637,7 @@ Layout::finalize(const Input_objects* input_objects, Symbol_table* symtab)
   // Set the file offsets of all the data sections not associated with
   // segments. This makes sure that debug sections have their offsets
   // before symbols are finalized.
-  off = this->set_section_offsets(off, &shndx, true);
+  off = this->set_section_offsets(off, true);
 
   // Create the symbol table sections.
   this->create_symtab_sections(input_objects, symtab, &off);
@@ -647,7 +647,10 @@ Layout::finalize(const Input_objects* input_objects, Symbol_table* symtab)
 
   // Set the file offsets of all the non-data sections not associated with
   // segments.
-  off = this->set_section_offsets(off, &shndx, false);
+  off = this->set_section_offsets(off, false);
+
+  // Now that all sections have been created, set the section indexes.
+  shndx = this->set_section_indexes(shndx);
 
   // Create the section table header.
   Output_section_headers* oshdrs = this->create_shdrs(&off);
@@ -993,7 +996,6 @@ Layout::set_segment_offsets(const Target* target, Output_segment* load_seg,
 
 off_t
 Layout::set_section_offsets(off_t off,
-                            unsigned int* pshndx,
                             bool do_bits_sections)
 {
   for (Section_list::iterator p = this->unattached_section_list_.begin();
@@ -1004,8 +1006,6 @@ Layout::set_section_offsets(off_t off,
                               || (*p)->type() == elfcpp::SHT_NOBITS);
       if (is_bits_section != do_bits_sections)
         continue;
-      (*p)->set_out_shndx(*pshndx);
-      ++*pshndx;
       if ((*p)->offset() != -1)
        continue;
       off = align_address(off, (*p)->addralign());
@@ -1015,6 +1015,22 @@ Layout::set_section_offsets(off_t off,
   return off;
 }
 
+// Set the section indexes of all the sections not associated with a
+// segment.
+
+unsigned int
+Layout::set_section_indexes(unsigned int shndx)
+{
+  for (Section_list::iterator p = this->unattached_section_list_.begin();
+       p != this->unattached_section_list_.end();
+       ++p)
+    {
+      (*p)->set_out_shndx(shndx);
+      ++shndx;
+    }
+  return shndx;
+}
+
 // Create the symbol table sections.  Here we also set the final
 // values of the symbols.  At this point all the loadable sections are
 // fully laid out.
index 6c7441e63be93f6cf2bc398f31e5e00ef4d1baaf..5e9871e38c4d20e3b449f42410a2b52de98678ff 100644 (file)
@@ -313,10 +313,15 @@ class Layout
   off_t
   set_segment_offsets(const Target*, Output_segment*, unsigned int* pshndx);
 
-  // Set the final file offsets and section indexes of all the
-  // sections not associated with a segment.
+  // Set the final file offsets of all the sections not associated
+  // with a segment.
   off_t
-  set_section_offsets(off_t, unsigned int *pshndx, bool do_bits_sections);
+  set_section_offsets(off_t, bool do_bits_sections);
+
+  // Set the final section indexes of all the sections not associated
+  // with a segment.  Returns the next unused index.
+  unsigned int
+  set_section_indexes(unsigned int pshndx);
 
   // Return whether SEG1 comes before SEG2 in the output file.
   static bool