diff options
Diffstat (limited to 'binutils-2.25/gold/object.cc')
-rw-r--r-- | binutils-2.25/gold/object.cc | 31 |
1 files changed, 17 insertions, 14 deletions
diff --git a/binutils-2.25/gold/object.cc b/binutils-2.25/gold/object.cc index c90b67e8..56d22663 100644 --- a/binutils-2.25/gold/object.cc +++ b/binutils-2.25/gold/object.cc @@ -1,6 +1,6 @@ // object.cc -- support for an object file for linking in gold -// Copyright (C) 2006-2015 Free Software Foundation, Inc. +// Copyright (C) 2006-2014 Free Software Foundation, Inc. // Written by Ian Lance Taylor <iant@google.com>. // This file is part of gold. @@ -432,8 +432,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(); } @@ -675,7 +674,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; @@ -707,7 +707,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, @@ -741,9 +741,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() @@ -1666,8 +1671,8 @@ Sized_relobj_file<size, big_endian>::do_layout(Symbol_table* symtab, // is turned on this function is called twice; we only want to do this // on the first pass. if (!is_pass_two - && this->is_deferred_layout() - && (shdr.get_sh_flags() & elfcpp::SHF_ALLOC)) + && this->is_deferred_layout() + && (shdr.get_sh_flags() & elfcpp::SHF_ALLOC)) { this->deferred_layout_.push_back(Deferred_layout(i, name, pshdrs, @@ -2804,9 +2809,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) @@ -2860,9 +2864,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; |