aboutsummaryrefslogtreecommitdiff
path: root/bfd/elf.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/elf.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/elf.c')
-rw-r--r--bfd/elf.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/bfd/elf.c b/bfd/elf.c
index dbdc474..619a640 100644
--- a/bfd/elf.c
+++ b/bfd/elf.c
@@ -1067,9 +1067,11 @@ _bfd_elf_make_section_from_shdr (bfd *abfd,
{
enum { nothing, compress, decompress } action = nothing;
int compression_header_size;
+ bfd_size_type uncompressed_size;
bfd_boolean compressed
= bfd_is_section_compressed_with_header (abfd, newsect,
- &compression_header_size);
+ &compression_header_size,
+ &uncompressed_size);
if (compressed)
{
@@ -1085,6 +1087,7 @@ _bfd_elf_make_section_from_shdr (bfd *abfd,
if (newsect->size != 0
&& (abfd->flags & BFD_COMPRESS)
&& compression_header_size >= 0
+ && uncompressed_size > 0
&& (!compressed
|| ((compression_header_size > 0)
!= ((abfd->flags & BFD_COMPRESS_GABI) != 0))))