mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-11-23 10:03:47 +08:00
Add compressed debug section support to binutils and ld.
bfd/ 2010-10-29 H.J. Lu <hongjiu.lu@intel.com> Cary Coutant <ccoutant@google.com> * archive.c (bfd_openr_next_archived_file): Copy BFD_COMPRESS and BFD_DECOMPRESS. * bfd.c (BFD_COMPRESS): New. (BFD_DECOMPRESS): Likewise. (BFD_FLAGS_SAVED): Likewise. (bfd_preserve_save): Replace BFD_IN_MEMORY with BFD_FLAGS_SAVED. * compress.c (bfd_uncompress_section_contents): Removed. (get_uncompressed_size): New. (decompress_contents): Likewise. (bfd_compress_section_contents): Likewise. (bfd_get_full_section_contents): Likewise. (bfd_is_section_compressed): Likewise. (bfd_init_section_decompress_status): Likewise. (bfd_init_section_compress_status): Likewise. * dwarf2.c (dwarf_debug_sections): New. (dwarf_debug_section_enum): Likewise. (read_section): Remove section_name and compressed_section_name. Add dwarf_debug_section_enum. Try compressed debug section. (read_indirect_string): Updated. (read_abbrevs): Likewise. (decode_line_info): Likewise. (read_debug_ranges): Likewise. (find_line): Updated. * ecoff.c (bfd_debug_section): Add compress_status and compressed_size. * elf.c (_bfd_elf_make_section_from_shdr): Call bfd_is_section_compressed to check if a DWARF debug section is compressed. Call bfd_init_section_compress_status or bfd_init_section_decompress_status if needed. * elflink.c (elf_link_input_bfd): Replace bfd_get_section_contents with bfd_get_full_section_contents. * merge.c (_bfd_add_merge_section): Likewise. * reloc.c (bfd_generic_get_relocated_section_contents): Likewise. * simple.c (bfd_simple_get_relocated_section_contents): Likewise. * elfxx-target.h (TARGET_BIG_SYM): Allow BFD_COMPRESS and BFD_DECOMPRESS. (TARGET_LITTLE_SYM): Likewise. * libbfd-in.h (dwarf_debug_section): New. (dwarf_debug_sections): Likewise. * libbfd.c (_bfd_generic_get_section_contents): Issue an error when getting contents on compressed/decompressed section. * section.c (COMPRESS_SECTION_NONE): New. (COMPRESS_SECTION_DONE): Likewise. (DECOMPRESS_SECTION_SIZED): Likewise. (BFD_FAKE_SECTION): Add compress_status and compressed_size. (bfd_malloc_and_get_section): Replace bfd_get_section_contents with bfd_get_full_section_contents. * bfd-in2.h: Regenerated. * libbfd.h: Likewise. binutils/ 2010-10-29 H.J. Lu <hongjiu.lu@intel.com> * addr2line.c (process_file): Set BFD_DECOMPRESS. * objcopy.c (do_debug_sections): New. (OPTION_COMPRESS_DEBUG_SECTIONS): New. (OPTION_DECOMPRESS_DEBUG_SECTIONS): Likewise. (copy_options): Add OPTION_COMPRESS_DEBUG_SECTIONS and OPTION_DECOMPRESS_DEBUG_SECTIONS. (copy_usage): Add --compress-debug-sections and --decompress-debug-sections. (copy_file): Set BFD_COMPRESS or BFD_DECOMPRESS. (copy_section): Replace bfd_get_section_contents with bfd_get_full_section_contents. (copy_main): Handle OPTION_COMPRESS_DEBUG_SECTIONS and OPTION_DECOMPRESS_DEBUG_SECTIONS. Check do_debug_sections to rename DWARF debug sections. * objdump.c (load_specific_debug_section): Replace bfd_get_section_contents with bfd_get_full_section_contents. Remove bfd_uncompress_section_contents. (dump_section): Replace bfd_get_section_contents with bfd_get_full_section_contents. (display_file): Set BFD_DECOMPRESS if needed. * readelf.c (uncompress_section_contents): Set buffer to NULL to indiate decompression failure. (load_specific_debug_section): Always call uncompress_section_contents. * doc/binutils.texi: Document --compress-debug-sections and --decompress-debug-sections. binutils/testsuite/ 2010-10-29 H.J. Lu <hongjiu.lu@intel.com> * binutils-all/compress.exp: New. * binutils-all/dw2-1.S: Likewise. * binutils-all/dw2-2.S: Likewise. * binutils-all/libdw2-compressed.out: Likewise. * binutils-all/libdw2.out: Likewise. gas/ 2010-10-29 H.J. Lu <hongjiu.lu@intel.com> * write.c (compress_debug): Optimize section flags check. gas/testsuite/ 2010-10-29 H.J. Lu <hongjiu.lu@intel.com> * elf/dwarf2-1.s: Replace .zdebug_abbrev section with .debug_abbrev section. * elf/dwarf2-2.3: Likewise. * elf/dwarf2-1.d: Pass --compress-debug-sections to assembler. Updated. * elf/dwarf2-2.d: Likewise. * gas/i386/i386.exp: Remove xfail on dw2-compress-2 and x86-64-dw2-compress-2. ld/ 2010-10-29 H.J. Lu <hongjiu.lu@intel.com> * ldfile.c (ldfile_try_open_bfd): Set BFD_DECOMPRESS after bfd_openr returns. * emultempl/elf32.em (gld${EMULATION_NAME}_try_needed): Likewise. * scripttempl/elf.sc: Include compressed DWARF debug sections. ld/testsuite/ 2010-10-29 H.J. Lu <hongjiu.lu@intel.com> * ld-elf/compress.exp: New. * ld-elf/compress1.s: Likewise. * ld-elf/compress1a.d: Likewise. * ld-elf/compress1b.d: Likewise. * ld-elf/compress1c.d: Likewise.
This commit is contained in:
parent
e58bcb8f09
commit
4a114e3e0c
@ -1,3 +1,67 @@
|
||||
2010-10-29 H.J. Lu <hongjiu.lu@intel.com>
|
||||
Cary Coutant <ccoutant@google.com>
|
||||
|
||||
* archive.c (bfd_openr_next_archived_file): Copy BFD_COMPRESS
|
||||
and BFD_DECOMPRESS.
|
||||
|
||||
* bfd.c (BFD_COMPRESS): New.
|
||||
(BFD_DECOMPRESS): Likewise.
|
||||
(BFD_FLAGS_SAVED): Likewise.
|
||||
(bfd_preserve_save): Replace BFD_IN_MEMORY with BFD_FLAGS_SAVED.
|
||||
|
||||
* compress.c (bfd_uncompress_section_contents): Removed.
|
||||
(get_uncompressed_size): New.
|
||||
(decompress_contents): Likewise.
|
||||
(bfd_compress_section_contents): Likewise.
|
||||
(bfd_get_full_section_contents): Likewise.
|
||||
(bfd_is_section_compressed): Likewise.
|
||||
(bfd_init_section_decompress_status): Likewise.
|
||||
(bfd_init_section_compress_status): Likewise.
|
||||
|
||||
* dwarf2.c (dwarf_debug_sections): New.
|
||||
(dwarf_debug_section_enum): Likewise.
|
||||
(read_section): Remove section_name and compressed_section_name.
|
||||
Add dwarf_debug_section_enum. Try compressed debug section.
|
||||
(read_indirect_string): Updated.
|
||||
(read_abbrevs): Likewise.
|
||||
(decode_line_info): Likewise.
|
||||
(read_debug_ranges): Likewise.
|
||||
(find_line): Updated.
|
||||
|
||||
* ecoff.c (bfd_debug_section): Add compress_status and
|
||||
compressed_size.
|
||||
|
||||
* elf.c (_bfd_elf_make_section_from_shdr): Call
|
||||
bfd_is_section_compressed to check if a DWARF debug section is
|
||||
compressed. Call bfd_init_section_compress_status or
|
||||
bfd_init_section_decompress_status if needed.
|
||||
|
||||
* elflink.c (elf_link_input_bfd): Replace bfd_get_section_contents
|
||||
with bfd_get_full_section_contents.
|
||||
* merge.c (_bfd_add_merge_section): Likewise.
|
||||
* reloc.c (bfd_generic_get_relocated_section_contents): Likewise.
|
||||
* simple.c (bfd_simple_get_relocated_section_contents): Likewise.
|
||||
|
||||
* elfxx-target.h (TARGET_BIG_SYM): Allow BFD_COMPRESS and
|
||||
BFD_DECOMPRESS.
|
||||
(TARGET_LITTLE_SYM): Likewise.
|
||||
|
||||
* libbfd-in.h (dwarf_debug_section): New.
|
||||
(dwarf_debug_sections): Likewise.
|
||||
|
||||
* libbfd.c (_bfd_generic_get_section_contents): Issue an error
|
||||
when getting contents on compressed/decompressed section.
|
||||
|
||||
* section.c (COMPRESS_SECTION_NONE): New.
|
||||
(COMPRESS_SECTION_DONE): Likewise.
|
||||
(DECOMPRESS_SECTION_SIZED): Likewise.
|
||||
(BFD_FAKE_SECTION): Add compress_status and compressed_size.
|
||||
(bfd_malloc_and_get_section): Replace bfd_get_section_contents
|
||||
with bfd_get_full_section_contents.
|
||||
|
||||
* bfd-in2.h: Regenerated.
|
||||
* libbfd.h: Likewise.
|
||||
|
||||
2010-10-29 Bernd Schmidt <bernds@codesourcery.com>
|
||||
Joseph Myers <joseph@codesourcery.com>
|
||||
|
||||
|
@ -697,6 +697,8 @@ DESCRIPTION
|
||||
bfd *
|
||||
bfd_openr_next_archived_file (bfd *archive, bfd *last_file)
|
||||
{
|
||||
bfd *abfd;
|
||||
|
||||
if ((bfd_get_format (archive) != bfd_archive)
|
||||
|| (archive->direction == write_direction))
|
||||
{
|
||||
@ -704,8 +706,14 @@ bfd_openr_next_archived_file (bfd *archive, bfd *last_file)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return BFD_SEND (archive,
|
||||
abfd = BFD_SEND (archive,
|
||||
openr_next_archived_file, (archive, last_file));
|
||||
|
||||
/* Copy BFD_COMPRESS and BFD_DECOMPRESS flags. */
|
||||
if (abfd)
|
||||
abfd->flags |= archive->flags & (BFD_COMPRESS | BFD_DECOMPRESS);
|
||||
|
||||
return abfd;
|
||||
}
|
||||
|
||||
bfd *
|
||||
|
@ -1353,6 +1353,12 @@ typedef struct bfd_section
|
||||
/* Mark flag used by some linker backends for garbage collection. */
|
||||
unsigned int gc_mark : 1;
|
||||
|
||||
/* Section compression status. */
|
||||
unsigned int compress_status : 2;
|
||||
#define COMPRESS_SECTION_NONE 0
|
||||
#define COMPRESS_SECTION_DONE 1
|
||||
#define DECOMPRESS_SECTION_SIZED 2
|
||||
|
||||
/* The following flags are used by the ELF linker. */
|
||||
|
||||
/* Mark sections which have been allocated to segments. */
|
||||
@ -1409,6 +1415,9 @@ typedef struct bfd_section
|
||||
section size calculated on a previous linker relaxation pass. */
|
||||
bfd_size_type rawsize;
|
||||
|
||||
/* The compressed size of the section in octets. */
|
||||
bfd_size_type compressed_size;
|
||||
|
||||
/* Relaxation table. */
|
||||
struct relax_table *relax;
|
||||
|
||||
@ -1642,17 +1651,17 @@ extern asection bfd_ind_section;
|
||||
/* name, id, index, next, prev, flags, user_set_vma, */ \
|
||||
{ NAME, IDX, 0, NULL, NULL, FLAGS, 0, \
|
||||
\
|
||||
/* linker_mark, linker_has_input, gc_mark, segment_mark, */ \
|
||||
/* linker_mark, linker_has_input, gc_mark, decompress_status, */ \
|
||||
0, 0, 1, 0, \
|
||||
\
|
||||
/* sec_info_type, use_rela_p, */ \
|
||||
0, 0, \
|
||||
/* segment_mark, sec_info_type, use_rela_p, */ \
|
||||
0, 0, 0, \
|
||||
\
|
||||
/* sec_flg0, sec_flg1, sec_flg2, sec_flg3, sec_flg4, sec_flg5, */ \
|
||||
0, 0, 0, 0, 0, 0, \
|
||||
\
|
||||
/* vma, lma, size, rawsize, relax, relax_count, */ \
|
||||
0, 0, 0, 0, 0, 0, \
|
||||
/* vma, lma, size, rawsize, compressed_size, relax, relax_count, */ \
|
||||
0, 0, 0, 0, 0, 0, 0, \
|
||||
\
|
||||
/* output_offset, output_section, alignment_power, */ \
|
||||
0, (struct bfd_section *) &SEC, 0, \
|
||||
@ -5062,6 +5071,16 @@ struct bfd
|
||||
will be consistent from run to run. */
|
||||
#define BFD_DETERMINISTIC_OUTPUT 0x4000
|
||||
|
||||
/* Compress sections in this BFD. */
|
||||
#define BFD_COMPRESS 0x8000
|
||||
|
||||
/* Decompress sections in this BFD. */
|
||||
#define BFD_DECOMPRESS 0x10000
|
||||
|
||||
/* Flags bits to be saved in bfd_preserve_save. */
|
||||
#define BFD_FLAGS_SAVED \
|
||||
(BFD_IN_MEMORY | BFD_COMPRESS | BFD_DECOMPRESS)
|
||||
|
||||
/* Currently my_archive is tested before adding origin to
|
||||
anything. I believe that this can become always an add of
|
||||
origin, with origin set to 0 for non archive files. */
|
||||
@ -5893,8 +5912,21 @@ bfd_byte *bfd_simple_get_relocated_section_contents
|
||||
(bfd *abfd, asection *sec, bfd_byte *outbuf, asymbol **symbol_table);
|
||||
|
||||
/* Extracted from compress.c. */
|
||||
bfd_boolean bfd_uncompress_section_contents
|
||||
(bfd_byte **buffer, bfd_size_type *size);
|
||||
bfd_boolean bfd_compress_section_contents
|
||||
(bfd *abfd, asection *section, bfd_byte *uncompressed_buffer,
|
||||
bfd_size_type uncompressed_size);
|
||||
|
||||
bfd_boolean bfd_get_full_section_contents
|
||||
(bfd *abfd, asection *section, bfd_byte **ptr);
|
||||
|
||||
bfd_boolean bfd_is_section_compressed
|
||||
(bfd *abfd, asection *section);
|
||||
|
||||
bfd_boolean bfd_init_section_decompress_status
|
||||
(bfd *abfd, asection *section);
|
||||
|
||||
bfd_boolean bfd_init_section_compress_status
|
||||
(bfd *abfd, asection *section);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
12
bfd/bfd.c
12
bfd/bfd.c
@ -151,6 +151,16 @@ CODE_FRAGMENT
|
||||
. will be consistent from run to run. *}
|
||||
.#define BFD_DETERMINISTIC_OUTPUT 0x4000
|
||||
.
|
||||
. {* Compress sections in this BFD. *}
|
||||
.#define BFD_COMPRESS 0x8000
|
||||
.
|
||||
. {* Decompress sections in this BFD. *}
|
||||
.#define BFD_DECOMPRESS 0x10000
|
||||
.
|
||||
. {* Flags bits to be saved in bfd_preserve_save. *}
|
||||
.#define BFD_FLAGS_SAVED \
|
||||
. (BFD_IN_MEMORY | BFD_COMPRESS | BFD_DECOMPRESS)
|
||||
.
|
||||
. {* Currently my_archive is tested before adding origin to
|
||||
. anything. I believe that this can become always an add of
|
||||
. origin, with origin set to 0 for non archive files. *}
|
||||
@ -1628,7 +1638,7 @@ bfd_preserve_save (bfd *abfd, struct bfd_preserve *preserve)
|
||||
|
||||
abfd->tdata.any = NULL;
|
||||
abfd->arch_info = &bfd_default_arch_struct;
|
||||
abfd->flags &= BFD_IN_MEMORY;
|
||||
abfd->flags &= BFD_FLAGS_SAVED;
|
||||
abfd->sections = NULL;
|
||||
abfd->section_last = NULL;
|
||||
abfd->section_count = 0;
|
||||
|
402
bfd/compress.c
402
bfd/compress.c
@ -27,49 +27,309 @@
|
||||
#include <zlib.h>
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_ZLIB_H
|
||||
static bfd_boolean
|
||||
decompress_contents (bfd_byte *compressed_buffer,
|
||||
bfd_size_type compressed_size,
|
||||
bfd_byte *uncompressed_buffer,
|
||||
bfd_size_type uncompressed_size)
|
||||
{
|
||||
z_stream strm;
|
||||
int rc;
|
||||
|
||||
/* It is possible the section consists of several compressed
|
||||
buffers concatenated together, so we uncompress in a loop. */
|
||||
strm.zalloc = NULL;
|
||||
strm.zfree = NULL;
|
||||
strm.opaque = NULL;
|
||||
strm.avail_in = compressed_size - 12;
|
||||
strm.next_in = (Bytef*) compressed_buffer + 12;
|
||||
strm.avail_out = uncompressed_size;
|
||||
|
||||
rc = inflateInit (&strm);
|
||||
while (strm.avail_in > 0)
|
||||
{
|
||||
if (rc != Z_OK)
|
||||
return FALSE;
|
||||
strm.next_out = ((Bytef*) uncompressed_buffer
|
||||
+ (uncompressed_size - strm.avail_out));
|
||||
rc = inflate (&strm, Z_FINISH);
|
||||
if (rc != Z_STREAM_END)
|
||||
return FALSE;
|
||||
rc = inflateReset (&strm);
|
||||
}
|
||||
rc = inflateEnd (&strm);
|
||||
return rc != Z_OK || strm.avail_out != 0 ? FALSE: TRUE;
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
FUNCTION
|
||||
bfd_uncompress_section_contents
|
||||
bfd_compress_section_contents
|
||||
|
||||
SYNOPSIS
|
||||
bfd_boolean bfd_uncompress_section_contents
|
||||
(bfd_byte **buffer, bfd_size_type *size);
|
||||
bfd_boolean bfd_compress_section_contents
|
||||
(bfd *abfd, asection *section, bfd_byte *uncompressed_buffer,
|
||||
bfd_size_type uncompressed_size);
|
||||
|
||||
DESCRIPTION
|
||||
|
||||
Uncompresses a section that was compressed using zlib, in place. At
|
||||
the call to this function, *@var{buffer} and *@var{size} should point
|
||||
to the section contents to be uncompressed. At the end of the
|
||||
function, *@var{buffer} and *@var{size} will point to the uncompressed
|
||||
contents. This function assumes *BUFFER was allocated using
|
||||
bfd_malloc() or equivalent. If the section is not a valid compressed
|
||||
section, or zlib is not installed on this machine, the input is
|
||||
unmodified.
|
||||
Compress data of the size specified in @var{uncompressed_size}
|
||||
and pointed to by @var{uncompressed_buffer} using zlib and store
|
||||
as the contents field. This function assumes the contents
|
||||
field was allocated using bfd_malloc() or equivalent. If zlib
|
||||
is not installed on this machine, the input is unmodified.
|
||||
|
||||
Returns @code{FALSE} if unable to uncompress successfully; in that case
|
||||
the input is unmodified. Otherwise, returns @code{TRUE}.
|
||||
Return @code{TRUE} if the full section contents is compressed
|
||||
successfully.
|
||||
*/
|
||||
|
||||
bfd_boolean
|
||||
bfd_uncompress_section_contents (bfd_byte **buffer ATTRIBUTE_UNUSED,
|
||||
bfd_size_type *size ATTRIBUTE_UNUSED)
|
||||
bfd_compress_section_contents (bfd *abfd ATTRIBUTE_UNUSED,
|
||||
sec_ptr sec ATTRIBUTE_UNUSED,
|
||||
bfd_byte *uncompressed_buffer ATTRIBUTE_UNUSED,
|
||||
bfd_size_type uncompressed_size ATTRIBUTE_UNUSED)
|
||||
{
|
||||
#ifndef HAVE_ZLIB_H
|
||||
bfd_set_error (bfd_error_invalid_operation);
|
||||
return FALSE;
|
||||
#else
|
||||
bfd_size_type compressed_size = *size;
|
||||
bfd_byte *compressed_buffer = *buffer;
|
||||
bfd_size_type compressed_size;
|
||||
bfd_byte *compressed_buffer;
|
||||
|
||||
compressed_size = compressBound (uncompressed_size) + 12;
|
||||
compressed_buffer = (bfd_byte *) bfd_malloc (compressed_size);
|
||||
|
||||
if (compress ((Bytef*) compressed_buffer + 12,
|
||||
&compressed_size,
|
||||
(const Bytef*) uncompressed_buffer,
|
||||
uncompressed_size) != Z_OK)
|
||||
{
|
||||
free (compressed_buffer);
|
||||
bfd_set_error (bfd_error_bad_value);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/* Write the zlib header. In this case, it should be "ZLIB" followed
|
||||
by the uncompressed section size, 8 bytes in big-endian order. */
|
||||
memcpy (compressed_buffer, "ZLIB", 4);
|
||||
compressed_buffer[11] = uncompressed_size; uncompressed_size >>= 8;
|
||||
compressed_buffer[10] = uncompressed_size; uncompressed_size >>= 8;
|
||||
compressed_buffer[9] = uncompressed_size; uncompressed_size >>= 8;
|
||||
compressed_buffer[8] = uncompressed_size; uncompressed_size >>= 8;
|
||||
compressed_buffer[7] = uncompressed_size; uncompressed_size >>= 8;
|
||||
compressed_buffer[6] = uncompressed_size; uncompressed_size >>= 8;
|
||||
compressed_buffer[5] = uncompressed_size; uncompressed_size >>= 8;
|
||||
compressed_buffer[4] = uncompressed_size;
|
||||
compressed_size += 12;
|
||||
|
||||
/* Free the uncompressed contents if we compress in place. */
|
||||
if (uncompressed_buffer == sec->contents)
|
||||
free (uncompressed_buffer);
|
||||
|
||||
sec->contents = compressed_buffer;
|
||||
sec->size = compressed_size;
|
||||
sec->compress_status = COMPRESS_SECTION_DONE;
|
||||
|
||||
return TRUE;
|
||||
#endif /* HAVE_ZLIB_H */
|
||||
}
|
||||
|
||||
/*
|
||||
FUNCTION
|
||||
bfd_get_full_section_contents
|
||||
|
||||
SYNOPSIS
|
||||
bfd_boolean bfd_get_full_section_contents
|
||||
(bfd *abfd, asection *section, bfd_byte **ptr);
|
||||
|
||||
DESCRIPTION
|
||||
Read all data from @var{section} in BFD @var{abfd}, decompress
|
||||
if needed, and store in @var{*ptr}. If @var{*ptr} is NULL,
|
||||
return @var{*ptr} with memory malloc'd by this function.
|
||||
|
||||
Return @code{TRUE} if the full section contents is retrieved
|
||||
successfully.
|
||||
*/
|
||||
|
||||
bfd_boolean
|
||||
bfd_get_full_section_contents (bfd *abfd, sec_ptr sec, bfd_byte **ptr)
|
||||
{
|
||||
bfd_size_type sz = sec->rawsize ? sec->rawsize : sec->size;
|
||||
bfd_byte *p = *ptr;
|
||||
bfd_boolean need_free, ret;
|
||||
#ifdef HAVE_ZLIB_H
|
||||
bfd_size_type compressed_size;
|
||||
bfd_size_type uncompressed_size;
|
||||
bfd_size_type rawsize;
|
||||
bfd_byte *compressed_buffer;
|
||||
bfd_byte *uncompressed_buffer;
|
||||
z_stream strm;
|
||||
int rc;
|
||||
bfd_size_type header_size = 12;
|
||||
#endif
|
||||
|
||||
if (sz == 0)
|
||||
return TRUE;
|
||||
|
||||
switch (sec->compress_status)
|
||||
{
|
||||
case COMPRESS_SECTION_NONE:
|
||||
if (p == NULL)
|
||||
{
|
||||
p = (bfd_byte *) bfd_malloc (sz);
|
||||
if (p == NULL)
|
||||
return FALSE;
|
||||
need_free = TRUE;
|
||||
*ptr = p;
|
||||
}
|
||||
else
|
||||
need_free = FALSE;
|
||||
ret = bfd_get_section_contents (abfd, sec, p, 0, sz);
|
||||
if (!ret && need_free)
|
||||
free (p);
|
||||
return ret;
|
||||
|
||||
case COMPRESS_SECTION_DONE:
|
||||
if (p)
|
||||
memcpy (p, sec->contents, sz);
|
||||
else
|
||||
*ptr = sec->contents;
|
||||
return TRUE;
|
||||
|
||||
case DECOMPRESS_SECTION_SIZED:
|
||||
break;
|
||||
|
||||
default:
|
||||
abort ();
|
||||
}
|
||||
|
||||
#ifndef HAVE_ZLIB_H
|
||||
bfd_set_error (bfd_error_invalid_operation);
|
||||
return FALSE;
|
||||
#else
|
||||
/* Read in the full compressed section contents. */
|
||||
uncompressed_size = sec->size;
|
||||
compressed_size = sec->compressed_size;
|
||||
compressed_buffer = (bfd_byte *) bfd_malloc (compressed_size);
|
||||
rawsize = sec->rawsize;
|
||||
/* Clear rawsize, set size to compressed size and set compress_status
|
||||
to COMPRESS_SECTION_NONE. If the compressed size is bigger than
|
||||
the uncompressed size, bfd_get_section_contents will fail. */
|
||||
sec->rawsize = 0;
|
||||
sec->size = compressed_size;
|
||||
sec->compress_status = COMPRESS_SECTION_NONE;
|
||||
ret = bfd_get_section_contents (abfd, sec, compressed_buffer,
|
||||
0, compressed_size);
|
||||
/* Restore rawsize and size. */
|
||||
sec->rawsize = rawsize;
|
||||
sec->size = uncompressed_size;
|
||||
if (!ret)
|
||||
{
|
||||
fail_compressed:
|
||||
sec->compress_status = DECOMPRESS_SECTION_SIZED;
|
||||
free (compressed_buffer);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Decompress to caller buffer directly if it is provided. */
|
||||
if (p)
|
||||
uncompressed_buffer = p;
|
||||
else
|
||||
{
|
||||
uncompressed_buffer = (bfd_byte *) bfd_malloc (uncompressed_size);
|
||||
if (uncompressed_buffer == NULL)
|
||||
goto fail_compressed;
|
||||
}
|
||||
|
||||
if (!decompress_contents (compressed_buffer, compressed_size,
|
||||
uncompressed_buffer, uncompressed_size))
|
||||
{
|
||||
sec->compress_status = DECOMPRESS_SECTION_SIZED;
|
||||
free (compressed_buffer);
|
||||
if (p == NULL)
|
||||
free (uncompressed_buffer);
|
||||
bfd_set_error (bfd_error_bad_value);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
free (compressed_buffer);
|
||||
if (p == NULL)
|
||||
*ptr = uncompressed_buffer;
|
||||
|
||||
sec->contents = uncompressed_buffer;
|
||||
sec->compress_status = COMPRESS_SECTION_DONE;
|
||||
|
||||
return TRUE;
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
FUNCTION
|
||||
bfd_is_section_compressed
|
||||
|
||||
SYNOPSIS
|
||||
bfd_boolean bfd_is_section_compressed
|
||||
(bfd *abfd, asection *section);
|
||||
|
||||
DESCRIPTION
|
||||
Return @code{TRUE} if @var{section} is compressed.
|
||||
*/
|
||||
|
||||
bfd_boolean
|
||||
bfd_is_section_compressed (bfd *abfd, sec_ptr sec)
|
||||
{
|
||||
bfd_byte compressed_buffer [12];
|
||||
|
||||
/* Read the zlib header. In this case, it should be "ZLIB" followed
|
||||
by the uncompressed section size, 8 bytes in big-endian order. */
|
||||
if (compressed_size < header_size
|
||||
|| ! CONST_STRNEQ ((char*) compressed_buffer, "ZLIB"))
|
||||
return FALSE;
|
||||
return (bfd_get_section_contents (abfd, sec, compressed_buffer, 0, 12)
|
||||
&& CONST_STRNEQ ((char*) compressed_buffer, "ZLIB"));
|
||||
}
|
||||
|
||||
/*
|
||||
FUNCTION
|
||||
bfd_init_section_decompress_status
|
||||
|
||||
SYNOPSIS
|
||||
bfd_boolean bfd_init_section_decompress_status
|
||||
(bfd *abfd, asection *section);
|
||||
|
||||
DESCRIPTION
|
||||
Record compressed section size, update section size with
|
||||
decompressed size and set compress_status to
|
||||
DECOMPRESS_SECTION_SIZED.
|
||||
|
||||
Return @code{FALSE} if the section is not a valid compressed
|
||||
section or zlib is not installed on this machine. Otherwise,
|
||||
return @code{TRUE}.
|
||||
*/
|
||||
|
||||
bfd_boolean
|
||||
bfd_init_section_decompress_status (bfd *abfd ATTRIBUTE_UNUSED,
|
||||
sec_ptr sec ATTRIBUTE_UNUSED)
|
||||
{
|
||||
#ifndef HAVE_ZLIB_H
|
||||
bfd_set_error (bfd_error_invalid_operation);
|
||||
return FALSE;
|
||||
#else
|
||||
bfd_byte compressed_buffer [12];
|
||||
bfd_size_type uncompressed_size;
|
||||
|
||||
if (sec->rawsize != 0
|
||||
|| sec->contents != NULL
|
||||
|| sec->compress_status != COMPRESS_SECTION_NONE
|
||||
|| !bfd_get_section_contents (abfd, sec, compressed_buffer, 0, 12))
|
||||
{
|
||||
bfd_set_error (bfd_error_invalid_operation);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/* Read the zlib header. In this case, it should be "ZLIB" followed
|
||||
by the uncompressed section size, 8 bytes in big-endian order. */
|
||||
if (! CONST_STRNEQ ((char*) compressed_buffer, "ZLIB"))
|
||||
{
|
||||
bfd_set_error (bfd_error_wrong_format);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
uncompressed_size = compressed_buffer[4]; uncompressed_size <<= 8;
|
||||
uncompressed_size += compressed_buffer[5]; uncompressed_size <<= 8;
|
||||
uncompressed_size += compressed_buffer[6]; uncompressed_size <<= 8;
|
||||
@ -79,42 +339,66 @@ bfd_uncompress_section_contents (bfd_byte **buffer ATTRIBUTE_UNUSED,
|
||||
uncompressed_size += compressed_buffer[10]; uncompressed_size <<= 8;
|
||||
uncompressed_size += compressed_buffer[11];
|
||||
|
||||
/* It is possible the section consists of several compressed
|
||||
buffers concatenated together, so we uncompress in a loop. */
|
||||
strm.zalloc = NULL;
|
||||
strm.zfree = NULL;
|
||||
strm.opaque = NULL;
|
||||
strm.avail_in = compressed_size - header_size;
|
||||
strm.next_in = (Bytef*) compressed_buffer + header_size;
|
||||
strm.avail_out = uncompressed_size;
|
||||
uncompressed_buffer = (bfd_byte *) bfd_malloc (uncompressed_size);
|
||||
if (! uncompressed_buffer)
|
||||
return FALSE;
|
||||
sec->compressed_size = sec->size;
|
||||
sec->size = uncompressed_size;
|
||||
sec->compress_status = DECOMPRESS_SECTION_SIZED;
|
||||
|
||||
rc = inflateInit (&strm);
|
||||
while (strm.avail_in > 0)
|
||||
{
|
||||
if (rc != Z_OK)
|
||||
goto fail;
|
||||
strm.next_out = ((Bytef*) uncompressed_buffer
|
||||
+ (uncompressed_size - strm.avail_out));
|
||||
rc = inflate (&strm, Z_FINISH);
|
||||
if (rc != Z_STREAM_END)
|
||||
goto fail;
|
||||
rc = inflateReset (&strm);
|
||||
}
|
||||
rc = inflateEnd (&strm);
|
||||
if (rc != Z_OK
|
||||
|| strm.avail_out != 0)
|
||||
goto fail;
|
||||
|
||||
free (compressed_buffer);
|
||||
*buffer = uncompressed_buffer;
|
||||
*size = uncompressed_size;
|
||||
return TRUE;
|
||||
|
||||
fail:
|
||||
free (uncompressed_buffer);
|
||||
return FALSE;
|
||||
#endif /* HAVE_ZLIB_H */
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
FUNCTION
|
||||
bfd_init_section_compress_status
|
||||
|
||||
SYNOPSIS
|
||||
bfd_boolean bfd_init_section_compress_status
|
||||
(bfd *abfd, asection *section);
|
||||
|
||||
DESCRIPTION
|
||||
If open for read, compress section, update section size with
|
||||
compressed size and set compress_status to COMPRESS_SECTION_DONE.
|
||||
|
||||
Return @code{FALSE} if the section is not a valid compressed
|
||||
section or zlib is not installed on this machine. Otherwise,
|
||||
return @code{TRUE}.
|
||||
*/
|
||||
|
||||
bfd_boolean
|
||||
bfd_init_section_compress_status (bfd *abfd ATTRIBUTE_UNUSED,
|
||||
sec_ptr sec ATTRIBUTE_UNUSED)
|
||||
{
|
||||
#ifndef HAVE_ZLIB_H
|
||||
bfd_set_error (bfd_error_invalid_operation);
|
||||
return FALSE;
|
||||
#else
|
||||
bfd_size_type uncompressed_size;
|
||||
bfd_byte *uncompressed_buffer;
|
||||
bfd_boolean ret;
|
||||
|
||||
/* Error if not opened for read. */
|
||||
if (abfd->direction != read_direction
|
||||
|| sec->size == 0
|
||||
|| sec->rawsize != 0
|
||||
|| sec->contents != NULL
|
||||
|| sec->compress_status != COMPRESS_SECTION_NONE)
|
||||
{
|
||||
bfd_set_error (bfd_error_invalid_operation);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/* Read in the full section contents and compress it. */
|
||||
uncompressed_size = sec->size;
|
||||
uncompressed_buffer = (bfd_byte *) bfd_malloc (uncompressed_size);
|
||||
if (!bfd_get_section_contents (abfd, sec, uncompressed_buffer,
|
||||
0, uncompressed_size))
|
||||
ret = FALSE;
|
||||
else
|
||||
ret = bfd_compress_section_contents (abfd, sec,
|
||||
uncompressed_buffer,
|
||||
uncompressed_size);
|
||||
|
||||
free (uncompressed_buffer);
|
||||
return ret;
|
||||
#endif
|
||||
}
|
||||
|
180
bfd/dwarf2.c
180
bfd/dwarf2.c
@ -275,6 +275,60 @@ struct attr_abbrev
|
||||
enum dwarf_form form;
|
||||
};
|
||||
|
||||
/* Map of uncompressed DWARF debug section name to compressed one. It
|
||||
is terminated by NULL uncompressed_name. */
|
||||
|
||||
struct dwarf_debug_section dwarf_debug_sections[] =
|
||||
{
|
||||
{ ".debug_abbrev", ".zdebug_abbrev" },
|
||||
{ ".debug_aranges", ".zdebug_aranges" },
|
||||
{ ".debug_frame", ".zdebug_frame" },
|
||||
{ ".debug_info", ".zdebug_info" },
|
||||
{ ".debug_line", ".zdebug_line" },
|
||||
{ ".debug_loc", ".zdebug_loc" },
|
||||
{ ".debug_macinfo", ".zdebug_macinfo" },
|
||||
{ ".debug_pubnames", ".zdebug_pubnames" },
|
||||
{ ".debug_pubtypes", ".zdebug_pubtypes" },
|
||||
{ ".debug_ranges", ".zdebug_ranges" },
|
||||
{ ".debug_static_func", ".zdebug_static_func" },
|
||||
{ ".debug_static_vars", ".zdebug_static_vars" },
|
||||
{ ".debug_str", ".zdebug_str", },
|
||||
{ ".debug_types", ".zdebug_types" },
|
||||
/* GNU DWARF 1 extensions */
|
||||
{ ".debug_sfnames", ".zdebug_sfnames" },
|
||||
{ ".debug_srcinfo", ".zebug_srcinfo" },
|
||||
/* SGI/MIPS DWARF 2 extensions */
|
||||
{ ".debug_funcnames", ".zdebug_funcnames" },
|
||||
{ ".debug_typenames", ".zdebug_typenames" },
|
||||
{ ".debug_varnames", ".zdebug_varnames" },
|
||||
{ ".debug_weaknames", ".zdebug_weaknames" },
|
||||
{ NULL, NULL },
|
||||
};
|
||||
|
||||
enum dwarf_debug_section_enum
|
||||
{
|
||||
debug_abbrev = 0,
|
||||
debug_aranges,
|
||||
debug_frame,
|
||||
debug_info,
|
||||
debug_line,
|
||||
debug_loc,
|
||||
debug_macinfo,
|
||||
debug_pubnames,
|
||||
debug_pubtypes,
|
||||
debug_ranges,
|
||||
debug_static_func,
|
||||
debug_static_vars,
|
||||
debug_str,
|
||||
debug_types,
|
||||
debug_sfnames,
|
||||
debug_srcinfo,
|
||||
debug_funcnames,
|
||||
debug_typenames,
|
||||
debug_varnames,
|
||||
debug_weaknames
|
||||
};
|
||||
|
||||
#ifndef ABBREV_HASH_SIZE
|
||||
#define ABBREV_HASH_SIZE 121
|
||||
#endif
|
||||
@ -413,24 +467,23 @@ lookup_info_hash_table (struct info_hash_table *hash_table, const char *key)
|
||||
|
||||
static bfd_boolean
|
||||
read_section (bfd * abfd,
|
||||
const char * section_name,
|
||||
const char * compressed_section_name,
|
||||
enum dwarf_debug_section_enum sec,
|
||||
asymbol ** syms,
|
||||
bfd_uint64_t offset,
|
||||
bfd_byte ** section_buffer,
|
||||
bfd_size_type * section_size)
|
||||
{
|
||||
asection *msec;
|
||||
bfd_boolean section_is_compressed = FALSE;
|
||||
const char *section_name = dwarf_debug_sections[sec].uncompressed_name;
|
||||
|
||||
/* read_section is a noop if the section has already been read. */
|
||||
if (!*section_buffer)
|
||||
{
|
||||
msec = bfd_get_section_by_name (abfd, section_name);
|
||||
if (! msec && compressed_section_name)
|
||||
if (! msec)
|
||||
{
|
||||
msec = bfd_get_section_by_name (abfd, compressed_section_name);
|
||||
section_is_compressed = TRUE;
|
||||
section_name = dwarf_debug_sections[sec].compressed_name;
|
||||
msec = bfd_get_section_by_name (abfd, section_name);
|
||||
}
|
||||
if (! msec)
|
||||
{
|
||||
@ -456,16 +509,6 @@ read_section (bfd * abfd,
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* It is possible to get a bad value for the offset into the section
|
||||
@ -561,8 +604,7 @@ read_indirect_string (struct comp_unit * unit,
|
||||
|
||||
*bytes_read_ptr = unit->offset_size;
|
||||
|
||||
if (! read_section (unit->abfd, ".debug_str", ".zdebug_str",
|
||||
stash->syms, offset,
|
||||
if (! read_section (unit->abfd, debug_str, stash->syms, offset,
|
||||
&stash->dwarf_str_buffer, &stash->dwarf_str_size))
|
||||
return NULL;
|
||||
|
||||
@ -644,8 +686,7 @@ read_abbrevs (bfd *abfd, bfd_uint64_t offset, struct dwarf2_debug *stash)
|
||||
unsigned int abbrev_form, hash_number;
|
||||
bfd_size_type amt;
|
||||
|
||||
if (! read_section (abfd, ".debug_abbrev", ".zdebug_abbrev",
|
||||
stash->syms, offset,
|
||||
if (! read_section (abfd, debug_abbrev, stash->syms, offset,
|
||||
&stash->dwarf_abbrev_buffer, &stash->dwarf_abbrev_size))
|
||||
return NULL;
|
||||
|
||||
@ -1353,8 +1394,7 @@ decode_line_info (struct comp_unit *unit, struct dwarf2_debug *stash)
|
||||
unsigned char op_code, extended_op, adj_opcode;
|
||||
bfd_size_type amt;
|
||||
|
||||
if (! read_section (abfd, ".debug_line", ".zdebug_line",
|
||||
stash->syms, unit->line_offset,
|
||||
if (! read_section (abfd, debug_line, stash->syms, unit->line_offset,
|
||||
&stash->dwarf_line_buffer, &stash->dwarf_line_size))
|
||||
return NULL;
|
||||
|
||||
@ -1769,8 +1809,7 @@ static bfd_boolean
|
||||
read_debug_ranges (struct comp_unit *unit)
|
||||
{
|
||||
struct dwarf2_debug *stash = unit->stash;
|
||||
return read_section (unit->abfd, ".debug_ranges", ".zdebug_ranges",
|
||||
stash->syms, 0,
|
||||
return read_section (unit->abfd, debug_ranges, stash->syms, 0,
|
||||
&stash->dwarf_ranges_buffer, &stash->dwarf_ranges_size);
|
||||
}
|
||||
|
||||
@ -3192,86 +3231,37 @@ find_line (bfd *abfd,
|
||||
{
|
||||
/* Case 1: only one info section. */
|
||||
total_size = msec->size;
|
||||
if (! read_section (debug_bfd, ".debug_info", ".zdebug_info",
|
||||
symbols, 0,
|
||||
if (! read_section (debug_bfd, debug_info, symbols, 0,
|
||||
&stash->info_ptr_memory, &total_size))
|
||||
goto done;
|
||||
}
|
||||
else
|
||||
{
|
||||
int all_uncompressed = 1;
|
||||
/* Case 2: multiple sections. */
|
||||
for (total_size = 0; msec; msec = find_debug_info (debug_bfd, msec))
|
||||
total_size += msec->size;
|
||||
|
||||
stash->info_ptr_memory = (bfd_byte *) bfd_malloc (total_size);
|
||||
if (stash->info_ptr_memory == NULL)
|
||||
goto done;
|
||||
|
||||
total_size = 0;
|
||||
for (msec = find_debug_info (debug_bfd, NULL);
|
||||
msec;
|
||||
msec = find_debug_info (debug_bfd, msec))
|
||||
{
|
||||
total_size += msec->size;
|
||||
if (strcmp (msec->name, DWARF2_COMPRESSED_DEBUG_INFO) == 0)
|
||||
all_uncompressed = 0;
|
||||
}
|
||||
if (all_uncompressed)
|
||||
{
|
||||
/* Case 2: multiple sections, but none is compressed. */
|
||||
stash->info_ptr_memory = (bfd_byte *) bfd_malloc (total_size);
|
||||
if (stash->info_ptr_memory == NULL)
|
||||
bfd_size_type size;
|
||||
|
||||
size = msec->size;
|
||||
if (size == 0)
|
||||
continue;
|
||||
|
||||
if (!(bfd_simple_get_relocated_section_contents
|
||||
(debug_bfd, msec, stash->info_ptr_memory + total_size,
|
||||
symbols)))
|
||||
goto done;
|
||||
|
||||
total_size = 0;
|
||||
for (msec = find_debug_info (debug_bfd, NULL);
|
||||
msec;
|
||||
msec = find_debug_info (debug_bfd, msec))
|
||||
{
|
||||
bfd_size_type size;
|
||||
|
||||
size = msec->size;
|
||||
if (size == 0)
|
||||
continue;
|
||||
|
||||
if (!(bfd_simple_get_relocated_section_contents
|
||||
(debug_bfd, msec, stash->info_ptr_memory + total_size,
|
||||
symbols)))
|
||||
goto done;
|
||||
|
||||
total_size += size;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Case 3: multiple sections, some or all compressed. */
|
||||
stash->info_ptr_memory = NULL;
|
||||
total_size = 0;
|
||||
for (msec = find_debug_info (debug_bfd, NULL);
|
||||
msec;
|
||||
msec = find_debug_info (debug_bfd, msec))
|
||||
{
|
||||
bfd_size_type size = msec->size;
|
||||
bfd_byte *buffer, *tmp;
|
||||
|
||||
if (size == 0)
|
||||
continue;
|
||||
|
||||
buffer = (bfd_simple_get_relocated_section_contents
|
||||
(debug_bfd, msec, NULL, symbols));
|
||||
if (! buffer)
|
||||
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)
|
||||
{
|
||||
free (buffer);
|
||||
goto done;
|
||||
}
|
||||
stash->info_ptr_memory = tmp;
|
||||
memcpy (stash->info_ptr_memory + total_size, buffer, size);
|
||||
free (buffer);
|
||||
total_size += size;
|
||||
}
|
||||
total_size += size;
|
||||
}
|
||||
}
|
||||
|
||||
|
10
bfd/ecoff.c
10
bfd/ecoff.c
@ -55,14 +55,14 @@ static asection bfd_debug_section =
|
||||
{
|
||||
/* name, id, index, next, prev, flags, user_set_vma, */
|
||||
"*DEBUG*", 0, 0, NULL, NULL, 0, 0,
|
||||
/* linker_mark, linker_has_input, gc_mark, segment_mark, */
|
||||
/* linker_mark, linker_has_input, gc_mark, compress_status, */
|
||||
0, 0, 1, 0,
|
||||
/* sec_info_type, use_rela_p, */
|
||||
0, 0,
|
||||
/* segment_mark, sec_info_type, use_rela_p, */
|
||||
0, 0, 0,
|
||||
/* sec_flg0, sec_flg1, sec_flg2, sec_flg3, sec_flg4, sec_flg5, */
|
||||
0, 0, 0, 0, 0, 0,
|
||||
/* vma, lma, size, rawsize, relax, relax_count, */
|
||||
0, 0, 0, 0, 0, 0,
|
||||
/* vma, lma, size, rawsize, compressed_size, relax, relax_count, */
|
||||
0, 0, 0, 0, 0, 0, 0,
|
||||
/* output_offset, output_section, alignment_power, */
|
||||
0, NULL, 0,
|
||||
/* relocation, orelocation, reloc_count, filepos, rel_filepos, */
|
||||
|
46
bfd/elf.c
46
bfd/elf.c
@ -1009,6 +1009,52 @@ _bfd_elf_make_section_from_shdr (bfd *abfd,
|
||||
}
|
||||
}
|
||||
|
||||
/* Compress/decompress DWARF debug sections with names: .debug_* and
|
||||
.zdebug_*, after the section flags is set. */
|
||||
if ((flags & SEC_DEBUGGING)
|
||||
&& ((name[1] == 'd' && name[6] == '_')
|
||||
|| (name[1] == 'z' && name[7] == '_')))
|
||||
{
|
||||
enum { nothing, compress, decompress } action = nothing;
|
||||
|
||||
if (bfd_is_section_compressed (abfd, newsect))
|
||||
{
|
||||
/* Compressed section. Check if we should decompress. */
|
||||
if ((abfd->flags & BFD_DECOMPRESS))
|
||||
action = decompress;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Normal section. Check if we should compress. */
|
||||
if ((abfd->flags & BFD_COMPRESS))
|
||||
action = compress;
|
||||
}
|
||||
|
||||
switch (action)
|
||||
{
|
||||
case nothing:
|
||||
break;
|
||||
case compress:
|
||||
if (!bfd_init_section_compress_status (abfd, newsect))
|
||||
{
|
||||
(*_bfd_error_handler)
|
||||
(_("%B: unable to initialize commpress status for section %s"),
|
||||
abfd, name);
|
||||
return FALSE;
|
||||
}
|
||||
break;
|
||||
case decompress:
|
||||
if (!bfd_init_section_decompress_status (abfd, newsect))
|
||||
{
|
||||
(*_bfd_error_handler)
|
||||
(_("%B: unable to initialize decommpress status for section %s"),
|
||||
abfd, name);
|
||||
return FALSE;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
@ -9354,10 +9354,8 @@ elf_link_input_bfd (struct elf_final_link_info *finfo, bfd *input_bfd)
|
||||
contents = elf_section_data (o)->this_hdr.contents;
|
||||
else
|
||||
{
|
||||
bfd_size_type amt = o->rawsize ? o->rawsize : o->size;
|
||||
|
||||
contents = finfo->contents;
|
||||
if (! bfd_get_section_contents (input_bfd, o, contents, 0, amt))
|
||||
if (! bfd_get_full_section_contents (input_bfd, o, &contents))
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
@ -785,7 +785,7 @@ const bfd_target TARGET_BIG_SYM =
|
||||
|
||||
/* object_flags: mask of all file flags */
|
||||
(HAS_RELOC | EXEC_P | HAS_LINENO | HAS_DEBUG | HAS_SYMS | HAS_LOCALS
|
||||
| DYNAMIC | WP_TEXT | D_PAGED),
|
||||
| DYNAMIC | WP_TEXT | D_PAGED | BFD_COMPRESS | BFD_DECOMPRESS),
|
||||
|
||||
/* section_flags: mask of all section flags */
|
||||
(SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_READONLY
|
||||
@ -881,7 +881,7 @@ const bfd_target TARGET_LITTLE_SYM =
|
||||
|
||||
/* object_flags: mask of all file flags */
|
||||
(HAS_RELOC | EXEC_P | HAS_LINENO | HAS_DEBUG | HAS_SYMS | HAS_LOCALS
|
||||
| DYNAMIC | WP_TEXT | D_PAGED),
|
||||
| DYNAMIC | WP_TEXT | D_PAGED | BFD_COMPRESS | BFD_DECOMPRESS),
|
||||
|
||||
/* section_flags: mask of all section flags */
|
||||
(SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_READONLY
|
||||
|
@ -808,3 +808,13 @@ extern void bfd_section_already_linked_table_traverse
|
||||
extern bfd_vma read_unsigned_leb128 (bfd *, bfd_byte *, unsigned int *);
|
||||
extern bfd_signed_vma read_signed_leb128 (bfd *, bfd_byte *, unsigned int *);
|
||||
|
||||
struct dwarf_debug_section
|
||||
{
|
||||
const char *uncompressed_name;
|
||||
const char *compressed_name;
|
||||
};
|
||||
|
||||
/* Map of uncompressed DWARF debug section name to compressed one. It
|
||||
is terminated by NULL uncompressed_name. */
|
||||
|
||||
extern struct dwarf_debug_section dwarf_debug_sections[];
|
||||
|
@ -857,6 +857,15 @@ _bfd_generic_get_section_contents (bfd *abfd,
|
||||
if (count == 0)
|
||||
return TRUE;
|
||||
|
||||
if (section->compress_status != COMPRESS_SECTION_NONE)
|
||||
{
|
||||
(*_bfd_error_handler)
|
||||
(_("%B: unable to get decompressed section %A"),
|
||||
abfd, section);
|
||||
bfd_set_error (bfd_error_invalid_operation);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
sz = section->rawsize ? section->rawsize : section->size;
|
||||
if (offset + count < count
|
||||
|| offset + count > sz)
|
||||
|
10
bfd/libbfd.h
10
bfd/libbfd.h
@ -813,6 +813,16 @@ extern void bfd_section_already_linked_table_traverse
|
||||
extern bfd_vma read_unsigned_leb128 (bfd *, bfd_byte *, unsigned int *);
|
||||
extern bfd_signed_vma read_signed_leb128 (bfd *, bfd_byte *, unsigned int *);
|
||||
|
||||
struct dwarf_debug_section
|
||||
{
|
||||
const char *uncompressed_name;
|
||||
const char *compressed_name;
|
||||
};
|
||||
|
||||
/* Map of uncompressed DWARF debug section name to compressed one. It
|
||||
is terminated by NULL uncompressed_name. */
|
||||
|
||||
extern struct dwarf_debug_section dwarf_debug_sections[];
|
||||
/* Extracted from init.c. */
|
||||
/* Extracted from libbfd.c. */
|
||||
bfd_boolean bfd_write_bigendian_4byte_int (bfd *, unsigned int);
|
||||
|
@ -348,6 +348,7 @@ _bfd_add_merge_section (bfd *abfd, void **psinfo, asection *sec,
|
||||
struct sec_merge_sec_info *secinfo;
|
||||
unsigned int align;
|
||||
bfd_size_type amt;
|
||||
bfd_byte *contents;
|
||||
|
||||
if ((abfd->flags & DYNAMIC) != 0
|
||||
|| (sec->flags & SEC_MERGE) == 0)
|
||||
@ -432,8 +433,8 @@ _bfd_add_merge_section (bfd *abfd, void **psinfo, asection *sec,
|
||||
sec->rawsize = sec->size;
|
||||
if (sec->flags & SEC_STRINGS)
|
||||
memset (secinfo->contents + sec->size, 0, sec->entsize);
|
||||
if (! bfd_get_section_contents (sec->owner, sec, secinfo->contents,
|
||||
0, sec->size))
|
||||
contents = secinfo->contents;
|
||||
if (! bfd_get_full_section_contents (sec->owner, sec, &contents))
|
||||
goto error_return;
|
||||
|
||||
return TRUE;
|
||||
|
@ -5721,15 +5721,13 @@ bfd_generic_get_relocated_section_contents (bfd *abfd,
|
||||
long reloc_size;
|
||||
arelent **reloc_vector;
|
||||
long reloc_count;
|
||||
bfd_size_type sz;
|
||||
|
||||
reloc_size = bfd_get_reloc_upper_bound (input_bfd, input_section);
|
||||
if (reloc_size < 0)
|
||||
return NULL;
|
||||
|
||||
/* Read in the section. */
|
||||
sz = input_section->rawsize ? input_section->rawsize : input_section->size;
|
||||
if (!bfd_get_section_contents (input_bfd, input_section, data, 0, sz))
|
||||
if (!bfd_get_full_section_contents (input_bfd, input_section, &data))
|
||||
return NULL;
|
||||
|
||||
if (reloc_size == 0)
|
||||
|
@ -364,6 +364,12 @@ CODE_FRAGMENT
|
||||
. {* Mark flag used by some linker backends for garbage collection. *}
|
||||
. unsigned int gc_mark : 1;
|
||||
.
|
||||
. {* Section compression status. *}
|
||||
. unsigned int compress_status : 2;
|
||||
.#define COMPRESS_SECTION_NONE 0
|
||||
.#define COMPRESS_SECTION_DONE 1
|
||||
.#define DECOMPRESS_SECTION_SIZED 2
|
||||
.
|
||||
. {* The following flags are used by the ELF linker. *}
|
||||
.
|
||||
. {* Mark sections which have been allocated to segments. *}
|
||||
@ -420,6 +426,9 @@ CODE_FRAGMENT
|
||||
. section size calculated on a previous linker relaxation pass. *}
|
||||
. bfd_size_type rawsize;
|
||||
.
|
||||
. {* The compressed size of the section in octets. *}
|
||||
. bfd_size_type compressed_size;
|
||||
.
|
||||
. {* Relaxation table. *}
|
||||
. struct relax_table *relax;
|
||||
.
|
||||
@ -653,17 +662,17 @@ CODE_FRAGMENT
|
||||
. {* name, id, index, next, prev, flags, user_set_vma, *} \
|
||||
. { NAME, IDX, 0, NULL, NULL, FLAGS, 0, \
|
||||
. \
|
||||
. {* linker_mark, linker_has_input, gc_mark, segment_mark, *} \
|
||||
. {* linker_mark, linker_has_input, gc_mark, decompress_status, *} \
|
||||
. 0, 0, 1, 0, \
|
||||
. \
|
||||
. {* sec_info_type, use_rela_p, *} \
|
||||
. 0, 0, \
|
||||
. {* segment_mark, sec_info_type, use_rela_p, *} \
|
||||
. 0, 0, 0, \
|
||||
. \
|
||||
. {* sec_flg0, sec_flg1, sec_flg2, sec_flg3, sec_flg4, sec_flg5, *} \
|
||||
. 0, 0, 0, 0, 0, 0, \
|
||||
. \
|
||||
. {* vma, lma, size, rawsize, relax, relax_count, *} \
|
||||
. 0, 0, 0, 0, 0, 0, \
|
||||
. {* vma, lma, size, rawsize, compressed_size, relax, relax_count, *} \
|
||||
. 0, 0, 0, 0, 0, 0, 0, \
|
||||
. \
|
||||
. {* output_offset, output_section, alignment_power, *} \
|
||||
. 0, (struct bfd_section *) &SEC, 0, \
|
||||
@ -1480,20 +1489,8 @@ DESCRIPTION
|
||||
bfd_boolean
|
||||
bfd_malloc_and_get_section (bfd *abfd, sec_ptr sec, bfd_byte **buf)
|
||||
{
|
||||
bfd_size_type sz = sec->rawsize ? sec->rawsize : sec->size;
|
||||
bfd_byte *p = NULL;
|
||||
|
||||
*buf = p;
|
||||
if (sz == 0)
|
||||
return TRUE;
|
||||
|
||||
p = (bfd_byte *)
|
||||
bfd_malloc (sec->rawsize > sec->size ? sec->rawsize : sec->size);
|
||||
if (p == NULL)
|
||||
return FALSE;
|
||||
*buf = p;
|
||||
|
||||
return bfd_get_section_contents (abfd, sec, p, 0, sz);
|
||||
*buf = NULL;
|
||||
return bfd_get_full_section_contents (abfd, sec, buf);
|
||||
}
|
||||
/*
|
||||
FUNCTION
|
||||
|
14
bfd/simple.c
14
bfd/simple.c
@ -167,17 +167,9 @@ bfd_simple_get_relocated_section_contents (bfd *abfd,
|
||||
if ((abfd->flags & (HAS_RELOC | EXEC_P | DYNAMIC)) != HAS_RELOC
|
||||
|| ! (sec->flags & SEC_RELOC))
|
||||
{
|
||||
bfd_size_type amt = sec->rawsize > sec->size ? sec->rawsize : sec->size;
|
||||
bfd_size_type size = sec->rawsize ? sec->rawsize : sec->size;
|
||||
|
||||
if (outbuf == NULL)
|
||||
contents = (bfd_byte *) bfd_malloc (amt);
|
||||
else
|
||||
contents = outbuf;
|
||||
|
||||
if (contents)
|
||||
bfd_get_section_contents (abfd, sec, contents, 0, size);
|
||||
|
||||
contents = outbuf;
|
||||
if (!bfd_get_full_section_contents (abfd, sec, &contents))
|
||||
return NULL;
|
||||
return contents;
|
||||
}
|
||||
|
||||
|
@ -1,3 +1,36 @@
|
||||
2010-10-29 H.J. Lu <hongjiu.lu@intel.com>
|
||||
|
||||
* addr2line.c (process_file): Set BFD_DECOMPRESS.
|
||||
|
||||
* objcopy.c (do_debug_sections): New.
|
||||
(OPTION_COMPRESS_DEBUG_SECTIONS): New.
|
||||
(OPTION_DECOMPRESS_DEBUG_SECTIONS): Likewise.
|
||||
(copy_options): Add OPTION_COMPRESS_DEBUG_SECTIONS and
|
||||
OPTION_DECOMPRESS_DEBUG_SECTIONS.
|
||||
(copy_usage): Add --compress-debug-sections and
|
||||
--decompress-debug-sections.
|
||||
(copy_file): Set BFD_COMPRESS or BFD_DECOMPRESS.
|
||||
(copy_section): Replace bfd_get_section_contents with
|
||||
bfd_get_full_section_contents.
|
||||
(copy_main): Handle OPTION_COMPRESS_DEBUG_SECTIONS and
|
||||
OPTION_DECOMPRESS_DEBUG_SECTIONS. Check do_debug_sections to
|
||||
rename DWARF debug sections.
|
||||
|
||||
* objdump.c (load_specific_debug_section): Replace
|
||||
bfd_get_section_contents with bfd_get_full_section_contents.
|
||||
Remove bfd_uncompress_section_contents.
|
||||
(dump_section): Replace bfd_get_section_contents with
|
||||
bfd_get_full_section_contents.
|
||||
(display_file): Set BFD_DECOMPRESS if needed.
|
||||
|
||||
* readelf.c (uncompress_section_contents): Set buffer to NULL
|
||||
to indiate decompression failure.
|
||||
(load_specific_debug_section): Always call
|
||||
uncompress_section_contents.
|
||||
|
||||
* doc/binutils.texi: Document --compress-debug-sections and
|
||||
--decompress-debug-sections.
|
||||
|
||||
2010-10-29 Nick Clifton <nickc@redhat.com>
|
||||
|
||||
PR binutils/12058
|
||||
|
@ -313,6 +313,9 @@ process_file (const char *file_name, const char *section_name,
|
||||
if (abfd == NULL)
|
||||
bfd_fatal (file_name);
|
||||
|
||||
/* Decompress sections. */
|
||||
abfd->flags |= BFD_DECOMPRESS;
|
||||
|
||||
if (bfd_check_format (abfd, bfd_archive))
|
||||
fatal (_("%s: cannot get addresses from archive"), file_name);
|
||||
|
||||
|
@ -1074,6 +1074,8 @@ objcopy [@option{-F} @var{bfdname}|@option{--target=}@var{bfdname}]
|
||||
[@option{--section-alignment=}@var{num}]
|
||||
[@option{--stack=}@var{size}]
|
||||
[@option{--subsystem=}@var{which}:@var{major}.@var{minor}]
|
||||
[@option{--compress-debug-sections}]
|
||||
[@option{--decompress-debug-sections}]
|
||||
[@option{-v}|@option{--verbose}]
|
||||
[@option{-V}|@option{--version}]
|
||||
[@option{--help}] [@option{--info}]
|
||||
@ -1680,6 +1682,12 @@ This option is used to build a @file{.sym} file for a VxWorks kernel.
|
||||
It can also be a useful way of reducing the size of a @option{--just-symbols}
|
||||
linker input file.
|
||||
|
||||
@item --compress-debug-sections
|
||||
Compress DWARF debug sections using zlib.
|
||||
|
||||
@item --decompress-debug-sections
|
||||
Decompress DWARF debug sections using zlib.
|
||||
|
||||
@item -V
|
||||
@itemx --version
|
||||
Show the version number of @command{objcopy}.
|
||||
|
@ -194,6 +194,14 @@ static const char * gnu_debuglink_filename = NULL;
|
||||
/* Whether to convert debugging information. */
|
||||
static bfd_boolean convert_debugging = FALSE;
|
||||
|
||||
/* Whether to compress/decompress DWARF debug sections. */
|
||||
static enum
|
||||
{
|
||||
nothing,
|
||||
compress,
|
||||
decompress
|
||||
} do_debug_sections = nothing;
|
||||
|
||||
/* Whether to change the leading character in symbol names. */
|
||||
static bfd_boolean change_leading_char = FALSE;
|
||||
|
||||
@ -259,7 +267,9 @@ enum command_line_switch
|
||||
OPTION_CHANGE_SECTION_LMA,
|
||||
OPTION_CHANGE_SECTION_VMA,
|
||||
OPTION_CHANGE_WARNINGS,
|
||||
OPTION_COMPRESS_DEBUG_SECTIONS,
|
||||
OPTION_DEBUGGING,
|
||||
OPTION_DECOMPRESS_DEBUG_SECTIONS,
|
||||
OPTION_GAP_FILL,
|
||||
OPTION_NO_CHANGE_WARNINGS,
|
||||
OPTION_PAD_TO,
|
||||
@ -357,7 +367,9 @@ static struct option copy_options[] =
|
||||
{"change-section-vma", required_argument, 0, OPTION_CHANGE_SECTION_VMA},
|
||||
{"change-start", required_argument, 0, OPTION_CHANGE_START},
|
||||
{"change-warnings", no_argument, 0, OPTION_CHANGE_WARNINGS},
|
||||
{"compress-debug-sections", no_argument, 0, OPTION_COMPRESS_DEBUG_SECTIONS},
|
||||
{"debugging", no_argument, 0, OPTION_DEBUGGING},
|
||||
{"decompress-debug-sections", no_argument, 0, OPTION_DECOMPRESS_DEBUG_SECTIONS},
|
||||
{"discard-all", no_argument, 0, 'x'},
|
||||
{"discard-locals", no_argument, 0, 'X'},
|
||||
{"extract-symbol", no_argument, 0, OPTION_EXTRACT_SYMBOL},
|
||||
@ -551,6 +563,8 @@ copy_usage (FILE *stream, int exit_status)
|
||||
<commit>\n\
|
||||
--subsystem <name>[:<version>]\n\
|
||||
Set PE subsystem to <name> [& <version>]\n\
|
||||
--compress-debug-sections Compress DWARF debug sections using zlib\n\
|
||||
--decompress-debug-sections Decompress DWARF debug sections using zlib\n\
|
||||
-v --verbose List all object files modified\n\
|
||||
@<file> Read options from <file>\n\
|
||||
-V --version Display this program's version number\n\
|
||||
@ -2193,6 +2207,18 @@ copy_file (const char *input_filename, const char *output_filename,
|
||||
return;
|
||||
}
|
||||
|
||||
switch (do_debug_sections)
|
||||
{
|
||||
case compress:
|
||||
ibfd->flags |= BFD_COMPRESS;
|
||||
break;
|
||||
case decompress:
|
||||
ibfd->flags |= BFD_DECOMPRESS;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if (bfd_check_format (ibfd, bfd_archive))
|
||||
{
|
||||
bfd_boolean force_output_target;
|
||||
@ -2637,9 +2663,9 @@ copy_section (bfd *ibfd, sec_ptr isection, void *obfdarg)
|
||||
if (bfd_get_section_flags (ibfd, isection) & SEC_HAS_CONTENTS
|
||||
&& bfd_get_section_flags (obfd, osection) & SEC_HAS_CONTENTS)
|
||||
{
|
||||
void *memhunk = xmalloc (size);
|
||||
bfd_byte *memhunk = NULL;
|
||||
|
||||
if (!bfd_get_section_contents (ibfd, isection, memhunk, 0, size))
|
||||
if (!bfd_get_full_section_contents (ibfd, isection, &memhunk))
|
||||
{
|
||||
status = 1;
|
||||
bfd_nonfatal_message (NULL, ibfd, isection, NULL);
|
||||
@ -3170,6 +3196,7 @@ copy_main (int argc, char *argv[])
|
||||
struct section_list *p;
|
||||
struct stat statbuf;
|
||||
const bfd_arch_info_type *input_arch = NULL;
|
||||
struct dwarf_debug_section *d;
|
||||
|
||||
while ((c = getopt_long (argc, argv, "b:B:i:I:j:K:N:s:O:d:F:L:G:R:SpgxXHhVvW:w",
|
||||
copy_options, (int *) 0)) != EOF)
|
||||
@ -3462,10 +3489,18 @@ copy_main (int argc, char *argv[])
|
||||
change_leading_char = TRUE;
|
||||
break;
|
||||
|
||||
case OPTION_COMPRESS_DEBUG_SECTIONS:
|
||||
do_debug_sections = compress;
|
||||
break;
|
||||
|
||||
case OPTION_DEBUGGING:
|
||||
convert_debugging = TRUE;
|
||||
break;
|
||||
|
||||
case OPTION_DECOMPRESS_DEBUG_SECTIONS:
|
||||
do_debug_sections = decompress;
|
||||
break;
|
||||
|
||||
case OPTION_GAP_FILL:
|
||||
{
|
||||
bfd_vma gap_fill_vma;
|
||||
@ -3877,6 +3912,22 @@ copy_main (int argc, char *argv[])
|
||||
fatal (_("warning: could not create temporary file whilst copying '%s', (error: %s)"),
|
||||
input_filename, strerror (errno));
|
||||
|
||||
switch (do_debug_sections)
|
||||
{
|
||||
case compress:
|
||||
for (d = dwarf_debug_sections; d->uncompressed_name; d++)
|
||||
add_section_rename (d->uncompressed_name, d->compressed_name,
|
||||
(flagword) -1);
|
||||
break;
|
||||
case decompress:
|
||||
for (d = dwarf_debug_sections; d->uncompressed_name; d++)
|
||||
add_section_rename (d->compressed_name, d->uncompressed_name,
|
||||
(flagword) -1);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
copy_file (input_filename, tmpname, input_target, output_target, input_arch);
|
||||
if (status == 0)
|
||||
{
|
||||
|
@ -2198,20 +2198,15 @@ load_specific_debug_section (enum dwarf_section_display_enum debug,
|
||||
struct dwarf_section *section = &debug_displays [debug].section;
|
||||
bfd *abfd = (bfd *) file;
|
||||
bfd_boolean ret;
|
||||
int section_is_compressed;
|
||||
|
||||
/* If it is already loaded, do nothing. */
|
||||
if (section->start != NULL)
|
||||
return 1;
|
||||
|
||||
section_is_compressed = section->name == section->compressed_name;
|
||||
|
||||
section->address = 0;
|
||||
section->size = bfd_get_section_size (sec);
|
||||
section->start = (unsigned char *) xmalloc (section->size);
|
||||
|
||||
ret = bfd_get_section_contents (abfd, sec, section->start, 0,
|
||||
section->size);
|
||||
section->start = NULL;
|
||||
ret = bfd_get_full_section_contents (abfd, sec, §ion->start);
|
||||
|
||||
if (! ret)
|
||||
{
|
||||
@ -2221,18 +2216,6 @@ load_specific_debug_section (enum dwarf_section_display_enum debug,
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (section_is_compressed)
|
||||
{
|
||||
bfd_size_type size = section->size;
|
||||
if (! bfd_uncompress_section_contents (§ion->start, &size))
|
||||
{
|
||||
free_debug_section (debug);
|
||||
printf (_("\nCan't uncompress section '%s'.\n"), section->name);
|
||||
return 0;
|
||||
}
|
||||
section->size = size;
|
||||
}
|
||||
|
||||
if (is_relocatable && debug_displays [debug].relocate)
|
||||
{
|
||||
/* We want to relocate the data we've already read (and
|
||||
@ -2662,9 +2645,11 @@ dump_section (bfd *abfd, asection *section, void *dummy ATTRIBUTE_UNUSED)
|
||||
(unsigned long) (section->filepos + start_offset));
|
||||
printf ("\n");
|
||||
|
||||
data = (bfd_byte *) xmalloc (datasize);
|
||||
|
||||
bfd_get_section_contents (abfd, section, data, 0, datasize);
|
||||
if (!bfd_get_full_section_contents (abfd, section, &data))
|
||||
{
|
||||
non_fatal (_("Reading section failed"));
|
||||
return;
|
||||
}
|
||||
|
||||
width = 4;
|
||||
|
||||
@ -3208,6 +3193,10 @@ display_file (char *filename, char *target)
|
||||
return;
|
||||
}
|
||||
|
||||
/* Decompress sections unless dumping the section contents. */
|
||||
if (!dump_section_contents)
|
||||
file->flags |= BFD_DECOMPRESS;
|
||||
|
||||
/* If the file is an archive, process all of its elements. */
|
||||
if (bfd_check_format (file, bfd_archive))
|
||||
{
|
||||
|
@ -9987,8 +9987,7 @@ dump_section_as_bytes (Elf_Internal_Shdr * section,
|
||||
putchar ('\n');
|
||||
}
|
||||
|
||||
/* Uncompresses a section that was compressed using zlib, in place.
|
||||
This is a copy of bfd_uncompress_section_contents, in bfd/compress.c */
|
||||
/* Uncompresses a section that was compressed using zlib, in place. */
|
||||
|
||||
static int
|
||||
uncompress_section_contents (unsigned char **buffer ATTRIBUTE_UNUSED,
|
||||
@ -10054,6 +10053,8 @@ uncompress_section_contents (unsigned char **buffer ATTRIBUTE_UNUSED,
|
||||
|
||||
fail:
|
||||
free (uncompressed_buffer);
|
||||
/* Indicate decompression failure. */
|
||||
*buffer = NULL;
|
||||
return 0;
|
||||
#endif /* HAVE_ZLIB_H */
|
||||
}
|
||||
@ -10064,30 +10065,23 @@ load_specific_debug_section (enum dwarf_section_display_enum debug,
|
||||
{
|
||||
struct dwarf_section * section = &debug_displays [debug].section;
|
||||
char buf [64];
|
||||
int section_is_compressed;
|
||||
|
||||
/* If it is already loaded, do nothing. */
|
||||
if (section->start != NULL)
|
||||
return 1;
|
||||
|
||||
section_is_compressed = section->name == section->compressed_name;
|
||||
|
||||
snprintf (buf, sizeof (buf), _("%s section data"), section->name);
|
||||
section->address = sec->sh_addr;
|
||||
section->size = sec->sh_size;
|
||||
section->start = (unsigned char *) get_data (NULL, (FILE *) file,
|
||||
sec->sh_offset, 1,
|
||||
sec->sh_size, buf);
|
||||
if (uncompress_section_contents (§ion->start, §ion->size))
|
||||
sec->sh_size = section->size;
|
||||
|
||||
if (section->start == NULL)
|
||||
return 0;
|
||||
|
||||
if (section_is_compressed)
|
||||
{
|
||||
if (! uncompress_section_contents (§ion->start, §ion->size))
|
||||
return 0;
|
||||
sec->sh_size = section->size;
|
||||
}
|
||||
|
||||
if (debug_displays [debug].relocate)
|
||||
apply_relocations ((FILE *) file, sec, section->start);
|
||||
|
||||
|
@ -1,3 +1,11 @@
|
||||
2010-10-29 H.J. Lu <hongjiu.lu@intel.com>
|
||||
|
||||
* binutils-all/compress.exp: New.
|
||||
* binutils-all/dw2-1.S: Likewise.
|
||||
* binutils-all/dw2-2.S: Likewise.
|
||||
* binutils-all/libdw2-compressed.out: Likewise.
|
||||
* binutils-all/libdw2.out: Likewise.
|
||||
|
||||
2010-10-22 Mark Mitchell <mark@codesourcery.com>
|
||||
|
||||
* binutils-all/group-5.d: Expect ".group" for the name of group
|
||||
|
135
binutils/testsuite/binutils-all/compress.exp
Normal file
135
binutils/testsuite/binutils-all/compress.exp
Normal file
@ -0,0 +1,135 @@
|
||||
# Copyright 2010
|
||||
# Free Software Foundation, Inc.
|
||||
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
|
||||
# Test compressed .debug section.
|
||||
|
||||
if { [is_remote host] || ![is_elf_format] } then {
|
||||
return
|
||||
}
|
||||
|
||||
set testfile tmpdir/dw2-1.o
|
||||
set compressedfile tmpdir/dw2-1-compressed.o
|
||||
set copyfile tmpdir/dw2-copy
|
||||
set compressedfile2 tmpdir/dw2-2-compressed.o
|
||||
set libfile tmpdir/libdw2.a
|
||||
set compressedcopyfile tmpdir/dw2-copy-compressed
|
||||
|
||||
if { ![binutils_assemble $srcdir/$subdir/dw2-1.S $testfile] } then {
|
||||
fail "compressed debug sections"
|
||||
return
|
||||
}
|
||||
|
||||
if { ![binutils_assemble_flags $srcdir/$subdir/dw2-1.S $compressedfile --compress-debug-sections] } then {
|
||||
unsupported "compressed debug sections"
|
||||
return
|
||||
}
|
||||
|
||||
if { ![binutils_assemble_flags $srcdir/$subdir/dw2-2.S $compressedfile2 --compress-debug-sections] } then {
|
||||
unsupported "compressed debug sections"
|
||||
return
|
||||
}
|
||||
|
||||
remote_file host delete $libfile
|
||||
set got [binutils_run $AR "rc $libfile $compressedfile $compressedfile2"]
|
||||
if ![string match "" $got] then {
|
||||
fail "compressed debug sections"
|
||||
return
|
||||
}
|
||||
|
||||
set testname "objcopy compress debug sections"
|
||||
set got [binutils_run $OBJCOPY "--compress-debug-sections $testfile ${copyfile}.o"]
|
||||
if ![string match "" $got] then {
|
||||
fail "objcopy ($testname)"
|
||||
} else {
|
||||
send_log "cmp $compressedfile ${copyfile}.o\n"
|
||||
verbose "cmp $compressedfile ${copyfile}.o"
|
||||
set src1 ${compressedfile}
|
||||
set src2 ${copyfile}.o
|
||||
set status [remote_exec build cmp "${src1} ${src2}"]
|
||||
set exec_output [lindex $status 1]
|
||||
set exec_output [prune_warnings $exec_output]
|
||||
|
||||
if [string match "" $exec_output] then {
|
||||
pass "objcopy ($testname)"
|
||||
} else {
|
||||
send_log "$exec_output\n"
|
||||
verbose "$exec_output" 1
|
||||
fail "objcopy ($testname)"
|
||||
}
|
||||
}
|
||||
|
||||
set testname "objcopy decompress compressed debug sections"
|
||||
set got [binutils_run $OBJCOPY "--decompress-debug-sections $compressedfile ${copyfile}.o"]
|
||||
if ![string match "" $got] then {
|
||||
fail "objcopy ($testname)"
|
||||
} else {
|
||||
send_log "cmp $testfile ${copyfile}.o\n"
|
||||
verbose "cmp $testfile ${copyfile}.o"
|
||||
set src1 ${testfile}
|
||||
set src2 ${copyfile}.o
|
||||
set status [remote_exec build cmp "${src1} ${src2}"]
|
||||
set exec_output [lindex $status 1]
|
||||
set exec_output [prune_warnings $exec_output]
|
||||
|
||||
if [string match "" $exec_output] then {
|
||||
pass "objcopy ($testname)"
|
||||
} else {
|
||||
send_log "$exec_output\n"
|
||||
verbose "$exec_output" 1
|
||||
fail "objcopy ($testname)"
|
||||
}
|
||||
}
|
||||
|
||||
set testname "objcopy decompress debug sections in archive"
|
||||
set got [binutils_run $OBJCOPY "--decompress-debug-sections $libfile ${copyfile}.a"]
|
||||
if ![string match "" $got] then {
|
||||
fail "objcopy ($testname)"
|
||||
} else {
|
||||
set got [remote_exec host "$READELF -S --wide ${copyfile}.a" "" "/dev/null" "tmpdir/libdw2.out"]
|
||||
|
||||
if { [lindex $got 0] != 0 || ![string match "" [lindex $got 1]] } then {
|
||||
fail "$testname (reason: unexpected output)"
|
||||
send_log $got
|
||||
send_log "\n"
|
||||
}
|
||||
|
||||
if { [regexp_diff tmpdir/libdw2.out $srcdir/$subdir/libdw2.out] } then {
|
||||
fail "$testname"
|
||||
} else {
|
||||
pass "$testname"
|
||||
}
|
||||
}
|
||||
|
||||
set testname "objcopy compress debug sections in archive"
|
||||
set got [binutils_run $OBJCOPY "--compress-debug-sections ${copyfile}.a ${compressedcopyfile}.a"]
|
||||
if ![string match "" $got] then {
|
||||
fail "objcopy ($testname)"
|
||||
} else {
|
||||
set got [remote_exec host "$OBJDUMP -s -j .zdebug_line ${compressedcopyfile}.a" "" "/dev/null" "tmpdir/libdw2-compressed.out"]
|
||||
|
||||
if { [lindex $got 0] != 0 || ![string match "" [lindex $got 1]] } then {
|
||||
fail "$testname (reason: unexpected output)"
|
||||
send_log $got
|
||||
send_log "\n"
|
||||
}
|
||||
|
||||
if { [regexp_diff tmpdir/libdw2-compressed.out $srcdir/$subdir/libdw2-compressed.out] } then {
|
||||
fail "$testname"
|
||||
} else {
|
||||
pass "$testname"
|
||||
}
|
||||
}
|
198
binutils/testsuite/binutils-all/dw2-1.S
Normal file
198
binutils/testsuite/binutils-all/dw2-1.S
Normal file
@ -0,0 +1,198 @@
|
||||
/* This testcase is derived from a similar test in GDB.
|
||||
|
||||
Copyright 2008, 2009, 2010 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||
|
||||
/* Dummy function to provide debug information for. */
|
||||
|
||||
.text
|
||||
.globl _start
|
||||
_start:
|
||||
.int 0
|
||||
.Lbegin_text1:
|
||||
.globl func_cu1
|
||||
.type func_cu1, %function
|
||||
func_cu1:
|
||||
.Lbegin_func_cu1:
|
||||
.int 0
|
||||
.Lend_func_cu1:
|
||||
.size func_cu1, .-func_cu1
|
||||
.Lend_text1:
|
||||
|
||||
/* Debug information */
|
||||
|
||||
.section .debug_info
|
||||
.Lcu1_begin:
|
||||
/* CU header */
|
||||
.4byte .Lcu1_end - .Lcu1_start /* Length of Compilation Unit */
|
||||
.Lcu1_start:
|
||||
.2byte 2 /* DWARF Version */
|
||||
.4byte .Labbrev1_begin /* Offset into abbrev section */
|
||||
.byte 4 /* Pointer size */
|
||||
|
||||
/* CU die */
|
||||
.uleb128 1 /* Abbrev: DW_TAG_compile_unit */
|
||||
.4byte .Lline1_begin /* DW_AT_stmt_list */
|
||||
.4byte .Lend_text1 /* DW_AT_high_pc */
|
||||
.4byte .Lbegin_text1 /* DW_AT_low_pc */
|
||||
.ascii "file1.txt\0" /* DW_AT_name */
|
||||
.ascii "GNU C 3.3.3\0" /* DW_AT_producer */
|
||||
.byte 1 /* DW_AT_language (C) */
|
||||
|
||||
/* func_cu1 */
|
||||
.uleb128 2 /* Abbrev: DW_TAG_subprogram */
|
||||
.byte 1 /* DW_AT_external */
|
||||
.byte 1 /* DW_AT_decl_file */
|
||||
.byte 2 /* DW_AT_decl_line */
|
||||
.ascii "func_cu1\0" /* DW_AT_name */
|
||||
.4byte .Ltype_int-.Lcu1_begin /* DW_AT_type */
|
||||
.4byte .Lbegin_func_cu1 /* DW_AT_low_pc */
|
||||
.4byte .Lend_func_cu1 /* DW_AT_high_pc */
|
||||
.byte 1 /* DW_AT_frame_base: length */
|
||||
.byte 0x55 /* DW_AT_frame_base: DW_OP_reg5 */
|
||||
|
||||
.Ltype_int:
|
||||
.uleb128 3 /* Abbrev: DW_TAG_base_type */
|
||||
.ascii "int\0" /* DW_AT_name */
|
||||
.byte 4 /* DW_AT_byte_size */
|
||||
.byte 5 /* DW_AT_encoding */
|
||||
|
||||
.byte 0 /* End of children of CU */
|
||||
|
||||
.Lcu1_end:
|
||||
|
||||
/* Line table */
|
||||
.section .debug_line
|
||||
.Lline1_begin:
|
||||
.4byte .Lline1_end - .Lline1_start /* Initial length */
|
||||
.Lline1_start:
|
||||
.2byte 2 /* Version */
|
||||
.4byte .Lline1_lines - .Lline1_hdr /* header_length */
|
||||
.Lline1_hdr:
|
||||
.byte 1 /* Minimum insn length */
|
||||
.byte 1 /* default_is_stmt */
|
||||
.byte 1 /* line_base */
|
||||
.byte 1 /* line_range */
|
||||
.byte 0x10 /* opcode_base */
|
||||
|
||||
/* Standard lengths */
|
||||
.byte 0
|
||||
.byte 1
|
||||
.byte 1
|
||||
.byte 1
|
||||
.byte 1
|
||||
.byte 0
|
||||
.byte 0
|
||||
.byte 0
|
||||
.byte 1
|
||||
.byte 0
|
||||
.byte 0
|
||||
.byte 1
|
||||
.byte 0
|
||||
.byte 0
|
||||
.byte 0
|
||||
|
||||
/* Include directories */
|
||||
.byte 0
|
||||
|
||||
/* File names */
|
||||
.ascii "file1.txt\0"
|
||||
.uleb128 0
|
||||
.uleb128 0
|
||||
.uleb128 0
|
||||
|
||||
.byte 0
|
||||
|
||||
.Lline1_lines:
|
||||
.byte 0 /* DW_LNE_set_address */
|
||||
.uleb128 5
|
||||
.byte 2
|
||||
.4byte .Lbegin_func_cu1
|
||||
|
||||
.byte 3 /* DW_LNS_advance_line */
|
||||
.sleb128 3 /* ... to 4 */
|
||||
|
||||
.byte 1 /* DW_LNS_copy */
|
||||
|
||||
.byte 1 /* DW_LNS_copy (second time as an end-of-prologue marker) */
|
||||
|
||||
.byte 0 /* DW_LNE_set_address */
|
||||
.uleb128 5
|
||||
.byte 2
|
||||
.4byte .Lend_func_cu1
|
||||
|
||||
.byte 0 /* DW_LNE_end_of_sequence */
|
||||
.uleb128 1
|
||||
.byte 1
|
||||
|
||||
.Lline1_end:
|
||||
|
||||
/* Abbrev table */
|
||||
.section .debug_abbrev
|
||||
.Labbrev1_begin:
|
||||
.uleb128 1 /* Abbrev code */
|
||||
.uleb128 0x11 /* DW_TAG_compile_unit */
|
||||
.byte 1 /* has_children */
|
||||
.uleb128 0x10 /* DW_AT_stmt_list */
|
||||
.uleb128 0x6 /* DW_FORM_data4 */
|
||||
.uleb128 0x12 /* DW_AT_high_pc */
|
||||
.uleb128 0x1 /* DW_FORM_addr */
|
||||
.uleb128 0x11 /* DW_AT_low_pc */
|
||||
.uleb128 0x1 /* DW_FORM_addr */
|
||||
.uleb128 0x3 /* DW_AT_name */
|
||||
.uleb128 0x8 /* DW_FORM_string */
|
||||
.uleb128 0x25 /* DW_AT_producer */
|
||||
.uleb128 0x8 /* DW_FORM_string */
|
||||
.uleb128 0x13 /* DW_AT_language */
|
||||
.uleb128 0xb /* DW_FORM_data1 */
|
||||
.byte 0x0 /* Terminator */
|
||||
.byte 0x0 /* Terminator */
|
||||
|
||||
.uleb128 2 /* Abbrev code */
|
||||
.uleb128 0x2e /* DW_TAG_subprogram */
|
||||
.byte 0 /* has_children */
|
||||
.uleb128 0x3f /* DW_AT_external */
|
||||
.uleb128 0xc /* DW_FORM_flag */
|
||||
.uleb128 0x3a /* DW_AT_decl_file */
|
||||
.uleb128 0xb /* DW_FORM_data1 */
|
||||
.uleb128 0x3b /* DW_AT_decl_line */
|
||||
.uleb128 0xb /* DW_FORM_data1 */
|
||||
.uleb128 0x3 /* DW_AT_name */
|
||||
.uleb128 0x8 /* DW_FORM_string */
|
||||
.uleb128 0x49 /* DW_AT_type */
|
||||
.uleb128 0x13 /* DW_FORM_ref4 */
|
||||
.uleb128 0x11 /* DW_AT_low_pc */
|
||||
.uleb128 0x1 /* DW_FORM_addr */
|
||||
.uleb128 0x12 /* DW_AT_high_pc */
|
||||
.uleb128 0x1 /* DW_FORM_addr */
|
||||
.uleb128 0x40 /* DW_AT_frame_base */
|
||||
.uleb128 0xa /* DW_FORM_block1 */
|
||||
.byte 0x0 /* Terminator */
|
||||
.byte 0x0 /* Terminator */
|
||||
|
||||
.uleb128 3 /* Abbrev code */
|
||||
.uleb128 0x24 /* DW_TAG_base_type */
|
||||
.byte 0 /* has_children */
|
||||
.uleb128 0x3 /* DW_AT_name */
|
||||
.uleb128 0x8 /* DW_FORM_string */
|
||||
.uleb128 0xb /* DW_AT_byte_size */
|
||||
.uleb128 0xb /* DW_FORM_data1 */
|
||||
.uleb128 0x3e /* DW_AT_encoding */
|
||||
.uleb128 0xb /* DW_FORM_data1 */
|
||||
.byte 0x0 /* Terminator */
|
||||
.byte 0x0 /* Terminator */
|
||||
|
||||
.byte 0x0 /* Terminator */
|
||||
.byte 0x0 /* Terminator */
|
195
binutils/testsuite/binutils-all/dw2-2.S
Normal file
195
binutils/testsuite/binutils-all/dw2-2.S
Normal file
@ -0,0 +1,195 @@
|
||||
/* This testcase is derived from a similar test in GDB.
|
||||
|
||||
Copyright 2008, 2009, 2010 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||
|
||||
/* Dummy function to provide debug information for. */
|
||||
|
||||
.text
|
||||
.Lbegin_text1:
|
||||
.globl func_cu2
|
||||
.type func_cu2, %function
|
||||
func_cu2:
|
||||
.Lbegin_func_cu2:
|
||||
.int 0
|
||||
.Lend_func_cu2:
|
||||
.size func_cu2, .-func_cu2
|
||||
.Lend_text1:
|
||||
|
||||
/* Debug information */
|
||||
|
||||
.section .debug_info
|
||||
.Lcu1_begin:
|
||||
/* CU header */
|
||||
.4byte .Lcu1_end - .Lcu1_start /* Length of Compilation Unit */
|
||||
.Lcu1_start:
|
||||
.2byte 2 /* DWARF Version */
|
||||
.4byte .Labbrev1_begin /* Offset into abbrev section */
|
||||
.byte 4 /* Pointer size */
|
||||
|
||||
/* CU die */
|
||||
.uleb128 1 /* Abbrev: DW_TAG_compile_unit */
|
||||
.4byte .Lline1_begin /* DW_AT_stmt_list */
|
||||
.4byte .Lend_text1 /* DW_AT_high_pc */
|
||||
.4byte .Lbegin_text1 /* DW_AT_low_pc */
|
||||
.ascii "file1.txt\0" /* DW_AT_name */
|
||||
.ascii "GNU C 3.3.3\0" /* DW_AT_producer */
|
||||
.byte 1 /* DW_AT_language (C) */
|
||||
|
||||
/* func_cu2 */
|
||||
.uleb128 2 /* Abbrev: DW_TAG_subprogram */
|
||||
.byte 1 /* DW_AT_external */
|
||||
.byte 1 /* DW_AT_decl_file */
|
||||
.byte 2 /* DW_AT_decl_line */
|
||||
.ascii "func_cu2\0" /* DW_AT_name */
|
||||
.4byte .Ltype_int-.Lcu1_begin /* DW_AT_type */
|
||||
.4byte .Lbegin_func_cu2 /* DW_AT_low_pc */
|
||||
.4byte .Lend_func_cu2 /* DW_AT_high_pc */
|
||||
.byte 1 /* DW_AT_frame_base: length */
|
||||
.byte 0x55 /* DW_AT_frame_base: DW_OP_reg5 */
|
||||
|
||||
.Ltype_int:
|
||||
.uleb128 3 /* Abbrev: DW_TAG_base_type */
|
||||
.ascii "int\0" /* DW_AT_name */
|
||||
.byte 4 /* DW_AT_byte_size */
|
||||
.byte 5 /* DW_AT_encoding */
|
||||
|
||||
.byte 0 /* End of children of CU */
|
||||
|
||||
.Lcu1_end:
|
||||
|
||||
/* Line table */
|
||||
.section .debug_line
|
||||
.Lline1_begin:
|
||||
.4byte .Lline1_end - .Lline1_start /* Initial length */
|
||||
.Lline1_start:
|
||||
.2byte 2 /* Version */
|
||||
.4byte .Lline1_lines - .Lline1_hdr /* header_length */
|
||||
.Lline1_hdr:
|
||||
.byte 1 /* Minimum insn length */
|
||||
.byte 1 /* default_is_stmt */
|
||||
.byte 1 /* line_base */
|
||||
.byte 1 /* line_range */
|
||||
.byte 0x10 /* opcode_base */
|
||||
|
||||
/* Standard lengths */
|
||||
.byte 0
|
||||
.byte 1
|
||||
.byte 1
|
||||
.byte 1
|
||||
.byte 1
|
||||
.byte 0
|
||||
.byte 0
|
||||
.byte 0
|
||||
.byte 1
|
||||
.byte 0
|
||||
.byte 0
|
||||
.byte 1
|
||||
.byte 0
|
||||
.byte 0
|
||||
.byte 0
|
||||
|
||||
/* Include directories */
|
||||
.byte 0
|
||||
|
||||
/* File names */
|
||||
.ascii "file1.txt\0"
|
||||
.uleb128 0
|
||||
.uleb128 0
|
||||
.uleb128 0
|
||||
|
||||
.byte 0
|
||||
|
||||
.Lline1_lines:
|
||||
.byte 0 /* DW_LNE_set_address */
|
||||
.uleb128 5
|
||||
.byte 2
|
||||
.4byte .Lbegin_func_cu2
|
||||
|
||||
.byte 3 /* DW_LNS_advance_line */
|
||||
.sleb128 3 /* ... to 4 */
|
||||
|
||||
.byte 1 /* DW_LNS_copy */
|
||||
|
||||
.byte 1 /* DW_LNS_copy (second time as an end-of-prologue marker) */
|
||||
|
||||
.byte 0 /* DW_LNE_set_address */
|
||||
.uleb128 5
|
||||
.byte 2
|
||||
.4byte .Lend_func_cu2
|
||||
|
||||
.byte 0 /* DW_LNE_end_of_sequence */
|
||||
.uleb128 1
|
||||
.byte 1
|
||||
|
||||
.Lline1_end:
|
||||
|
||||
/* Abbrev table */
|
||||
.section .debug_abbrev
|
||||
.Labbrev1_begin:
|
||||
.uleb128 1 /* Abbrev code */
|
||||
.uleb128 0x11 /* DW_TAG_compile_unit */
|
||||
.byte 1 /* has_children */
|
||||
.uleb128 0x10 /* DW_AT_stmt_list */
|
||||
.uleb128 0x6 /* DW_FORM_data4 */
|
||||
.uleb128 0x12 /* DW_AT_high_pc */
|
||||
.uleb128 0x1 /* DW_FORM_addr */
|
||||
.uleb128 0x11 /* DW_AT_low_pc */
|
||||
.uleb128 0x1 /* DW_FORM_addr */
|
||||
.uleb128 0x3 /* DW_AT_name */
|
||||
.uleb128 0x8 /* DW_FORM_string */
|
||||
.uleb128 0x25 /* DW_AT_producer */
|
||||
.uleb128 0x8 /* DW_FORM_string */
|
||||
.uleb128 0x13 /* DW_AT_language */
|
||||
.uleb128 0xb /* DW_FORM_data1 */
|
||||
.byte 0x0 /* Terminator */
|
||||
.byte 0x0 /* Terminator */
|
||||
|
||||
.uleb128 2 /* Abbrev code */
|
||||
.uleb128 0x2e /* DW_TAG_subprogram */
|
||||
.byte 0 /* has_children */
|
||||
.uleb128 0x3f /* DW_AT_external */
|
||||
.uleb128 0xc /* DW_FORM_flag */
|
||||
.uleb128 0x3a /* DW_AT_decl_file */
|
||||
.uleb128 0xb /* DW_FORM_data1 */
|
||||
.uleb128 0x3b /* DW_AT_decl_line */
|
||||
.uleb128 0xb /* DW_FORM_data1 */
|
||||
.uleb128 0x3 /* DW_AT_name */
|
||||
.uleb128 0x8 /* DW_FORM_string */
|
||||
.uleb128 0x49 /* DW_AT_type */
|
||||
.uleb128 0x13 /* DW_FORM_ref4 */
|
||||
.uleb128 0x11 /* DW_AT_low_pc */
|
||||
.uleb128 0x1 /* DW_FORM_addr */
|
||||
.uleb128 0x12 /* DW_AT_high_pc */
|
||||
.uleb128 0x1 /* DW_FORM_addr */
|
||||
.uleb128 0x40 /* DW_AT_frame_base */
|
||||
.uleb128 0xa /* DW_FORM_block1 */
|
||||
.byte 0x0 /* Terminator */
|
||||
.byte 0x0 /* Terminator */
|
||||
|
||||
.uleb128 3 /* Abbrev code */
|
||||
.uleb128 0x24 /* DW_TAG_base_type */
|
||||
.byte 0 /* has_children */
|
||||
.uleb128 0x3 /* DW_AT_name */
|
||||
.uleb128 0x8 /* DW_FORM_string */
|
||||
.uleb128 0xb /* DW_AT_byte_size */
|
||||
.uleb128 0xb /* DW_FORM_data1 */
|
||||
.uleb128 0x3e /* DW_AT_encoding */
|
||||
.uleb128 0xb /* DW_FORM_data1 */
|
||||
.byte 0x0 /* Terminator */
|
||||
.byte 0x0 /* Terminator */
|
||||
|
||||
.byte 0x0 /* Terminator */
|
||||
.byte 0x0 /* Terminator */
|
5
binutils/testsuite/binutils-all/libdw2-compressed.out
Normal file
5
binutils/testsuite/binutils-all/libdw2-compressed.out
Normal file
@ -0,0 +1,5 @@
|
||||
#...
|
||||
.* ZLIB.*
|
||||
#...
|
||||
.* ZLIB.*
|
||||
#pass
|
13
binutils/testsuite/binutils-all/libdw2.out
Normal file
13
binutils/testsuite/binutils-all/libdw2.out
Normal file
@ -0,0 +1,13 @@
|
||||
#...
|
||||
\[[ 0-9]+\] \.debug_info[ ]+PROGBITS[ 0-9a-z]+ [^Z]*
|
||||
#...
|
||||
\[[ 0-9]+\] \.debug_line[ ]+PROGBITS[ 0-9a-z]+ [^Z]*
|
||||
#...
|
||||
\[[ 0-9]+\] \.debug_abbrev[ ]+PROGBITS[ 0-9a-z]+ [^Z]*
|
||||
#...
|
||||
\[[ 0-9]+\] \.debug_info[ ]+PROGBITS[ 0-9a-z]+ [^Z]*
|
||||
#...
|
||||
\[[ 0-9]+\] \.debug_line[ ]+PROGBITS[ 0-9a-z]+ [^Z]*
|
||||
#...
|
||||
\[[ 0-9]+\] \.debug_abbrev[ ]+PROGBITS[ 0-9a-z]+ [^Z]*
|
||||
#pass
|
@ -1,3 +1,7 @@
|
||||
2010-10-29 H.J. Lu <hongjiu.lu@intel.com>
|
||||
|
||||
* write.c (compress_debug): Optimize section flags check.
|
||||
|
||||
2010-10-29 Bernd Schmidt <bernds@codesourcery.com>
|
||||
Joseph Myers <joseph@codesourcery.com>
|
||||
|
||||
|
@ -1,3 +1,16 @@
|
||||
2010-10-29 H.J. Lu <hongjiu.lu@intel.com>
|
||||
|
||||
* elf/dwarf2-1.s: Replace .zdebug_abbrev section with
|
||||
.debug_abbrev section.
|
||||
* elf/dwarf2-2.3: Likewise.
|
||||
|
||||
* elf/dwarf2-1.d: Pass --compress-debug-sections to assembler.
|
||||
Updated.
|
||||
* elf/dwarf2-2.d: Likewise.
|
||||
|
||||
* gas/i386/i386.exp: Remove xfail on dw2-compress-2 and
|
||||
x86-64-dw2-compress-2.
|
||||
|
||||
2010-10-29 Bernd Schmidt <bernds@codesourcery.com>
|
||||
Joseph Myers <joseph@codesourcery.com>
|
||||
|
||||
|
@ -1,8 +1,9 @@
|
||||
#as: --compress-debug-sections
|
||||
#readelf: -w
|
||||
#name: DWARF2 1
|
||||
#not-target: ia64-*-*
|
||||
|
||||
Contents of the .debug_info section:
|
||||
Contents of the .[z]?debug_info section:
|
||||
|
||||
Compilation Unit @ offset 0x0:
|
||||
Length: 0x4e \(32-bit\)
|
||||
@ -30,7 +31,7 @@ Contents of the .debug_info section:
|
||||
<4f> DW_AT_byte_size : 4
|
||||
<50> DW_AT_encoding : 5 \(signed\)
|
||||
|
||||
Raw dump of debug contents of section .debug_line:
|
||||
Raw dump of debug contents of section .[z]?debug_line:
|
||||
|
||||
Offset: 0x0
|
||||
Length: 62
|
||||
@ -74,7 +75,7 @@ Raw dump of debug contents of section .debug_line:
|
||||
Extended opcode 1: End of Sequence
|
||||
|
||||
|
||||
Contents of the .zdebug_abbrev section:
|
||||
Contents of the .[z]?debug_abbrev section:
|
||||
|
||||
Number TAG
|
||||
1 DW_TAG_compile_unit \[has children\]
|
||||
|
@ -15,10 +15,6 @@
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||
|
||||
/* This tests that gdb can read compressed sections. The contents
|
||||
are a basic assembly file, but the .debug_abbrev section has been
|
||||
comrpessed using zlib. */
|
||||
|
||||
/* Dummy function to provide debug information for. */
|
||||
|
||||
.file "dwarf2-1.c"
|
||||
@ -144,76 +140,60 @@ func_cu1:
|
||||
|
||||
.Lline1_end:
|
||||
|
||||
/* Abbrev table -- compressed */
|
||||
.section .zdebug_abbrev
|
||||
/* Abbrev table */
|
||||
.section .debug_abbrev
|
||||
.Labbrev1_begin:
|
||||
.ascii "ZLIB"
|
||||
.4byte 0
|
||||
.2byte 0
|
||||
.byte 0
|
||||
.byte 51
|
||||
.byte 0x78
|
||||
.byte 0x5e
|
||||
.byte 0x63
|
||||
.byte 0x14
|
||||
.byte 0x64
|
||||
.byte 0x14
|
||||
.byte 0x60
|
||||
.byte 0x13
|
||||
.byte 0x62
|
||||
.byte 0x14
|
||||
.byte 0x64
|
||||
.byte 0x64
|
||||
.byte 0xe6
|
||||
.byte 0x50
|
||||
.byte 0xe5
|
||||
.byte 0x10
|
||||
.byte 0xe6
|
||||
.byte 0x66
|
||||
.byte 0x60
|
||||
.byte 0x60
|
||||
.byte 0xd2
|
||||
.byte 0x63
|
||||
.byte 0xb0
|
||||
.byte 0xe7
|
||||
.byte 0xb1
|
||||
.byte 0xe2
|
||||
.byte 0xb6
|
||||
.byte 0xe6
|
||||
.byte 0x66
|
||||
.byte 0xe6
|
||||
.byte 0xf0
|
||||
.byte 0x14
|
||||
.byte 0x16
|
||||
.byte 0x64
|
||||
.byte 0x14
|
||||
.byte 0x62
|
||||
.byte 0x74
|
||||
.byte 0xe0
|
||||
.byte 0x02
|
||||
.byte 0x00
|
||||
.byte 0x25
|
||||
.byte 0x78
|
||||
.byte 0x02
|
||||
.byte 0x81
|
||||
.byte 0x78
|
||||
.byte 0x9c
|
||||
.byte 0x63
|
||||
.byte 0x60
|
||||
.byte 0x60
|
||||
.byte 0x56
|
||||
.byte 0x61
|
||||
.byte 0x60
|
||||
.byte 0xe6
|
||||
.byte 0xe0
|
||||
.byte 0xe6
|
||||
.byte 0xb6
|
||||
.byte 0xe3
|
||||
.byte 0x66
|
||||
.byte 0x00
|
||||
.byte 0x02
|
||||
.byte 0x00
|
||||
.byte 0x04
|
||||
.byte 0x9c
|
||||
.byte 0x00
|
||||
.byte 0x92
|
||||
.uleb128 1 /* Abbrev code */
|
||||
.uleb128 0x11 /* DW_TAG_compile_unit */
|
||||
.byte 1 /* has_children */
|
||||
.uleb128 0x10 /* DW_AT_stmt_list */
|
||||
.uleb128 0x6 /* DW_FORM_data4 */
|
||||
.uleb128 0x12 /* DW_AT_high_pc */
|
||||
.uleb128 0x1 /* DW_FORM_addr */
|
||||
.uleb128 0x11 /* DW_AT_low_pc */
|
||||
.uleb128 0x1 /* DW_FORM_addr */
|
||||
.uleb128 0x3 /* DW_AT_name */
|
||||
.uleb128 0x8 /* DW_FORM_string */
|
||||
.uleb128 0x25 /* DW_AT_producer */
|
||||
.uleb128 0x8 /* DW_FORM_string */
|
||||
.uleb128 0x13 /* DW_AT_language */
|
||||
.uleb128 0xb /* DW_FORM_data1 */
|
||||
.byte 0x0 /* Terminator */
|
||||
.byte 0x0 /* Terminator */
|
||||
|
||||
.uleb128 2 /* Abbrev code */
|
||||
.uleb128 0x2e /* DW_TAG_subprogram */
|
||||
.byte 0 /* has_children */
|
||||
.uleb128 0x3f /* DW_AT_external */
|
||||
.uleb128 0xc /* DW_FORM_flag */
|
||||
.uleb128 0x3a /* DW_AT_decl_file */
|
||||
.uleb128 0xb /* DW_FORM_data1 */
|
||||
.uleb128 0x3b /* DW_AT_decl_line */
|
||||
.uleb128 0xb /* DW_FORM_data1 */
|
||||
.uleb128 0x3 /* DW_AT_name */
|
||||
.uleb128 0x8 /* DW_FORM_string */
|
||||
.uleb128 0x49 /* DW_AT_type */
|
||||
.uleb128 0x13 /* DW_FORM_ref4 */
|
||||
.uleb128 0x11 /* DW_AT_low_pc */
|
||||
.uleb128 0x1 /* DW_FORM_addr */
|
||||
.uleb128 0x12 /* DW_AT_high_pc */
|
||||
.uleb128 0x1 /* DW_FORM_addr */
|
||||
.uleb128 0x40 /* DW_AT_frame_base */
|
||||
.uleb128 0xa /* DW_FORM_block1 */
|
||||
.byte 0x0 /* Terminator */
|
||||
.byte 0x0 /* Terminator */
|
||||
|
||||
.uleb128 3 /* Abbrev code */
|
||||
.uleb128 0x24 /* DW_TAG_base_type */
|
||||
.byte 0 /* has_children */
|
||||
.uleb128 0x3 /* DW_AT_name */
|
||||
.uleb128 0x8 /* DW_FORM_string */
|
||||
.uleb128 0xb /* DW_AT_byte_size */
|
||||
.uleb128 0xb /* DW_FORM_data1 */
|
||||
.uleb128 0x3e /* DW_AT_encoding */
|
||||
.uleb128 0xb /* DW_FORM_data1 */
|
||||
.byte 0x0 /* Terminator */
|
||||
.byte 0x0 /* Terminator */
|
||||
|
||||
.byte 0x0 /* Terminator */
|
||||
.byte 0x0 /* Terminator */
|
||||
|
@ -1,8 +1,9 @@
|
||||
#as: --compress-debug-sections
|
||||
#readelf: -w
|
||||
#name: DWARF2 2
|
||||
#not-target: ia64-*-*
|
||||
|
||||
Contents of the .debug_info section:
|
||||
Contents of the .[z]?debug_info section:
|
||||
|
||||
Compilation Unit @ offset 0x0:
|
||||
Length: 0x4e \(32-bit\)
|
||||
@ -30,7 +31,7 @@ Contents of the .debug_info section:
|
||||
<4f> DW_AT_byte_size : 4
|
||||
<50> DW_AT_encoding : 5 \(signed\)
|
||||
|
||||
Raw dump of debug contents of section .debug_line:
|
||||
Raw dump of debug contents of section .[z]?debug_line:
|
||||
|
||||
Offset: 0x0
|
||||
Length: 62
|
||||
@ -74,7 +75,7 @@ Raw dump of debug contents of section .debug_line:
|
||||
Extended opcode 1: End of Sequence
|
||||
|
||||
|
||||
Contents of the .zdebug_abbrev section:
|
||||
Contents of the .[z]?debug_abbrev section:
|
||||
|
||||
Number TAG
|
||||
1 DW_TAG_compile_unit \[has children\]
|
||||
|
@ -15,10 +15,6 @@
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||
|
||||
/* This tests that gdb can read compressed sections. The contents
|
||||
are a basic assembly file, but the .debug_abbrev section has been
|
||||
comrpessed using zlib. */
|
||||
|
||||
/* Dummy function to provide debug information for. */
|
||||
|
||||
.file "dwarf2-2.c"
|
||||
@ -144,76 +140,60 @@ func_cu1:
|
||||
|
||||
.Lline1_end:
|
||||
|
||||
/* Abbrev table -- compressed */
|
||||
.section .zdebug_abbrev,"G",%progbits,foo,comdat
|
||||
/* Abbrev table */
|
||||
.section .debug_abbrev,"G",%progbits,foo,comdat
|
||||
.Labbrev1_begin:
|
||||
.ascii "ZLIB"
|
||||
.4byte 0
|
||||
.2byte 0
|
||||
.byte 0
|
||||
.byte 51
|
||||
.byte 0x78
|
||||
.byte 0x5e
|
||||
.byte 0x63
|
||||
.byte 0x14
|
||||
.byte 0x64
|
||||
.byte 0x14
|
||||
.byte 0x60
|
||||
.byte 0x13
|
||||
.byte 0x62
|
||||
.byte 0x14
|
||||
.byte 0x64
|
||||
.byte 0x64
|
||||
.byte 0xe6
|
||||
.byte 0x50
|
||||
.byte 0xe5
|
||||
.byte 0x10
|
||||
.byte 0xe6
|
||||
.byte 0x66
|
||||
.byte 0x60
|
||||
.byte 0x60
|
||||
.byte 0xd2
|
||||
.byte 0x63
|
||||
.byte 0xb0
|
||||
.byte 0xe7
|
||||
.byte 0xb1
|
||||
.byte 0xe2
|
||||
.byte 0xb6
|
||||
.byte 0xe6
|
||||
.byte 0x66
|
||||
.byte 0xe6
|
||||
.byte 0xf0
|
||||
.byte 0x14
|
||||
.byte 0x16
|
||||
.byte 0x64
|
||||
.byte 0x14
|
||||
.byte 0x62
|
||||
.byte 0x74
|
||||
.byte 0xe0
|
||||
.byte 0x02
|
||||
.byte 0x00
|
||||
.byte 0x25
|
||||
.byte 0x78
|
||||
.byte 0x02
|
||||
.byte 0x81
|
||||
.byte 0x78
|
||||
.byte 0x9c
|
||||
.byte 0x63
|
||||
.byte 0x60
|
||||
.byte 0x60
|
||||
.byte 0x56
|
||||
.byte 0x61
|
||||
.byte 0x60
|
||||
.byte 0xe6
|
||||
.byte 0xe0
|
||||
.byte 0xe6
|
||||
.byte 0xb6
|
||||
.byte 0xe3
|
||||
.byte 0x66
|
||||
.byte 0x00
|
||||
.byte 0x02
|
||||
.byte 0x00
|
||||
.byte 0x04
|
||||
.byte 0x9c
|
||||
.byte 0x00
|
||||
.byte 0x92
|
||||
.uleb128 1 /* Abbrev code */
|
||||
.uleb128 0x11 /* DW_TAG_compile_unit */
|
||||
.byte 1 /* has_children */
|
||||
.uleb128 0x10 /* DW_AT_stmt_list */
|
||||
.uleb128 0x6 /* DW_FORM_data4 */
|
||||
.uleb128 0x12 /* DW_AT_high_pc */
|
||||
.uleb128 0x1 /* DW_FORM_addr */
|
||||
.uleb128 0x11 /* DW_AT_low_pc */
|
||||
.uleb128 0x1 /* DW_FORM_addr */
|
||||
.uleb128 0x3 /* DW_AT_name */
|
||||
.uleb128 0x8 /* DW_FORM_string */
|
||||
.uleb128 0x25 /* DW_AT_producer */
|
||||
.uleb128 0x8 /* DW_FORM_string */
|
||||
.uleb128 0x13 /* DW_AT_language */
|
||||
.uleb128 0xb /* DW_FORM_data1 */
|
||||
.byte 0x0 /* Terminator */
|
||||
.byte 0x0 /* Terminator */
|
||||
|
||||
.uleb128 2 /* Abbrev code */
|
||||
.uleb128 0x2e /* DW_TAG_subprogram */
|
||||
.byte 0 /* has_children */
|
||||
.uleb128 0x3f /* DW_AT_external */
|
||||
.uleb128 0xc /* DW_FORM_flag */
|
||||
.uleb128 0x3a /* DW_AT_decl_file */
|
||||
.uleb128 0xb /* DW_FORM_data1 */
|
||||
.uleb128 0x3b /* DW_AT_decl_line */
|
||||
.uleb128 0xb /* DW_FORM_data1 */
|
||||
.uleb128 0x3 /* DW_AT_name */
|
||||
.uleb128 0x8 /* DW_FORM_string */
|
||||
.uleb128 0x49 /* DW_AT_type */
|
||||
.uleb128 0x13 /* DW_FORM_ref4 */
|
||||
.uleb128 0x11 /* DW_AT_low_pc */
|
||||
.uleb128 0x1 /* DW_FORM_addr */
|
||||
.uleb128 0x12 /* DW_AT_high_pc */
|
||||
.uleb128 0x1 /* DW_FORM_addr */
|
||||
.uleb128 0x40 /* DW_AT_frame_base */
|
||||
.uleb128 0xa /* DW_FORM_block1 */
|
||||
.byte 0x0 /* Terminator */
|
||||
.byte 0x0 /* Terminator */
|
||||
|
||||
.uleb128 3 /* Abbrev code */
|
||||
.uleb128 0x24 /* DW_TAG_base_type */
|
||||
.byte 0 /* has_children */
|
||||
.uleb128 0x3 /* DW_AT_name */
|
||||
.uleb128 0x8 /* DW_FORM_string */
|
||||
.uleb128 0xb /* DW_AT_byte_size */
|
||||
.uleb128 0xb /* DW_FORM_data1 */
|
||||
.uleb128 0x3e /* DW_AT_encoding */
|
||||
.uleb128 0xb /* DW_FORM_data1 */
|
||||
.byte 0x0 /* Terminator */
|
||||
.byte 0x0 /* Terminator */
|
||||
|
||||
.byte 0x0 /* Terminator */
|
||||
.byte 0x0 /* Terminator */
|
||||
|
@ -219,7 +219,6 @@ if [expr ([istarget "i*86-*-*"] || [istarget "x86_64-*-*"]) && [gas_32_check]]
|
||||
run_dump_test "localpic"
|
||||
run_dump_test "debug1"
|
||||
|
||||
setup_xfail "*-*-*"
|
||||
run_dump_test "dw2-compress-2"
|
||||
}
|
||||
|
||||
@ -409,7 +408,6 @@ if [expr ([istarget "i*86-*-*"] || [istarget "x86_64-*-*"]) && [gas_64_check]] t
|
||||
run_dump_test "x86-64-localpic"
|
||||
run_dump_test "debug1"
|
||||
|
||||
setup_xfail "*-*-*"
|
||||
run_dump_test "x86-64-dw2-compress-2"
|
||||
}
|
||||
|
||||
|
@ -1350,10 +1350,10 @@ compress_debug (bfd *abfd, asection *sec, void *xxx ATTRIBUTE_UNUSED)
|
||||
char *header;
|
||||
struct z_stream_s *strm;
|
||||
int x;
|
||||
flagword flags = bfd_get_section_flags (abfd, sec);
|
||||
|
||||
if (seginfo == NULL
|
||||
|| !(bfd_get_section_flags (abfd, sec) & SEC_HAS_CONTENTS)
|
||||
|| (bfd_get_section_flags (abfd, sec) & SEC_ALLOC))
|
||||
|| (flags & (SEC_ALLOC | SEC_HAS_CONTENTS)) == SEC_ALLOC)
|
||||
return;
|
||||
|
||||
section_name = bfd_get_section_name (stdoutput, sec);
|
||||
|
@ -1,3 +1,11 @@
|
||||
2010-10-29 H.J. Lu <hongjiu.lu@intel.com>
|
||||
|
||||
* ldfile.c (ldfile_try_open_bfd): Set BFD_DECOMPRESS after
|
||||
bfd_openr returns.
|
||||
* emultempl/elf32.em (gld${EMULATION_NAME}_try_needed): Likewise.
|
||||
|
||||
* scripttempl/elf.sc: Include compressed DWARF debug sections.
|
||||
|
||||
2010-10-28 Alan Modra <amodra@gmail.com>
|
||||
|
||||
* ldfile.c (find_scripts_dir): Don't look in absolute SCRIPTDIR.
|
||||
|
@ -317,6 +317,10 @@ gld${EMULATION_NAME}_try_needed (struct dt_needed *needed,
|
||||
abfd = bfd_openr (name, bfd_get_target (link_info.output_bfd));
|
||||
if (abfd == NULL)
|
||||
return FALSE;
|
||||
|
||||
/* Linker needs to decompress sections. */
|
||||
abfd->flags |= BFD_DECOMPRESS;
|
||||
|
||||
if (! bfd_check_format (abfd, bfd_object))
|
||||
{
|
||||
bfd_close (abfd);
|
||||
|
@ -150,6 +150,9 @@ ldfile_try_open_bfd (const char *attempt,
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/* Linker needs to decompress sections. */
|
||||
entry->the_bfd->flags |= BFD_DECOMPRESS;
|
||||
|
||||
/* If we are searching for this file, see if the architecture is
|
||||
compatible with the output file. If it isn't, keep searching.
|
||||
If we can't open the file as an object file, stop the search
|
||||
|
@ -572,31 +572,31 @@ cat <<EOF
|
||||
.line 0 : { *(.line) }
|
||||
|
||||
/* GNU DWARF 1 extensions */
|
||||
.debug_srcinfo 0 : { *(.debug_srcinfo) }
|
||||
.debug_sfnames 0 : { *(.debug_sfnames) }
|
||||
.debug_srcinfo 0 : { *(.debug_srcinfo .zdebug_srcinfo) }
|
||||
.debug_sfnames 0 : { *(.debug_sfnames .zdebug_sfnames) }
|
||||
|
||||
/* DWARF 1.1 and DWARF 2 */
|
||||
.debug_aranges 0 : { *(.debug_aranges) }
|
||||
.debug_pubnames 0 : { *(.debug_pubnames) }
|
||||
.debug_aranges 0 : { *(.debug_aranges .zdebug_aranges) }
|
||||
.debug_pubnames 0 : { *(.debug_pubnames .zdebug_pubnames) }
|
||||
|
||||
/* DWARF 2 */
|
||||
.debug_info 0 : { *(.debug_info${RELOCATING+ .gnu.linkonce.wi.*}) }
|
||||
.debug_abbrev 0 : { *(.debug_abbrev) }
|
||||
.debug_line 0 : { *(.debug_line) }
|
||||
.debug_frame 0 : { *(.debug_frame) }
|
||||
.debug_str 0 : { *(.debug_str) }
|
||||
.debug_loc 0 : { *(.debug_loc) }
|
||||
.debug_macinfo 0 : { *(.debug_macinfo) }
|
||||
.debug_info 0 : { *(.debug_info${RELOCATING+ .gnu.linkonce.wi.*} .zdebug_info) }
|
||||
.debug_abbrev 0 : { *(.debug_abbrev .zdebug_abbrev) }
|
||||
.debug_line 0 : { *(.debug_line .zdebug_line) }
|
||||
.debug_frame 0 : { *(.debug_frame .zdebug_frame) }
|
||||
.debug_str 0 : { *(.debug_str .zdebug_str) }
|
||||
.debug_loc 0 : { *(.debug_loc .zdebug_loc) }
|
||||
.debug_macinfo 0 : { *(.debug_macinfo .zdebug_macinfo) }
|
||||
|
||||
/* SGI/MIPS DWARF 2 extensions */
|
||||
.debug_weaknames 0 : { *(.debug_weaknames) }
|
||||
.debug_funcnames 0 : { *(.debug_funcnames) }
|
||||
.debug_typenames 0 : { *(.debug_typenames) }
|
||||
.debug_varnames 0 : { *(.debug_varnames) }
|
||||
.debug_weaknames 0 : { *(.debug_weaknames .zdebug_weaknames) }
|
||||
.debug_funcnames 0 : { *(.debug_funcnames .zdebug_funcnames) }
|
||||
.debug_typenames 0 : { *(.debug_typenames .zdebug_typenames) }
|
||||
.debug_varnames 0 : { *(.debug_varnames .zdebug_varnames) }
|
||||
|
||||
/* DWARF 3 */
|
||||
.debug_pubtypes 0 : { *(.debug_pubtypes) }
|
||||
.debug_ranges 0 : { *(.debug_ranges) }
|
||||
.debug_pubtypes 0 : { *(.debug_pubtypes .zdebug_pubtypes) }
|
||||
.debug_ranges 0 : { *(.debug_ranges .zdebug_ranges) }
|
||||
|
||||
${TINY_DATA_SECTION}
|
||||
${TINY_BSS_SECTION}
|
||||
|
@ -1,3 +1,11 @@
|
||||
2010-10-29 H.J. Lu <hongjiu.lu@intel.com>
|
||||
|
||||
* ld-elf/compress.exp: New.
|
||||
* ld-elf/compress1.s: Likewise.
|
||||
* ld-elf/compress1a.d: Likewise.
|
||||
* ld-elf/compress1b.d: Likewise.
|
||||
* ld-elf/compress1c.d: Likewise.
|
||||
|
||||
2010-10-29 Bernd Schmidt <bernds@codesourcery.com>
|
||||
Joseph Myers <joseph@codesourcery.com>
|
||||
|
||||
|
59
ld/testsuite/ld-elf/compress.exp
Normal file
59
ld/testsuite/ld-elf/compress.exp
Normal file
@ -0,0 +1,59 @@
|
||||
# Expect script for ELF compressed debug section tests.
|
||||
# Copyright 2010 Free Software Foundation, Inc.
|
||||
#
|
||||
# This file is part of the GNU Binutils.
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
|
||||
# MA 02110-1301, USA.
|
||||
#
|
||||
|
||||
# Exclude non-ELF targets.
|
||||
|
||||
if ![is_elf_format] {
|
||||
return
|
||||
}
|
||||
|
||||
# The following tests require running the executable generated by ld.
|
||||
if ![isnative] {
|
||||
return
|
||||
}
|
||||
|
||||
# Check if compiler works
|
||||
if { [which $CC] == 0 } {
|
||||
return
|
||||
}
|
||||
|
||||
global as
|
||||
if { ![ld_assemble $as "--compress-debug-sections $srcdir/$subdir/empty.s" tmpdir/empty.o ] } {
|
||||
unsupported "linker compressed debug sections"
|
||||
}
|
||||
|
||||
set build_tests {
|
||||
{"Build libfoo.so with compressed debug sections"
|
||||
"-shared" "-fPIC -g -Wa,--compress-debug-sections"
|
||||
{foo.c} {} "libfoo.so"}
|
||||
{"Build libbar.so with compressed debug sections"
|
||||
"-shared" "-fPIC -g -Wa,--compress-debug-sections"
|
||||
{begin.c end.c} {} "libbar.so"}
|
||||
}
|
||||
|
||||
set run_tests {
|
||||
{"Run normal with libfoo.so with compressed debug sections"
|
||||
"tmpdir/begin.o tmpdir/libfoo.so tmpdir/end.o" "-Wa,--compress-debug-sections"
|
||||
{main.c} "normal" "normal.out"}
|
||||
}
|
||||
|
||||
run_cc_link_tests $build_tests
|
||||
run_ld_link_exec_tests [] $run_tests
|
216
ld/testsuite/ld-elf/compress1.s
Normal file
216
ld/testsuite/ld-elf/compress1.s
Normal file
@ -0,0 +1,216 @@
|
||||
/* This testcase is derived from a similar test in GDB.
|
||||
|
||||
Copyright 2008, 2009, 2010 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||
|
||||
/* Dummy function to provide debug information for. */
|
||||
|
||||
.text
|
||||
.Lbegin_text1:
|
||||
.globl func_cu2
|
||||
.type func_cu2, %function
|
||||
func_cu2:
|
||||
.Lbegin_func_cu2:
|
||||
.int 0
|
||||
.Lend_func_cu2:
|
||||
.size func_cu2, .-func_cu2
|
||||
.Lend_text1:
|
||||
|
||||
/* Debug information */
|
||||
|
||||
.section .debug_info
|
||||
.Lcu1_begin:
|
||||
/* CU header */
|
||||
.4byte .Lcu1_end - .Lcu1_start /* Length of Compilation Unit */
|
||||
.Lcu1_start:
|
||||
.2byte 2 /* DWARF Version */
|
||||
.4byte .Labbrev1_begin /* Offset into abbrev section */
|
||||
.byte 4 /* Pointer size */
|
||||
|
||||
/* CU die */
|
||||
.uleb128 1 /* Abbrev: DW_TAG_compile_unit */
|
||||
.4byte .Lline1_begin /* DW_AT_stmt_list */
|
||||
.4byte .Lend_text1 /* DW_AT_high_pc */
|
||||
.4byte .Lbegin_text1 /* DW_AT_low_pc */
|
||||
.ascii "file1.txt\0" /* DW_AT_name */
|
||||
.ascii "GNU C 3.3.3\0" /* DW_AT_producer */
|
||||
.byte 1 /* DW_AT_language (C) */
|
||||
|
||||
/* func_cu2 */
|
||||
.uleb128 2 /* Abbrev: DW_TAG_subprogram */
|
||||
.byte 1 /* DW_AT_external */
|
||||
.byte 1 /* DW_AT_decl_file */
|
||||
.byte 2 /* DW_AT_decl_line */
|
||||
.ascii "func_cu2\0" /* DW_AT_name */
|
||||
.4byte .Ltype_int-.Lcu1_begin /* DW_AT_type */
|
||||
.4byte .Lbegin_func_cu2 /* DW_AT_low_pc */
|
||||
.4byte .Lend_func_cu2 /* DW_AT_high_pc */
|
||||
.byte 1 /* DW_AT_frame_base: length */
|
||||
.byte 0x55 /* DW_AT_frame_base: DW_OP_reg5 */
|
||||
|
||||
.Ltype_int:
|
||||
.uleb128 3 /* Abbrev: DW_TAG_base_type */
|
||||
.ascii "int\0" /* DW_AT_name */
|
||||
.byte 4 /* DW_AT_byte_size */
|
||||
.byte 5 /* DW_AT_encoding */
|
||||
|
||||
.byte 0 /* End of children of CU */
|
||||
|
||||
.Lcu1_end:
|
||||
|
||||
/* Line table */
|
||||
.section .debug_line
|
||||
.Lline1_begin:
|
||||
.4byte .Lline1_end - .Lline1_start /* Initial length */
|
||||
.Lline1_start:
|
||||
.2byte 2 /* Version */
|
||||
.4byte .Lline1_lines - .Lline1_hdr /* header_length */
|
||||
.Lline1_hdr:
|
||||
.byte 1 /* Minimum insn length */
|
||||
.byte 1 /* default_is_stmt */
|
||||
.byte 1 /* line_base */
|
||||
.byte 1 /* line_range */
|
||||
.byte 0x10 /* opcode_base */
|
||||
|
||||
/* Standard lengths */
|
||||
.byte 0
|
||||
.byte 1
|
||||
.byte 1
|
||||
.byte 1
|
||||
.byte 1
|
||||
.byte 0
|
||||
.byte 0
|
||||
.byte 0
|
||||
.byte 1
|
||||
.byte 0
|
||||
.byte 0
|
||||
.byte 1
|
||||
.byte 0
|
||||
.byte 0
|
||||
.byte 0
|
||||
|
||||
/* Include directories */
|
||||
.byte 0
|
||||
|
||||
/* File names */
|
||||
.ascii "file1.txt\0"
|
||||
.uleb128 0
|
||||
.uleb128 0
|
||||
.uleb128 0
|
||||
|
||||
.byte 0
|
||||
|
||||
.Lline1_lines:
|
||||
.byte 0 /* DW_LNE_set_address */
|
||||
.uleb128 5
|
||||
.byte 2
|
||||
.4byte .Lbegin_func_cu2
|
||||
|
||||
.byte 3 /* DW_LNS_advance_line */
|
||||
.sleb128 3 /* ... to 4 */
|
||||
|
||||
.byte 1 /* DW_LNS_copy */
|
||||
|
||||
.byte 1 /* DW_LNS_copy (second time as an end-of-prologue marker) */
|
||||
|
||||
.byte 0 /* DW_LNE_set_address */
|
||||
.uleb128 5
|
||||
.byte 2
|
||||
.4byte .Lend_func_cu2
|
||||
|
||||
.byte 0 /* DW_LNE_end_of_sequence */
|
||||
.uleb128 1
|
||||
.byte 1
|
||||
|
||||
.Lline1_end:
|
||||
|
||||
/* Abbrev table */
|
||||
.section .debug_abbrev
|
||||
.Labbrev1_begin:
|
||||
.uleb128 1 /* Abbrev code */
|
||||
.uleb128 0x11 /* DW_TAG_compile_unit */
|
||||
.byte 1 /* has_children */
|
||||
.uleb128 0x10 /* DW_AT_stmt_list */
|
||||
.uleb128 0x6 /* DW_FORM_data4 */
|
||||
.uleb128 0x12 /* DW_AT_high_pc */
|
||||
.uleb128 0x1 /* DW_FORM_addr */
|
||||
.uleb128 0x11 /* DW_AT_low_pc */
|
||||
.uleb128 0x1 /* DW_FORM_addr */
|
||||
.uleb128 0x3 /* DW_AT_name */
|
||||
.uleb128 0x8 /* DW_FORM_string */
|
||||
.uleb128 0x25 /* DW_AT_producer */
|
||||
.uleb128 0x8 /* DW_FORM_string */
|
||||
.uleb128 0x13 /* DW_AT_language */
|
||||
.uleb128 0xb /* DW_FORM_data1 */
|
||||
.byte 0x0 /* Terminator */
|
||||
.byte 0x0 /* Terminator */
|
||||
|
||||
.uleb128 2 /* Abbrev code */
|
||||
.uleb128 0x2e /* DW_TAG_subprogram */
|
||||
.byte 0 /* has_children */
|
||||
.uleb128 0x3f /* DW_AT_external */
|
||||
.uleb128 0xc /* DW_FORM_flag */
|
||||
.uleb128 0x3a /* DW_AT_decl_file */
|
||||
.uleb128 0xb /* DW_FORM_data1 */
|
||||
.uleb128 0x3b /* DW_AT_decl_line */
|
||||
.uleb128 0xb /* DW_FORM_data1 */
|
||||
.uleb128 0x3 /* DW_AT_name */
|
||||
.uleb128 0x8 /* DW_FORM_string */
|
||||
.uleb128 0x49 /* DW_AT_type */
|
||||
.uleb128 0x13 /* DW_FORM_ref4 */
|
||||
.uleb128 0x11 /* DW_AT_low_pc */
|
||||
.uleb128 0x1 /* DW_FORM_addr */
|
||||
.uleb128 0x12 /* DW_AT_high_pc */
|
||||
.uleb128 0x1 /* DW_FORM_addr */
|
||||
.uleb128 0x40 /* DW_AT_frame_base */
|
||||
.uleb128 0xa /* DW_FORM_block1 */
|
||||
.byte 0x0 /* Terminator */
|
||||
.byte 0x0 /* Terminator */
|
||||
|
||||
.uleb128 3 /* Abbrev code */
|
||||
.uleb128 0x24 /* DW_TAG_base_type */
|
||||
.byte 0 /* has_children */
|
||||
.uleb128 0x3 /* DW_AT_name */
|
||||
.uleb128 0x8 /* DW_FORM_string */
|
||||
.uleb128 0xb /* DW_AT_byte_size */
|
||||
.uleb128 0xb /* DW_FORM_data1 */
|
||||
.uleb128 0x3e /* DW_AT_encoding */
|
||||
.uleb128 0xb /* DW_FORM_data1 */
|
||||
.byte 0x0 /* Terminator */
|
||||
.byte 0x0 /* Terminator */
|
||||
|
||||
.byte 0x0 /* Terminator */
|
||||
.byte 0x0 /* Terminator */
|
||||
|
||||
.section .debug_pubnames,"",%progbits
|
||||
.4byte 0x19
|
||||
.2byte 0x2
|
||||
.4byte .Lcu1_begin
|
||||
.4byte 0x43
|
||||
.4byte 0x25
|
||||
.string "func_cu2"
|
||||
.4byte 0x0
|
||||
.section .debug_aranges,"",%progbits
|
||||
.4byte 0x1c
|
||||
.2byte 0x2
|
||||
.4byte .Lcu1_begin
|
||||
.byte 0x4
|
||||
.byte 0x0
|
||||
.2byte 0x0
|
||||
.2byte 0x0
|
||||
.4byte .Lbegin_text1
|
||||
.4byte .Lbegin_text1-.Lend_text1
|
||||
.4byte 0x0
|
||||
.4byte 0x0
|
9
ld/testsuite/ld-elf/compress1a.d
Normal file
9
ld/testsuite/ld-elf/compress1a.d
Normal file
@ -0,0 +1,9 @@
|
||||
#source: compress1.s
|
||||
#as: --compress-debug-sections
|
||||
#ld: -e func_cu2
|
||||
#readelf: -S --wide
|
||||
|
||||
#failif
|
||||
#...
|
||||
\[[ 0-9]+\] \.zdebug_.*[ ]+PROGBITS[ 0-9a-z]+ .*
|
||||
#...
|
9
ld/testsuite/ld-elf/compress1b.d
Normal file
9
ld/testsuite/ld-elf/compress1b.d
Normal file
@ -0,0 +1,9 @@
|
||||
#source: compress1.s
|
||||
#as: --compress-debug-sections
|
||||
#ld: -r
|
||||
#readelf: -S --wide
|
||||
|
||||
#failif
|
||||
#...
|
||||
\[[ 0-9]+\] \.zdebug_.*[ ]+PROGBITS[ 0-9a-z]+ .*
|
||||
#...
|
9
ld/testsuite/ld-elf/compress1c.d
Normal file
9
ld/testsuite/ld-elf/compress1c.d
Normal file
@ -0,0 +1,9 @@
|
||||
#source: compress1.s
|
||||
#as: --compress-debug-sections
|
||||
#ld: -shared
|
||||
#readelf: -S --wide
|
||||
|
||||
#failif
|
||||
#...
|
||||
\[[ 0-9]+\] \.zdebug_.*[ ]+PROGBITS[ 0-9a-z]+ .*
|
||||
#...
|
Loading…
Reference in New Issue
Block a user