From Craig Silverstein and Cary Coutant: fix assignment of section

indexes to sections which are not associated with segments.
This commit is contained in:
Ian Lance Taylor 2007-11-07 22:33:30 +00:00
parent 214270abf3
commit 868870607e
2 changed files with 29 additions and 8 deletions

View 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.

View 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