Home | History | Annotate | Line # | Download | only in bfd
compress.c revision 1.8
      1  1.1  christos /* Compressed section support (intended for debug sections).
      2  1.8  christos    Copyright (C) 2008-2019 Free Software Foundation, Inc.
      3  1.1  christos 
      4  1.1  christos    This file is part of BFD, the Binary File Descriptor library.
      5  1.1  christos 
      6  1.1  christos    This program is free software; you can redistribute it and/or modify
      7  1.1  christos    it under the terms of the GNU General Public License as published by
      8  1.1  christos    the Free Software Foundation; either version 3 of the License, or
      9  1.1  christos    (at your option) any later version.
     10  1.1  christos 
     11  1.1  christos    This program is distributed in the hope that it will be useful,
     12  1.1  christos    but WITHOUT ANY WARRANTY; without even the implied warranty of
     13  1.1  christos    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     14  1.1  christos    GNU General Public License for more details.
     15  1.1  christos 
     16  1.1  christos    You should have received a copy of the GNU General Public License
     17  1.1  christos    along with this program; if not, write to the Free Software
     18  1.1  christos    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
     19  1.1  christos    MA 02110-1301, USA.  */
     20  1.1  christos 
     21  1.1  christos #include "sysdep.h"
     22  1.5  christos #include <zlib.h>
     23  1.1  christos #include "bfd.h"
     24  1.1  christos #include "libbfd.h"
     25  1.3  christos #include "safe-ctype.h"
     26  1.1  christos 
     27  1.5  christos #define MAX_COMPRESSION_HEADER_SIZE 24
     28  1.5  christos 
     29  1.1  christos static bfd_boolean
     30  1.1  christos decompress_contents (bfd_byte *compressed_buffer,
     31  1.1  christos 		     bfd_size_type compressed_size,
     32  1.1  christos 		     bfd_byte *uncompressed_buffer,
     33  1.1  christos 		     bfd_size_type uncompressed_size)
     34  1.1  christos {
     35  1.1  christos   z_stream strm;
     36  1.1  christos   int rc;
     37  1.1  christos 
     38  1.1  christos   /* It is possible the section consists of several compressed
     39  1.1  christos      buffers concatenated together, so we uncompress in a loop.  */
     40  1.5  christos   /* PR 18313: The state field in the z_stream structure is supposed
     41  1.5  christos      to be invisible to the user (ie us), but some compilers will
     42  1.5  christos      still complain about it being used without initialisation.  So
     43  1.5  christos      we first zero the entire z_stream structure and then set the fields
     44  1.5  christos      that we need.  */
     45  1.5  christos   memset (& strm, 0, sizeof strm);
     46  1.5  christos   strm.avail_in = compressed_size;
     47  1.5  christos   strm.next_in = (Bytef*) compressed_buffer;
     48  1.1  christos   strm.avail_out = uncompressed_size;
     49  1.1  christos 
     50  1.1  christos   BFD_ASSERT (Z_OK == 0);
     51  1.1  christos   rc = inflateInit (&strm);
     52  1.1  christos   while (strm.avail_in > 0 && strm.avail_out > 0)
     53  1.1  christos     {
     54  1.1  christos       if (rc != Z_OK)
     55  1.1  christos 	break;
     56  1.1  christos       strm.next_out = ((Bytef*) uncompressed_buffer
     57  1.8  christos 		       + (uncompressed_size - strm.avail_out));
     58  1.1  christos       rc = inflate (&strm, Z_FINISH);
     59  1.1  christos       if (rc != Z_STREAM_END)
     60  1.1  christos 	break;
     61  1.1  christos       rc = inflateReset (&strm);
     62  1.1  christos     }
     63  1.1  christos   rc |= inflateEnd (&strm);
     64  1.1  christos   return rc == Z_OK && strm.avail_out == 0;
     65  1.1  christos }
     66  1.1  christos 
     67  1.5  christos /* Compress data of the size specified in @var{uncompressed_size}
     68  1.5  christos    and pointed to by @var{uncompressed_buffer} using zlib and store
     69  1.5  christos    as the contents field.  This function assumes the contents
     70  1.5  christos    field was allocated using bfd_malloc() or equivalent.
     71  1.5  christos 
     72  1.5  christos    Return the uncompressed size if the full section contents is
     73  1.5  christos    compressed successfully.  Otherwise return 0.  */
     74  1.5  christos 
     75  1.5  christos static bfd_size_type
     76  1.5  christos bfd_compress_section_contents (bfd *abfd, sec_ptr sec,
     77  1.5  christos 			       bfd_byte *uncompressed_buffer,
     78  1.5  christos 			       bfd_size_type uncompressed_size)
     79  1.1  christos {
     80  1.1  christos   uLong compressed_size;
     81  1.5  christos   bfd_byte *buffer;
     82  1.5  christos   bfd_size_type buffer_size;
     83  1.5  christos   bfd_boolean decompress;
     84  1.5  christos   int zlib_size = 0;
     85  1.5  christos   int orig_compression_header_size;
     86  1.5  christos   bfd_size_type orig_uncompressed_size;
     87  1.8  christos   unsigned int orig_uncompressed_alignment_pow;
     88  1.5  christos   int header_size = bfd_get_compression_header_size (abfd, NULL);
     89  1.5  christos   bfd_boolean compressed
     90  1.5  christos     = bfd_is_section_compressed_with_header (abfd, sec,
     91  1.5  christos 					     &orig_compression_header_size,
     92  1.8  christos 					     &orig_uncompressed_size,
     93  1.8  christos 					     &orig_uncompressed_alignment_pow);
     94  1.5  christos 
     95  1.5  christos   /* Either ELF compression header or the 12-byte, "ZLIB" + 8-byte size,
     96  1.5  christos      overhead in .zdebug* section.  */
     97  1.5  christos   if (!header_size)
     98  1.5  christos      header_size = 12;
     99  1.5  christos 
    100  1.5  christos   if (compressed)
    101  1.5  christos     {
    102  1.5  christos       /* We shouldn't decompress unsupported compressed section.  */
    103  1.5  christos       if (orig_compression_header_size < 0)
    104  1.5  christos 	abort ();
    105  1.5  christos 
    106  1.5  christos       /* Different compression schemes.  Just move the compressed section
    107  1.5  christos 	 contents to the right position. */
    108  1.5  christos       if (orig_compression_header_size == 0)
    109  1.5  christos 	{
    110  1.5  christos 	  /* Convert it from .zdebug* section.  Get the uncompressed
    111  1.8  christos 	     size first.  We need to subtract the 12-byte overhead in
    112  1.5  christos 	     .zdebug* section.  Set orig_compression_header_size to
    113  1.5  christos 	     the 12-bye overhead.  */
    114  1.5  christos 	  orig_compression_header_size = 12;
    115  1.5  christos 	  zlib_size = uncompressed_size - 12;
    116  1.5  christos 	}
    117  1.5  christos       else
    118  1.5  christos 	{
    119  1.5  christos 	  /* Convert it to .zdebug* section.  */
    120  1.5  christos 	  zlib_size = uncompressed_size - orig_compression_header_size;
    121  1.5  christos 	}
    122  1.1  christos 
    123  1.5  christos       /* Add the header size.  */
    124  1.5  christos       compressed_size = zlib_size + header_size;
    125  1.5  christos     }
    126  1.5  christos   else
    127  1.5  christos     compressed_size = compressBound (uncompressed_size) + header_size;
    128  1.1  christos 
    129  1.5  christos   /* Uncompress if it leads to smaller size.  */
    130  1.5  christos   if (compressed && compressed_size > orig_uncompressed_size)
    131  1.5  christos     {
    132  1.5  christos       decompress = TRUE;
    133  1.5  christos       buffer_size = orig_uncompressed_size;
    134  1.5  christos     }
    135  1.5  christos   else
    136  1.5  christos     {
    137  1.5  christos       decompress = FALSE;
    138  1.5  christos       buffer_size = compressed_size;
    139  1.5  christos     }
    140  1.5  christos   buffer = (bfd_byte *) bfd_alloc (abfd, buffer_size);
    141  1.5  christos   if (buffer == NULL)
    142  1.5  christos     return 0;
    143  1.1  christos 
    144  1.5  christos   if (compressed)
    145  1.1  christos     {
    146  1.5  christos       sec->size = orig_uncompressed_size;
    147  1.5  christos       if (decompress)
    148  1.5  christos 	{
    149  1.5  christos 	  if (!decompress_contents (uncompressed_buffer
    150  1.5  christos 				    + orig_compression_header_size,
    151  1.5  christos 				    zlib_size, buffer, buffer_size))
    152  1.5  christos 	    {
    153  1.5  christos 	      bfd_set_error (bfd_error_bad_value);
    154  1.5  christos 	      bfd_release (abfd, buffer);
    155  1.5  christos 	      return 0;
    156  1.5  christos 	    }
    157  1.5  christos 	  free (uncompressed_buffer);
    158  1.8  christos 	  bfd_set_section_alignment (abfd, sec,
    159  1.8  christos 				     orig_uncompressed_alignment_pow);
    160  1.8  christos 
    161  1.5  christos 	  sec->contents = buffer;
    162  1.5  christos 	  sec->compress_status = COMPRESS_SECTION_DONE;
    163  1.5  christos 	  return orig_uncompressed_size;
    164  1.5  christos 	}
    165  1.5  christos       else
    166  1.5  christos 	{
    167  1.5  christos 	  bfd_update_compression_header (abfd, buffer, sec);
    168  1.5  christos 	  memmove (buffer + header_size,
    169  1.5  christos 		   uncompressed_buffer + orig_compression_header_size,
    170  1.5  christos 		   zlib_size);
    171  1.5  christos 	}
    172  1.1  christos     }
    173  1.5  christos   else
    174  1.5  christos     {
    175  1.5  christos       if (compress ((Bytef*) buffer + header_size,
    176  1.5  christos 		    &compressed_size,
    177  1.5  christos 		    (const Bytef*) uncompressed_buffer,
    178  1.5  christos 		    uncompressed_size) != Z_OK)
    179  1.5  christos 	{
    180  1.5  christos 	  bfd_release (abfd, buffer);
    181  1.5  christos 	  bfd_set_error (bfd_error_bad_value);
    182  1.5  christos 	  return 0;
    183  1.5  christos 	}
    184  1.1  christos 
    185  1.5  christos       compressed_size += header_size;
    186  1.5  christos       /* PR binutils/18087: If compression didn't make the section smaller,
    187  1.5  christos 	 just keep it uncompressed.  */
    188  1.5  christos       if (compressed_size < uncompressed_size)
    189  1.5  christos 	bfd_update_compression_header (abfd, buffer, sec);
    190  1.5  christos       else
    191  1.5  christos 	{
    192  1.5  christos 	  /* NOTE: There is a small memory leak here since
    193  1.5  christos 	     uncompressed_buffer is malloced and won't be freed.  */
    194  1.5  christos 	  bfd_release (abfd, buffer);
    195  1.5  christos 	  sec->contents = uncompressed_buffer;
    196  1.5  christos 	  sec->compress_status = COMPRESS_SECTION_NONE;
    197  1.5  christos 	  return uncompressed_size;
    198  1.5  christos 	}
    199  1.5  christos     }
    200  1.1  christos 
    201  1.5  christos   free (uncompressed_buffer);
    202  1.5  christos   sec->contents = buffer;
    203  1.1  christos   sec->size = compressed_size;
    204  1.1  christos   sec->compress_status = COMPRESS_SECTION_DONE;
    205  1.1  christos 
    206  1.5  christos   return uncompressed_size;
    207  1.1  christos }
    208  1.1  christos 
    209  1.1  christos /*
    210  1.1  christos FUNCTION
    211  1.1  christos 	bfd_get_full_section_contents
    212  1.1  christos 
    213  1.1  christos SYNOPSIS
    214  1.1  christos 	bfd_boolean bfd_get_full_section_contents
    215  1.1  christos 	  (bfd *abfd, asection *section, bfd_byte **ptr);
    216  1.1  christos 
    217  1.1  christos DESCRIPTION
    218  1.1  christos 	Read all data from @var{section} in BFD @var{abfd}, decompress
    219  1.1  christos 	if needed, and store in @var{*ptr}.  If @var{*ptr} is NULL,
    220  1.1  christos 	return @var{*ptr} with memory malloc'd by this function.
    221  1.1  christos 
    222  1.1  christos 	Return @code{TRUE} if the full section contents is retrieved
    223  1.3  christos 	successfully.  If the section has no contents then this function
    224  1.3  christos 	returns @code{TRUE} but @var{*ptr} is set to NULL.
    225  1.1  christos */
    226  1.1  christos 
    227  1.1  christos bfd_boolean
    228  1.1  christos bfd_get_full_section_contents (bfd *abfd, sec_ptr sec, bfd_byte **ptr)
    229  1.1  christos {
    230  1.1  christos   bfd_size_type sz;
    231  1.1  christos   bfd_byte *p = *ptr;
    232  1.1  christos   bfd_boolean ret;
    233  1.1  christos   bfd_size_type save_size;
    234  1.1  christos   bfd_size_type save_rawsize;
    235  1.1  christos   bfd_byte *compressed_buffer;
    236  1.5  christos   unsigned int compression_header_size;
    237  1.1  christos 
    238  1.1  christos   if (abfd->direction != write_direction && sec->rawsize != 0)
    239  1.1  christos     sz = sec->rawsize;
    240  1.1  christos   else
    241  1.1  christos     sz = sec->size;
    242  1.1  christos   if (sz == 0)
    243  1.3  christos     {
    244  1.3  christos       *ptr = NULL;
    245  1.3  christos       return TRUE;
    246  1.3  christos     }
    247  1.1  christos 
    248  1.1  christos   switch (sec->compress_status)
    249  1.1  christos     {
    250  1.1  christos     case COMPRESS_SECTION_NONE:
    251  1.1  christos       if (p == NULL)
    252  1.1  christos 	{
    253  1.1  christos 	  p = (bfd_byte *) bfd_malloc (sz);
    254  1.1  christos 	  if (p == NULL)
    255  1.7  christos 	    {
    256  1.7  christos 	      /* PR 20801: Provide a more helpful error message.  */
    257  1.7  christos 	      if (bfd_get_error () == bfd_error_no_memory)
    258  1.7  christos 		_bfd_error_handler
    259  1.7  christos 		  /* xgettext:c-format */
    260  1.8  christos 		  (_("error: %pB(%pA) is too large (%#" PRIx64 " bytes)"),
    261  1.8  christos 		  abfd, sec, (uint64_t) sz);
    262  1.8  christos 	      return FALSE;
    263  1.7  christos 	    }
    264  1.1  christos 	}
    265  1.3  christos 
    266  1.1  christos       if (!bfd_get_section_contents (abfd, sec, p, 0, sz))
    267  1.1  christos 	{
    268  1.1  christos 	  if (*ptr != p)
    269  1.1  christos 	    free (p);
    270  1.1  christos 	  return FALSE;
    271  1.1  christos 	}
    272  1.1  christos       *ptr = p;
    273  1.1  christos       return TRUE;
    274  1.1  christos 
    275  1.1  christos     case DECOMPRESS_SECTION_SIZED:
    276  1.1  christos       /* Read in the full compressed section contents.  */
    277  1.1  christos       compressed_buffer = (bfd_byte *) bfd_malloc (sec->compressed_size);
    278  1.1  christos       if (compressed_buffer == NULL)
    279  1.1  christos 	return FALSE;
    280  1.1  christos       save_rawsize = sec->rawsize;
    281  1.1  christos       save_size = sec->size;
    282  1.1  christos       /* Clear rawsize, set size to compressed size and set compress_status
    283  1.1  christos 	 to COMPRESS_SECTION_NONE.  If the compressed size is bigger than
    284  1.1  christos 	 the uncompressed size, bfd_get_section_contents will fail.  */
    285  1.1  christos       sec->rawsize = 0;
    286  1.1  christos       sec->size = sec->compressed_size;
    287  1.1  christos       sec->compress_status = COMPRESS_SECTION_NONE;
    288  1.1  christos       ret = bfd_get_section_contents (abfd, sec, compressed_buffer,
    289  1.1  christos 				      0, sec->compressed_size);
    290  1.1  christos       /* Restore rawsize and size.  */
    291  1.1  christos       sec->rawsize = save_rawsize;
    292  1.1  christos       sec->size = save_size;
    293  1.1  christos       sec->compress_status = DECOMPRESS_SECTION_SIZED;
    294  1.1  christos       if (!ret)
    295  1.1  christos 	goto fail_compressed;
    296  1.1  christos 
    297  1.1  christos       if (p == NULL)
    298  1.1  christos 	p = (bfd_byte *) bfd_malloc (sz);
    299  1.1  christos       if (p == NULL)
    300  1.1  christos 	goto fail_compressed;
    301  1.1  christos 
    302  1.5  christos       compression_header_size = bfd_get_compression_header_size (abfd, sec);
    303  1.5  christos       if (compression_header_size == 0)
    304  1.5  christos 	/* Set header size to the zlib header size if it is a
    305  1.5  christos 	   SHF_COMPRESSED section.  */
    306  1.5  christos 	compression_header_size = 12;
    307  1.5  christos       if (!decompress_contents (compressed_buffer + compression_header_size,
    308  1.7  christos 				sec->compressed_size - compression_header_size, p, sz))
    309  1.1  christos 	{
    310  1.1  christos 	  bfd_set_error (bfd_error_bad_value);
    311  1.1  christos 	  if (p != *ptr)
    312  1.1  christos 	    free (p);
    313  1.1  christos 	fail_compressed:
    314  1.1  christos 	  free (compressed_buffer);
    315  1.1  christos 	  return FALSE;
    316  1.1  christos 	}
    317  1.1  christos 
    318  1.1  christos       free (compressed_buffer);
    319  1.1  christos       *ptr = p;
    320  1.1  christos       return TRUE;
    321  1.1  christos 
    322  1.1  christos     case COMPRESS_SECTION_DONE:
    323  1.3  christos       if (sec->contents == NULL)
    324  1.3  christos 	return FALSE;
    325  1.1  christos       if (p == NULL)
    326  1.1  christos 	{
    327  1.1  christos 	  p = (bfd_byte *) bfd_malloc (sz);
    328  1.1  christos 	  if (p == NULL)
    329  1.1  christos 	    return FALSE;
    330  1.1  christos 	  *ptr = p;
    331  1.1  christos 	}
    332  1.3  christos       /* PR 17512; file: 5bc29788.  */
    333  1.3  christos       if (p != sec->contents)
    334  1.3  christos 	memcpy (p, sec->contents, sz);
    335  1.1  christos       return TRUE;
    336  1.1  christos 
    337  1.1  christos     default:
    338  1.1  christos       abort ();
    339  1.1  christos     }
    340  1.1  christos }
    341  1.1  christos 
    342  1.1  christos /*
    343  1.1  christos FUNCTION
    344  1.1  christos 	bfd_cache_section_contents
    345  1.1  christos 
    346  1.1  christos SYNOPSIS
    347  1.1  christos 	void bfd_cache_section_contents
    348  1.1  christos 	  (asection *sec, void *contents);
    349  1.1  christos 
    350  1.1  christos DESCRIPTION
    351  1.1  christos 	Stash @var(contents) so any following reads of @var(sec) do
    352  1.1  christos 	not need to decompress again.
    353  1.1  christos */
    354  1.1  christos 
    355  1.1  christos void
    356  1.1  christos bfd_cache_section_contents (asection *sec, void *contents)
    357  1.1  christos {
    358  1.1  christos   if (sec->compress_status == DECOMPRESS_SECTION_SIZED)
    359  1.1  christos     sec->compress_status = COMPRESS_SECTION_DONE;
    360  1.1  christos   sec->contents = contents;
    361  1.1  christos   sec->flags |= SEC_IN_MEMORY;
    362  1.1  christos }
    363  1.1  christos 
    364  1.1  christos /*
    365  1.1  christos FUNCTION
    366  1.5  christos 	bfd_is_section_compressed_with_header
    367  1.1  christos 
    368  1.1  christos SYNOPSIS
    369  1.5  christos 	bfd_boolean bfd_is_section_compressed_with_header
    370  1.5  christos 	  (bfd *abfd, asection *section,
    371  1.5  christos 	  int *compression_header_size_p,
    372  1.8  christos 	  bfd_size_type *uncompressed_size_p,
    373  1.8  christos 	  unsigned int *uncompressed_alignment_power_p);
    374  1.1  christos 
    375  1.1  christos DESCRIPTION
    376  1.5  christos 	Return @code{TRUE} if @var{section} is compressed.  Compression
    377  1.8  christos 	header size is returned in @var{compression_header_size_p},
    378  1.8  christos 	uncompressed size is returned in @var{uncompressed_size_p}
    379  1.8  christos 	and the uncompressed data alignement power is returned in
    380  1.8  christos 	@var{uncompressed_align_pow_p}.  If compression is
    381  1.8  christos 	unsupported, compression header size is returned with -1
    382  1.8  christos 	and uncompressed size is returned with 0.
    383  1.1  christos */
    384  1.1  christos 
    385  1.1  christos bfd_boolean
    386  1.5  christos bfd_is_section_compressed_with_header (bfd *abfd, sec_ptr sec,
    387  1.5  christos 				       int *compression_header_size_p,
    388  1.8  christos 				       bfd_size_type *uncompressed_size_p,
    389  1.8  christos 				       unsigned int *uncompressed_align_pow_p)
    390  1.1  christos {
    391  1.5  christos   bfd_byte header[MAX_COMPRESSION_HEADER_SIZE];
    392  1.5  christos   int compression_header_size;
    393  1.5  christos   int header_size;
    394  1.1  christos   unsigned int saved = sec->compress_status;
    395  1.1  christos   bfd_boolean compressed;
    396  1.1  christos 
    397  1.8  christos   *uncompressed_align_pow_p = 0;
    398  1.8  christos 
    399  1.5  christos   compression_header_size = bfd_get_compression_header_size (abfd, sec);
    400  1.5  christos   if (compression_header_size > MAX_COMPRESSION_HEADER_SIZE)
    401  1.5  christos     abort ();
    402  1.5  christos   header_size = compression_header_size ? compression_header_size : 12;
    403  1.5  christos 
    404  1.1  christos   /* Don't decompress the section.  */
    405  1.1  christos   sec->compress_status = COMPRESS_SECTION_NONE;
    406  1.1  christos 
    407  1.5  christos   /* Read the header.  */
    408  1.5  christos   if (bfd_get_section_contents (abfd, sec, header, 0, header_size))
    409  1.5  christos     {
    410  1.5  christos       if (compression_header_size == 0)
    411  1.8  christos 	/* In this case, it should be "ZLIB" followed by the uncompressed
    412  1.5  christos 	   section size, 8 bytes in big-endian order.  */
    413  1.5  christos 	compressed = CONST_STRNEQ ((char*) header , "ZLIB");
    414  1.5  christos       else
    415  1.5  christos 	compressed = TRUE;
    416  1.5  christos     }
    417  1.5  christos   else
    418  1.3  christos     compressed = FALSE;
    419  1.3  christos 
    420  1.5  christos   *uncompressed_size_p = sec->size;
    421  1.5  christos   if (compressed)
    422  1.5  christos     {
    423  1.5  christos       if (compression_header_size != 0)
    424  1.5  christos 	{
    425  1.5  christos 	  if (!bfd_check_compression_header (abfd, header, sec,
    426  1.8  christos 					     uncompressed_size_p,
    427  1.8  christos 					     uncompressed_align_pow_p))
    428  1.5  christos 	    compression_header_size = -1;
    429  1.5  christos 	}
    430  1.5  christos       /* Check for the pathalogical case of a debug string section that
    431  1.5  christos 	 contains the string ZLIB.... as the first entry.  We assume that
    432  1.5  christos 	 no uncompressed .debug_str section would ever be big enough to
    433  1.5  christos 	 have the first byte of its (big-endian) size be non-zero.  */
    434  1.5  christos       else if (strcmp (sec->name, ".debug_str") == 0
    435  1.5  christos 	       && ISPRINT (header[4]))
    436  1.5  christos 	compressed = FALSE;
    437  1.5  christos       else
    438  1.5  christos 	*uncompressed_size_p = bfd_getb64 (header + 4);
    439  1.5  christos     }
    440  1.5  christos 
    441  1.1  christos   /* Restore compress_status.  */
    442  1.1  christos   sec->compress_status = saved;
    443  1.5  christos   *compression_header_size_p = compression_header_size;
    444  1.1  christos   return compressed;
    445  1.1  christos }
    446  1.1  christos 
    447  1.1  christos /*
    448  1.1  christos FUNCTION
    449  1.5  christos 	bfd_is_section_compressed
    450  1.5  christos 
    451  1.5  christos SYNOPSIS
    452  1.5  christos 	bfd_boolean bfd_is_section_compressed
    453  1.5  christos 	  (bfd *abfd, asection *section);
    454  1.5  christos 
    455  1.5  christos DESCRIPTION
    456  1.5  christos 	Return @code{TRUE} if @var{section} is compressed.
    457  1.5  christos */
    458  1.5  christos 
    459  1.5  christos bfd_boolean
    460  1.5  christos bfd_is_section_compressed (bfd *abfd, sec_ptr sec)
    461  1.5  christos {
    462  1.5  christos   int compression_header_size;
    463  1.5  christos   bfd_size_type uncompressed_size;
    464  1.8  christos   unsigned int uncompressed_align_power;
    465  1.5  christos   return (bfd_is_section_compressed_with_header (abfd, sec,
    466  1.5  christos 						 &compression_header_size,
    467  1.8  christos 						 &uncompressed_size,
    468  1.8  christos 						 &uncompressed_align_power)
    469  1.5  christos 	  && compression_header_size >= 0
    470  1.5  christos 	  && uncompressed_size > 0);
    471  1.5  christos }
    472  1.5  christos 
    473  1.5  christos /*
    474  1.5  christos FUNCTION
    475  1.1  christos 	bfd_init_section_decompress_status
    476  1.1  christos 
    477  1.1  christos SYNOPSIS
    478  1.1  christos 	bfd_boolean bfd_init_section_decompress_status
    479  1.1  christos 	  (bfd *abfd, asection *section);
    480  1.1  christos 
    481  1.1  christos DESCRIPTION
    482  1.1  christos 	Record compressed section size, update section size with
    483  1.1  christos 	decompressed size and set compress_status to
    484  1.1  christos 	DECOMPRESS_SECTION_SIZED.
    485  1.1  christos 
    486  1.1  christos 	Return @code{FALSE} if the section is not a valid compressed
    487  1.5  christos 	section.  Otherwise, return @code{TRUE}.
    488  1.1  christos */
    489  1.1  christos 
    490  1.1  christos bfd_boolean
    491  1.5  christos bfd_init_section_decompress_status (bfd *abfd, sec_ptr sec)
    492  1.1  christos {
    493  1.5  christos   bfd_byte header[MAX_COMPRESSION_HEADER_SIZE];
    494  1.5  christos   int compression_header_size;
    495  1.5  christos   int header_size;
    496  1.1  christos   bfd_size_type uncompressed_size;
    497  1.8  christos   unsigned int uncompressed_alignment_power = 0;
    498  1.1  christos 
    499  1.5  christos   compression_header_size = bfd_get_compression_header_size (abfd, sec);
    500  1.5  christos   if (compression_header_size > MAX_COMPRESSION_HEADER_SIZE)
    501  1.5  christos     abort ();
    502  1.5  christos   header_size = compression_header_size ? compression_header_size : 12;
    503  1.5  christos 
    504  1.5  christos   /* Read the header.  */
    505  1.1  christos   if (sec->rawsize != 0
    506  1.1  christos       || sec->contents != NULL
    507  1.1  christos       || sec->compress_status != COMPRESS_SECTION_NONE
    508  1.5  christos       || !bfd_get_section_contents (abfd, sec, header, 0, header_size))
    509  1.1  christos     {
    510  1.1  christos       bfd_set_error (bfd_error_invalid_operation);
    511  1.1  christos       return FALSE;
    512  1.1  christos     }
    513  1.1  christos 
    514  1.5  christos   if (compression_header_size == 0)
    515  1.5  christos     {
    516  1.5  christos       /* In this case, it should be "ZLIB" followed by the uncompressed
    517  1.5  christos 	 section size, 8 bytes in big-endian order.  */
    518  1.5  christos       if (! CONST_STRNEQ ((char*) header, "ZLIB"))
    519  1.5  christos 	{
    520  1.5  christos 	  bfd_set_error (bfd_error_wrong_format);
    521  1.5  christos 	  return FALSE;
    522  1.5  christos 	}
    523  1.5  christos       uncompressed_size = bfd_getb64 (header + 4);
    524  1.5  christos     }
    525  1.5  christos   else if (!bfd_check_compression_header (abfd, header, sec,
    526  1.8  christos 					  &uncompressed_size,
    527  1.8  christos 					  &uncompressed_alignment_power))
    528  1.1  christos     {
    529  1.1  christos       bfd_set_error (bfd_error_wrong_format);
    530  1.1  christos       return FALSE;
    531  1.1  christos     }
    532  1.1  christos 
    533  1.1  christos   sec->compressed_size = sec->size;
    534  1.1  christos   sec->size = uncompressed_size;
    535  1.8  christos   bfd_set_section_alignment (abfd, sec, uncompressed_alignment_power);
    536  1.1  christos   sec->compress_status = DECOMPRESS_SECTION_SIZED;
    537  1.1  christos 
    538  1.1  christos   return TRUE;
    539  1.1  christos }
    540  1.1  christos 
    541  1.1  christos /*
    542  1.1  christos FUNCTION
    543  1.1  christos 	bfd_init_section_compress_status
    544  1.1  christos 
    545  1.1  christos SYNOPSIS
    546  1.1  christos 	bfd_boolean bfd_init_section_compress_status
    547  1.1  christos 	  (bfd *abfd, asection *section);
    548  1.1  christos 
    549  1.1  christos DESCRIPTION
    550  1.1  christos 	If open for read, compress section, update section size with
    551  1.1  christos 	compressed size and set compress_status to COMPRESS_SECTION_DONE.
    552  1.1  christos 
    553  1.1  christos 	Return @code{FALSE} if the section is not a valid compressed
    554  1.5  christos 	section.  Otherwise, return @code{TRUE}.
    555  1.1  christos */
    556  1.1  christos 
    557  1.1  christos bfd_boolean
    558  1.5  christos bfd_init_section_compress_status (bfd *abfd, sec_ptr sec)
    559  1.1  christos {
    560  1.1  christos   bfd_size_type uncompressed_size;
    561  1.1  christos   bfd_byte *uncompressed_buffer;
    562  1.1  christos 
    563  1.1  christos   /* Error if not opened for read.  */
    564  1.1  christos   if (abfd->direction != read_direction
    565  1.1  christos       || sec->size == 0
    566  1.1  christos       || sec->rawsize != 0
    567  1.1  christos       || sec->contents != NULL
    568  1.1  christos       || sec->compress_status != COMPRESS_SECTION_NONE)
    569  1.1  christos     {
    570  1.1  christos       bfd_set_error (bfd_error_invalid_operation);
    571  1.1  christos       return FALSE;
    572  1.1  christos     }
    573  1.1  christos 
    574  1.1  christos   /* Read in the full section contents and compress it.  */
    575  1.1  christos   uncompressed_size = sec->size;
    576  1.1  christos   uncompressed_buffer = (bfd_byte *) bfd_malloc (uncompressed_size);
    577  1.8  christos   /* PR 21431 */
    578  1.8  christos   if (uncompressed_buffer == NULL)
    579  1.8  christos     return FALSE;
    580  1.8  christos 
    581  1.1  christos   if (!bfd_get_section_contents (abfd, sec, uncompressed_buffer,
    582  1.1  christos 				 0, uncompressed_size))
    583  1.8  christos     return FALSE;
    584  1.1  christos 
    585  1.8  christos   uncompressed_size = bfd_compress_section_contents (abfd, sec,
    586  1.8  christos 						     uncompressed_buffer,
    587  1.8  christos 						     uncompressed_size);
    588  1.8  christos   return uncompressed_size != 0;
    589  1.5  christos }
    590  1.5  christos 
    591  1.5  christos /*
    592  1.5  christos FUNCTION
    593  1.5  christos 	bfd_compress_section
    594  1.5  christos 
    595  1.5  christos SYNOPSIS
    596  1.5  christos 	bfd_boolean bfd_compress_section
    597  1.5  christos 	  (bfd *abfd, asection *section, bfd_byte *uncompressed_buffer);
    598  1.5  christos 
    599  1.5  christos DESCRIPTION
    600  1.5  christos 	If open for write, compress section, update section size with
    601  1.5  christos 	compressed size and set compress_status to COMPRESS_SECTION_DONE.
    602  1.5  christos 
    603  1.5  christos 	Return @code{FALSE} if compression fail.  Otherwise, return
    604  1.5  christos 	@code{TRUE}.
    605  1.5  christos */
    606  1.5  christos 
    607  1.5  christos bfd_boolean
    608  1.5  christos bfd_compress_section (bfd *abfd, sec_ptr sec, bfd_byte *uncompressed_buffer)
    609  1.5  christos {
    610  1.5  christos   bfd_size_type uncompressed_size = sec->size;
    611  1.5  christos 
    612  1.5  christos   /* Error if not opened for write.  */
    613  1.5  christos   if (abfd->direction != write_direction
    614  1.5  christos       || uncompressed_size == 0
    615  1.5  christos       || uncompressed_buffer == NULL
    616  1.5  christos       || sec->contents != NULL
    617  1.5  christos       || sec->compressed_size != 0
    618  1.5  christos       || sec->compress_status != COMPRESS_SECTION_NONE)
    619  1.5  christos     {
    620  1.5  christos       bfd_set_error (bfd_error_invalid_operation);
    621  1.5  christos       return FALSE;
    622  1.5  christos     }
    623  1.5  christos 
    624  1.5  christos   /* Compress it.  */
    625  1.5  christos   return bfd_compress_section_contents (abfd, sec, uncompressed_buffer,
    626  1.5  christos 					uncompressed_size) != 0;
    627  1.1  christos }
    628