From dba5a01fdc5128799e020cc34ba60f8d8c602a9e Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Sat, 27 Oct 2007 00:36:52 +0000 Subject: [PATCH] From Cary Coutant: Set offsets of sections with data before finalizing local symbols. --- gold/layout.cc | 17 ++++++++++++++--- gold/layout.h | 2 +- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/gold/layout.cc b/gold/layout.cc index 22d3b59169..488ca6de55 100644 --- a/gold/layout.cc +++ b/gold/layout.cc @@ -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) diff --git a/gold/layout.h b/gold/layout.h index 19c8e09ee1..6c7441e63b 100644 --- a/gold/layout.h +++ b/gold/layout.h @@ -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