aboutsummaryrefslogtreecommitdiff
path: root/bfd/bfd.c
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2015-05-14 15:58:51 -0700
committerH.J. Lu <hjl.tools@gmail.com>2015-05-14 16:02:08 -0700
commitdab394de9e41de54df5e2310e081e1c550326f5b (patch)
treefbdbe4f564baa35e7fb4bea28416a531fcb9d916 /bfd/bfd.c
parent61a7418ccb7c2de12d4c4df79e193f32db938a11 (diff)
downloadgdb-dab394de9e41de54df5e2310e081e1c550326f5b.zip
gdb-dab394de9e41de54df5e2310e081e1c550326f5b.tar.gz
gdb-dab394de9e41de54df5e2310e081e1c550326f5b.tar.bz2
Don't add the zlib header to SHF_COMPRESSED section
In a SHF_COMPRESSED compressed section, the raw compressed data should begin immediately after the compression header. This patch removes the extra zlib header from the SHF_COMPRESSED section. bfd/ * bfd.c (bfd_update_compression_header): Also write the zlib header if the SHF_COMPRESSED bit cleared.. (bfd_check_compression_header): Return the uncompressed size. * compress.c (decompress_contents): Don't skip the zlib header. (bfd_compress_section_contents): Properly handle ELFCOMPRESS_ZLIB, which doesn't have the zlib header. (bfd_init_section_decompress_status): Likewise. (bfd_get_full_section_contents): Updated. (bfd_is_section_compressed): Likewise. (bfd_is_section_compressed_with_header): Return the uncompressed size. * elf.c (_bfd_elf_make_section_from_shdr): Updated. * bfd-in2.h: Regenerated. binutils/ * readelf.c (uncompress_section_contents): Add a parameter for uncompressed size. Don't check the zlib header. (load_specific_debug_section): Updated. binutils/testsuite/ * binutils-all/compress.exp: Replace "$OBJDUMP -s -j .debug_info" with "$OBJDUMP -W". * binutils-all/libdw2-compressedgabi.out: Updated. gas/ 2015-05-14 H.J. Lu <hongjiu.lu@intel.com> * write.c (compress_debug): Don't write the zlib header, which is handled by bfd_update_compression_header.
Diffstat (limited to 'bfd/bfd.c')
-rw-r--r--bfd/bfd.c30
1 files changed, 21 insertions, 9 deletions
diff --git a/bfd/bfd.c b/bfd/bfd.c
index 5b336a9..ab410cb 100644
--- a/bfd/bfd.c
+++ b/bfd/bfd.c
@@ -1998,8 +1998,16 @@ bfd_update_compression_header (bfd *abfd, bfd_byte *contents,
}
}
else
- /* Clear the SHF_COMPRESSED bit. */
- elf_section_flags (sec) &= ~SHF_COMPRESSED;
+ {
+ /* Clear the SHF_COMPRESSED bit. */
+ elf_section_flags (sec) &= ~SHF_COMPRESSED;
+
+ /* Write the zlib header. It should be "ZLIB" followed by
+ the uncompressed section size, 8 bytes in big-endian
+ order. */
+ memcpy (contents, "ZLIB", 4);
+ bfd_putb64 (sec->size, contents + 4);
+ }
}
}
else
@@ -2013,11 +2021,12 @@ bfd_update_compression_header (bfd *abfd, bfd_byte *contents,
SYNOPSIS
bfd_boolean bfd_check_compression_header
(bfd *abfd, bfd_byte *contents, asection *sec,
- bfd_size_type uncompressed_size);
+ bfd_size_type *uncompressed_size);
DESCRIPTION
- Check the compression header at CONTENTS of SEC in ABFD with
- the uncompressed size UNCOMPRESSED_SIZE.
+ Check the compression header at CONTENTS of SEC in ABFD and
+ store the uncompressed size in UNCOMPRESSED_SIZE if the
+ compression header is valid.
RETURNS
Return TRUE if the compression header is valid.
@@ -2026,7 +2035,7 @@ RETURNS
bfd_boolean
bfd_check_compression_header (bfd *abfd, bfd_byte *contents,
asection *sec,
- bfd_size_type uncompressed_size)
+ bfd_size_type *uncompressed_size)
{
if (bfd_get_flavour (abfd) == bfd_target_elf_flavour
&& (elf_section_flags (sec) & SHF_COMPRESSED) != 0)
@@ -2047,9 +2056,12 @@ bfd_check_compression_header (bfd *abfd, bfd_byte *contents,
chdr.ch_size = bfd_get_64 (abfd, &echdr->ch_size);
chdr.ch_addralign = bfd_get_64 (abfd, &echdr->ch_addralign);
}
- return (chdr.ch_type == ELFCOMPRESS_ZLIB
- && chdr.ch_size == uncompressed_size
- && chdr.ch_addralign == 1U << sec->alignment_power);
+ if (chdr.ch_type == ELFCOMPRESS_ZLIB
+ && chdr.ch_addralign == 1U << sec->alignment_power)
+ {
+ *uncompressed_size = chdr.ch_size;
+ return TRUE;
+ }
}
return FALSE;