aboutsummaryrefslogtreecommitdiff
path: root/bfd
diff options
context:
space:
mode:
authorCary Coutant <ccoutant@google.com>2010-07-03 20:52:24 +0000
committerCary Coutant <ccoutant@google.com>2010-07-03 20:52:24 +0000
commit0acf065b19253e02ea32188ea0cbdf4e80e3c42d (patch)
tree0d2d49261e7a67a1fe51bff909c8506dd46dfa04 /bfd
parent3a5530eaabb2592d7807687d51a8a9c8c6b4b3cd (diff)
downloadgdb-0acf065b19253e02ea32188ea0cbdf4e80e3c42d.zip
gdb-0acf065b19253e02ea32188ea0cbdf4e80e3c42d.tar.gz
gdb-0acf065b19253e02ea32188ea0cbdf4e80e3c42d.tar.bz2
bfd/ChangeLog:
* compress.c (bfd_uncompress_section_contents): Add ATTRIBUTE_UNUSED. * dwarf2.c (read_and_uncompress_section): New function. (read_section): Call it. (find_line): Likewise. binutils/ChangeLog: * objdump.c (load_specific_debug_section): Decompress section contents before applying relocations. * readelf.c (load_specific_debug_section): Update section size after decompression. gas/ChangeLog: * Makefile.am: Add compress-debug.c and compress-debug.h. * Makefile.in: Regenerate. * config.in: Add HAVE_ZLIB_H. * configure.in: Check for zlib.h. * configure: Regenerate. * as.c (parse_args): Add --compress-debug-sections and --nocompress-debug-sections. * as.h (flag_compress_debug): New variable. * compress-debug.c: New file. * compress-debug.h: New file. * write.c: Include compress-debug.h. (compress_frag): New function. (compress_debug): New function. (write_object_file): Compress debug sections if requested.
Diffstat (limited to 'bfd')
-rw-r--r--bfd/ChangeLog7
-rw-r--r--bfd/compress.c2
-rw-r--r--bfd/dwarf2.c92
3 files changed, 64 insertions, 37 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 91ed31f..a18507f 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,10 @@
+2010-07-03 Cary Coutant <ccoutant@google.com>
+
+ * compress.c (bfd_uncompress_section_contents): Add ATTRIBUTE_UNUSED.
+ * dwarf2.c (read_and_uncompress_section): New function.
+ (read_section): Call it.
+ (find_line): Likewise.
+
2010-07-01 Alan Modra <amodra@gmail.com>
* elf64-ppc.c (ppc64_elf_edit_toc): Use SYMBOL_CALLS_LOCAL rather
diff --git a/bfd/compress.c b/bfd/compress.c
index e074eca..fe1b0fd 100644
--- a/bfd/compress.c
+++ b/bfd/compress.c
@@ -1,4 +1,4 @@
-/* ELF attributes support (based on ARM EABI attributes).
+/* Compressed section support (intended for debug sections).
Copyright 2008, 2010
Free Software Foundation, Inc.
diff --git a/bfd/dwarf2.c b/bfd/dwarf2.c
index 9b194aa..ffe1108 100644
--- a/bfd/dwarf2.c
+++ b/bfd/dwarf2.c
@@ -405,6 +405,54 @@ lookup_info_hash_table (struct info_hash_table *hash_table, const char *key)
return entry ? entry->head : NULL;
}
+/* Read a section, uncompress it if necessary, and relocate it. */
+
+static bfd_boolean
+read_and_uncompress_section (bfd * abfd,
+ asection * msec,
+ bfd_boolean section_is_compressed,
+ asymbol ** syms,
+ bfd_byte ** section_buffer,
+ bfd_size_type * section_size)
+{
+ /* Get the unrelocated contents of the section. */
+ *section_buffer = (bfd_byte *) bfd_malloc (*section_size);
+ if (! *section_buffer)
+ return FALSE;
+ if (! bfd_get_section_contents (abfd, msec, *section_buffer,
+ 0, *section_size))
+ return FALSE;
+
+ if (section_is_compressed)
+ {
+ if (! bfd_uncompress_section_contents (section_buffer, section_size))
+ {
+ (*_bfd_error_handler) (_("Dwarf Error: unable to decompress %s section."),
+ bfd_get_section_name (abfd, msec));
+ bfd_set_error (bfd_error_bad_value);
+ return FALSE;
+ }
+ }
+
+ if (syms)
+ {
+ /* We want to relocate the data we've already read (and
+ decompressed), so we store a pointer to the data in
+ the bfd_section, and tell it that the contents are
+ already in memory. */
+ BFD_ASSERT (msec->contents == NULL && (msec->flags & SEC_IN_MEMORY) == 0);
+ msec->contents = *section_buffer;
+ msec->flags |= SEC_IN_MEMORY;
+ msec->size = *section_size;
+ *section_buffer
+ = bfd_simple_get_relocated_section_contents (abfd, msec, NULL, syms);
+ if (! *section_buffer)
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
/* Read a section into its appropriate place in the dwarf2_debug
struct (indicated by SECTION_BUFFER and SECTION_SIZE). If SYMS is
not NULL, use bfd_simple_get_relocated_section_contents to read the
@@ -440,32 +488,10 @@ read_section (bfd * abfd,
}
*section_size = msec->rawsize ? msec->rawsize : msec->size;
- if (syms)
- {
- *section_buffer
- = bfd_simple_get_relocated_section_contents (abfd, msec, NULL, syms);
- if (! *section_buffer)
- return FALSE;
- }
- else
- {
- *section_buffer = (bfd_byte *) bfd_malloc (*section_size);
- if (! *section_buffer)
- return FALSE;
- if (! bfd_get_section_contents (abfd, msec, *section_buffer,
- 0, *section_size))
- return FALSE;
- }
- if (section_is_compressed)
- {
- if (! bfd_uncompress_section_contents (section_buffer, section_size))
- {
- (*_bfd_error_handler) (_("Dwarf Error: unable to decompress %s section."), compressed_section_name);
- bfd_set_error (bfd_error_bad_value);
- return FALSE;
- }
- }
+ if (! read_and_uncompress_section (abfd, msec, section_is_compressed,
+ syms, section_buffer, section_size))
+ return FALSE;
}
/* It is possible to get a bad value for the offset into the section
@@ -3242,23 +3268,17 @@ find_line (bfd *abfd,
{
bfd_size_type size = msec->size;
bfd_byte *buffer, *tmp;
+ bfd_boolean is_compressed =
+ strcmp (msec->name, DWARF2_COMPRESSED_DEBUG_INFO) == 0;
if (size == 0)
continue;
- buffer = (bfd_simple_get_relocated_section_contents
- (debug_bfd, msec, NULL, symbols));
- if (! buffer)
+ if (! read_and_uncompress_section (debug_bfd, msec,
+ is_compressed, symbols,
+ &buffer, &size))
goto done;
- if (strcmp (msec->name, DWARF2_COMPRESSED_DEBUG_INFO) == 0)
- {
- if (! bfd_uncompress_section_contents (&buffer, &size))
- {
- free (buffer);
- goto done;
- }
- }
tmp = (bfd_byte *) bfd_realloc (stash->info_ptr_memory,
total_size + size);
if (tmp == NULL)