From 0d5bbdb0e1d193fa6f6804f2620fbdfc950c57a4 Mon Sep 17 00:00:00 2001 From: Cary Coutant Date: Sat, 21 Mar 2015 18:50:11 -0700 Subject: Support compressed debug sections in dynamic object files. This patch adds support for reading compressed debug info in shared objects. It actually simplifies things, by moving the support for compressed sections all the way up to the top-level Object class, eliminating the need for several virtual methods. gold/ * dwp.cc (Sized_relobj_dwo::do_section_contents): Delete. (Sized_relobj_dwo::setup): Build compressed section map. (Sized_relobj_dwo::do_decompressed_section_contents): Delete. * dynobj.cc (Sized_dynobj::base_read_symbols): Build compressed section map. * object.cc (Sized_relobj_file::Sized_relobj_file): Remove compressed_sections_ field. (build_compressed_section_map): Take Object instead of Sized_relobj_file parameter; add decompress_if_needed parameter. (Sized_relobj_file::do_find_special_sections): Store compressed section map in parent Object. (Sized_relobj_file::do_decompressed_section_contents): Move implementation to Object::decompressed_section_contents. (Sized_relobj_file::do_discard_decompressed_sections): Move implementation to Object::discard_decompressed_sections. * object.h (build_compressed_section_map): Declare. (Object::Object): Add compressed_sections_ field. (Object::section_is_compressed): Move implementation here. (Object::decompressed_section_contents): De-virtualize. (Object::discard_decompressed_sections): De-virtualize. (Object::do_section_is_compressed): Delete. (Object::do_decompressed_section_contents): Delete. (Object::set_compressed_sections): New method. (Object::compressed_sections): New method. (Object::compressed_sections_): New data member. (Compressed_section_info, Compressed_section_map): Move to top of file. (Sized_relobj_file::do_section_is_compressed): Delete. (Sized_relobj_file::do_decompressed_section_contents): Delete. (Sized_relobj_file::do_discard_decompressed_sections): Delete. (Sized_relobj_file::compressed_sections_): Move to Object class. --- gold/object.cc | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) (limited to 'gold/object.cc') 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::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* obj) + Object* obj, + bool decompress_if_needed) { Compressed_section_map* uncompressed_map = new Compressed_section_map(); const unsigned int shdr_size = elfcpp::Elf_sizes::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::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( + 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::do_get_global_symbol_counts( // to the size. Set *IS_NEW to true if the contents need to be freed // by the caller. -template const unsigned char* -Sized_relobj_file::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::do_decompressed_section_contents( // Discard any buffers of uncompressed sections. This is done // at the end of the Add_symbols task. -template void -Sized_relobj_file::do_discard_decompressed_sections() +Object::discard_decompressed_sections() { if (this->compressed_sections_ == NULL) return; -- cgit v1.1