From Craig Silverstein and Cary Coutant: fix assignment of section
indexes to sections which are not associated with segments.
This commit is contained in:
parent
214270abf3
commit
868870607e
2 changed files with 29 additions and 8 deletions
|
@ -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.
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue