From Cary Coutant: Set offsets of sections with data before finalizing

local symbols.
This commit is contained in:
Ian Lance Taylor 2007-10-27 00:36:52 +00:00
parent e3dd034fca
commit dba5a01fdc
2 changed files with 15 additions and 4 deletions

View file

@ -633,15 +633,20 @@ Layout::finalize(const Input_objects* input_objects, Symbol_table* symtab)
// they contain.
off_t off = this->set_segment_offsets(target, load_seg, &shndx);
// 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);
// Create the symbol table sections.
this->create_symtab_sections(input_objects, symtab, &off);
// Create the .shstrtab section.
Output_section* shstrtab_section = this->create_shstrtab();
// Set the file offsets of all the sections not associated with
// Set the file offsets of all the non-data sections not associated with
// segments.
off = this->set_section_offsets(off, &shndx);
off = this->set_section_offsets(off, &shndx, false);
// Create the section table header.
Output_section_headers* oshdrs = this->create_shdrs(&off);
@ -986,12 +991,18 @@ Layout::set_segment_offsets(const Target* target, Output_segment* load_seg,
// segment.
off_t
Layout::set_section_offsets(off_t off, unsigned int* pshndx)
Layout::set_section_offsets(off_t off,
unsigned int* pshndx,
bool do_bits_sections)
{
for (Section_list::iterator p = this->unattached_section_list_.begin();
p != this->unattached_section_list_.end();
++p)
{
bool is_bits_section = ((*p)->type() == elfcpp::SHT_PROGBITS
|| (*p)->type() == elfcpp::SHT_NOBITS);
if (is_bits_section != do_bits_sections)
continue;
(*p)->set_out_shndx(*pshndx);
++*pshndx;
if ((*p)->offset() != -1)

View file

@ -316,7 +316,7 @@ class Layout
// Set the final file offsets and section indexes of all the
// sections not associated with a segment.
off_t
set_section_offsets(off_t, unsigned int *pshndx);
set_section_offsets(off_t, unsigned int *pshndx, bool do_bits_sections);
// Return whether SEG1 comes before SEG2 in the output file.
static bool