aboutsummaryrefslogtreecommitdiff
path: root/gold/layout.cc
diff options
context:
space:
mode:
authorIan Lance Taylor <iant@google.com>2007-11-07 22:33:30 +0000
committerIan Lance Taylor <iant@google.com>2007-11-07 22:33:30 +0000
commit868870607e2ef7584a22243d0be7bf1601dfba6d (patch)
treefcee879680f665f20ea72e93b56a277da082823e /gold/layout.cc
parent214270abf389bb2aa4584423353a7da2a1e6b463 (diff)
downloadgdb-868870607e2ef7584a22243d0be7bf1601dfba6d.zip
gdb-868870607e2ef7584a22243d0be7bf1601dfba6d.tar.gz
gdb-868870607e2ef7584a22243d0be7bf1601dfba6d.tar.bz2
From Craig Silverstein and Cary Coutant: fix assignment of section
indexes to sections which are not associated with segments.
Diffstat (limited to 'gold/layout.cc')
-rw-r--r--gold/layout.cc26
1 files changed, 21 insertions, 5 deletions
diff --git a/gold/layout.cc b/gold/layout.cc
index d959390..84e8722 100644
--- a/gold/layout.cc
+++ b/gold/layout.cc
@@ -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.