diff options
Diffstat (limited to 'gold/object.cc')
-rw-r--r-- | gold/object.cc | 25 |
1 files changed, 14 insertions, 11 deletions
diff --git a/gold/object.cc b/gold/object.cc index 84e4568..f983b66 100644 --- a/gold/object.cc +++ b/gold/object.cc @@ -477,8 +477,7 @@ Sized_relobj_file<size, big_endian>::Sized_relobj_file( discarded_eh_frame_shndx_(-1U), is_deferred_layout_(false), deferred_layout_(), - deferred_layout_relocs_(), - compressed_sections_() + deferred_layout_relocs_() { this->e_type_ = ehdr.get_e_type(); } @@ -720,7 +719,8 @@ build_compressed_section_map( unsigned int shnum, const char* names, section_size_type names_size, - Sized_relobj_file<size, big_endian>* obj) + Object* obj, + bool decompress_if_needed) { Compressed_section_map* uncompressed_map = new Compressed_section_map(); const unsigned int shdr_size = elfcpp::Elf_sizes<size>::shdr_size; @@ -752,7 +752,7 @@ build_compressed_section_map( if (uncompressed_size != -1ULL) { unsigned char* uncompressed_data = NULL; - if (need_decompressed_section(name)) + if (decompress_if_needed && need_decompressed_section(name)) { uncompressed_data = new unsigned char[uncompressed_size]; if (decompress_input_section(contents, len, @@ -786,9 +786,14 @@ Sized_relobj_file<size, big_endian>::do_find_special_sections( this->has_eh_frame_ = true; if (memmem(names, sd->section_names_size, ".zdebug_", 8) != NULL) - this->compressed_sections_ - = build_compressed_section_map(pshdrs, this->shnum(), names, - sd->section_names_size, this); + { + Compressed_section_map* compressed_sections = + build_compressed_section_map<size, big_endian>( + pshdrs, this->shnum(), names, sd->section_names_size, this, true); + if (compressed_sections != NULL) + this->set_compressed_sections(compressed_sections); + } + return (this->has_eh_frame_ || (!parameters->options().relocatable() && parameters->options().gdb_index() @@ -2849,9 +2854,8 @@ Sized_relobj_file<size, big_endian>::do_get_global_symbol_counts( // to the size. Set *IS_NEW to true if the contents need to be freed // by the caller. -template<int size, bool big_endian> const unsigned char* -Sized_relobj_file<size, big_endian>::do_decompressed_section_contents( +Object::decompressed_section_contents( unsigned int shndx, section_size_type* plen, bool* is_new) @@ -2905,9 +2909,8 @@ Sized_relobj_file<size, big_endian>::do_decompressed_section_contents( // Discard any buffers of uncompressed sections. This is done // at the end of the Add_symbols task. -template<int size, bool big_endian> void -Sized_relobj_file<size, big_endian>::do_discard_decompressed_sections() +Object::discard_decompressed_sections() { if (this->compressed_sections_ == NULL) return; |