diff options
author | Cary Coutant <ccoutant@google.com> | 2010-07-03 20:52:24 +0000 |
---|---|---|
committer | Cary Coutant <ccoutant@google.com> | 2010-07-03 20:52:24 +0000 |
commit | 0acf065b19253e02ea32188ea0cbdf4e80e3c42d (patch) | |
tree | 0d2d49261e7a67a1fe51bff909c8506dd46dfa04 /bfd | |
parent | 3a5530eaabb2592d7807687d51a8a9c8c6b4b3cd (diff) | |
download | gdb-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/ChangeLog | 7 | ||||
-rw-r--r-- | bfd/compress.c | 2 | ||||
-rw-r--r-- | bfd/dwarf2.c | 92 |
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) |