aboutsummaryrefslogtreecommitdiff
path: root/gold/object.cc
diff options
context:
space:
mode:
Diffstat (limited to 'gold/object.cc')
-rw-r--r--gold/object.cc25
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;