diff options
author | Ian Lance Taylor <iant@google.com> | 2007-11-07 22:33:30 +0000 |
---|---|---|
committer | Ian Lance Taylor <iant@google.com> | 2007-11-07 22:33:30 +0000 |
commit | 868870607e2ef7584a22243d0be7bf1601dfba6d (patch) | |
tree | fcee879680f665f20ea72e93b56a277da082823e /gold/layout.cc | |
parent | 214270abf389bb2aa4584423353a7da2a1e6b463 (diff) | |
download | gdb-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.cc | 26 |
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. |