diff options
author | Ian Lance Taylor <iant@google.com> | 2007-10-27 00:36:52 +0000 |
---|---|---|
committer | Ian Lance Taylor <iant@google.com> | 2007-10-27 00:36:52 +0000 |
commit | dba5a01fdc5128799e020cc34ba60f8d8c602a9e (patch) | |
tree | cbe490523c2cdeba18a626598e5cdaa0eb8db7be | |
parent | e3dd034fca239d8ee7352647d185b890d47fc022 (diff) | |
download | gdb-dba5a01fdc5128799e020cc34ba60f8d8c602a9e.zip gdb-dba5a01fdc5128799e020cc34ba60f8d8c602a9e.tar.gz gdb-dba5a01fdc5128799e020cc34ba60f8d8c602a9e.tar.bz2 |
From Cary Coutant: Set offsets of sections with data before finalizing
local symbols.
-rw-r--r-- | gold/layout.cc | 17 | ||||
-rw-r--r-- | gold/layout.h | 2 |
2 files changed, 15 insertions, 4 deletions
diff --git a/gold/layout.cc b/gold/layout.cc index 22d3b59..488ca6d 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 19c8e09..6c7441e 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 |