summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCary Coutant <ccoutant@google.com>2014-12-16 14:57:17 -0800
committerCary Coutant <ccoutant@google.com>2014-12-16 14:58:15 -0800
commite02a4046e0617f3e2c1b811a1888db3fa998dfa4 (patch)
treec445e4ffc70e26081c00c06fad580b1ba5f89516
parent15969b63f98e669afd097a1878b191a01bf95d82 (diff)
downloadbinutils-gdb-e02a4046e0617f3e2c1b811a1888db3fa998dfa4.tar.gz
Fix internal error in gold when -Map and --compress-debug-sections are used
together. gold/ * mapfile.cc (Mapfile::print_input_section): Print uncompressed sizes. (Mapfile::print_output_data): Use current_data_size() to avoid assert for sections requiring postprocessing; if address is not valid, print 0. (Mapfile::print_output_section): Use current_data_size(); print note that addresses and sizes are before compression.
-rw-r--r--gold/ChangeLog9
-rw-r--r--gold/mapfile.cc16
2 files changed, 21 insertions, 4 deletions
diff --git a/gold/ChangeLog b/gold/ChangeLog
index 8f560432278..9edf043e752 100644
--- a/gold/ChangeLog
+++ b/gold/ChangeLog
@@ -1,3 +1,12 @@
+2014-12-16 Cary Coutant <ccoutant@google.com>
+
+ * mapfile.cc (Mapfile::print_input_section): Print uncompressed sizes.
+ (Mapfile::print_output_data): Use current_data_size() to avoid
+ assert for sections requiring postprocessing; if address is not valid,
+ print 0.
+ (Mapfile::print_output_section): Use current_data_size(); print note
+ that addresses and sizes are before compression.
+
2014-12-14 H.J. Lu <hongjiu.lu@intel.com>
* aarch64.cc (AArch64_relocate_functions::maybe_apply_stub):
diff --git a/gold/mapfile.cc b/gold/mapfile.cc
index dc995e9a61f..c6d7ed27043 100644
--- a/gold/mapfile.cc
+++ b/gold/mapfile.cc
@@ -258,8 +258,11 @@ Mapfile::print_input_section(Relobj* relobj, unsigned int shndx)
}
char sizebuf[50];
+ section_size_type size;
+ if (!relobj->section_is_compressed(shndx, &size))
+ size = relobj->section_size(shndx);
snprintf(sizebuf, sizeof sizebuf, "0x%llx",
- static_cast<unsigned long long>(relobj->section_size(shndx)));
+ static_cast<unsigned long long>(size));
fprintf(this->map_file_, "0x%0*llx %10s %s\n",
parameters->target().get_size() / 4,
@@ -328,11 +331,13 @@ Mapfile::print_output_data(const Output_data* od, const char* name)
char sizebuf[50];
snprintf(sizebuf, sizeof sizebuf, "0x%llx",
- static_cast<unsigned long long>(od->data_size()));
+ static_cast<unsigned long long>(od->current_data_size()));
fprintf(this->map_file_, "0x%0*llx %10s\n",
parameters->target().get_size() / 4,
- static_cast<unsigned long long>(od->address()),
+ (od->is_address_valid()
+ ? static_cast<unsigned long long>(od->address())
+ : 0),
sizebuf);
}
@@ -387,7 +392,7 @@ Mapfile::print_output_section(const Output_section* os)
char sizebuf[50];
snprintf(sizebuf, sizeof sizebuf, "0x%llx",
- static_cast<unsigned long long>(os->data_size()));
+ static_cast<unsigned long long>(os->current_data_size()));
fprintf(this->map_file_, "0x%0*llx %10s",
parameters->target().get_size() / 4,
@@ -398,6 +403,9 @@ Mapfile::print_output_section(const Output_section* os)
parameters->target().get_size() / 4,
static_cast<unsigned long long>(os->load_address()));
+ if (os->requires_postprocessing())
+ fprintf(this->map_file_, " (before compression)");
+
putc('\n', this->map_file_);
}