// 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);
// 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)
// 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