1cf7f2e2dSJohn Marino /* Compressed section support (intended for debug sections). 2*a45ae5f8SJohn Marino Copyright 2008, 2010, 2011 35796c8dcSSimon Schubert Free Software Foundation, Inc. 45796c8dcSSimon Schubert 55796c8dcSSimon Schubert This file is part of BFD, the Binary File Descriptor library. 65796c8dcSSimon Schubert 75796c8dcSSimon Schubert This program is free software; you can redistribute it and/or modify 85796c8dcSSimon Schubert it under the terms of the GNU General Public License as published by 95796c8dcSSimon Schubert the Free Software Foundation; either version 3 of the License, or 105796c8dcSSimon Schubert (at your option) any later version. 115796c8dcSSimon Schubert 125796c8dcSSimon Schubert This program is distributed in the hope that it will be useful, 135796c8dcSSimon Schubert but WITHOUT ANY WARRANTY; without even the implied warranty of 145796c8dcSSimon Schubert MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 155796c8dcSSimon Schubert GNU General Public License for more details. 165796c8dcSSimon Schubert 175796c8dcSSimon Schubert You should have received a copy of the GNU General Public License 185796c8dcSSimon Schubert along with this program; if not, write to the Free Software 195796c8dcSSimon Schubert Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, 205796c8dcSSimon Schubert MA 02110-1301, USA. */ 215796c8dcSSimon Schubert 225796c8dcSSimon Schubert #include "config.h" 235796c8dcSSimon Schubert #include "sysdep.h" 245796c8dcSSimon Schubert #include "bfd.h" 255796c8dcSSimon Schubert #include "libbfd.h" 265796c8dcSSimon Schubert #ifdef HAVE_ZLIB_H 275796c8dcSSimon Schubert #include <zlib.h> 285796c8dcSSimon Schubert #endif 295796c8dcSSimon Schubert 30c50c785cSJohn Marino #ifdef HAVE_ZLIB_H 31c50c785cSJohn Marino static bfd_boolean 32c50c785cSJohn Marino decompress_contents (bfd_byte *compressed_buffer, 33c50c785cSJohn Marino bfd_size_type compressed_size, 34c50c785cSJohn Marino bfd_byte *uncompressed_buffer, 35c50c785cSJohn Marino bfd_size_type uncompressed_size) 36c50c785cSJohn Marino { 37c50c785cSJohn Marino z_stream strm; 38c50c785cSJohn Marino int rc; 39c50c785cSJohn Marino 40c50c785cSJohn Marino /* It is possible the section consists of several compressed 41c50c785cSJohn Marino buffers concatenated together, so we uncompress in a loop. */ 42c50c785cSJohn Marino strm.zalloc = NULL; 43c50c785cSJohn Marino strm.zfree = NULL; 44c50c785cSJohn Marino strm.opaque = NULL; 45c50c785cSJohn Marino strm.avail_in = compressed_size - 12; 46c50c785cSJohn Marino strm.next_in = (Bytef*) compressed_buffer + 12; 47c50c785cSJohn Marino strm.avail_out = uncompressed_size; 48c50c785cSJohn Marino 49c50c785cSJohn Marino rc = inflateInit (&strm); 50c50c785cSJohn Marino while (strm.avail_in > 0) 51c50c785cSJohn Marino { 52c50c785cSJohn Marino if (rc != Z_OK) 53c50c785cSJohn Marino return FALSE; 54c50c785cSJohn Marino strm.next_out = ((Bytef*) uncompressed_buffer 55c50c785cSJohn Marino + (uncompressed_size - strm.avail_out)); 56c50c785cSJohn Marino rc = inflate (&strm, Z_FINISH); 57c50c785cSJohn Marino if (rc != Z_STREAM_END) 58c50c785cSJohn Marino return FALSE; 59c50c785cSJohn Marino rc = inflateReset (&strm); 60c50c785cSJohn Marino } 61c50c785cSJohn Marino rc = inflateEnd (&strm); 62c50c785cSJohn Marino return rc == Z_OK && strm.avail_out == 0; 63c50c785cSJohn Marino } 64c50c785cSJohn Marino #endif 65c50c785cSJohn Marino 665796c8dcSSimon Schubert /* 675796c8dcSSimon Schubert FUNCTION 68c50c785cSJohn Marino bfd_compress_section_contents 695796c8dcSSimon Schubert 705796c8dcSSimon Schubert SYNOPSIS 71c50c785cSJohn Marino bfd_boolean bfd_compress_section_contents 72c50c785cSJohn Marino (bfd *abfd, asection *section, bfd_byte *uncompressed_buffer, 73c50c785cSJohn Marino bfd_size_type uncompressed_size); 745796c8dcSSimon Schubert 755796c8dcSSimon Schubert DESCRIPTION 765796c8dcSSimon Schubert 77c50c785cSJohn Marino Compress data of the size specified in @var{uncompressed_size} 78c50c785cSJohn Marino and pointed to by @var{uncompressed_buffer} using zlib and store 79c50c785cSJohn Marino as the contents field. This function assumes the contents 80c50c785cSJohn Marino field was allocated using bfd_malloc() or equivalent. If zlib 81c50c785cSJohn Marino is not installed on this machine, the input is unmodified. 825796c8dcSSimon Schubert 83c50c785cSJohn Marino Return @code{TRUE} if the full section contents is compressed 84c50c785cSJohn Marino successfully. 855796c8dcSSimon Schubert */ 865796c8dcSSimon Schubert 875796c8dcSSimon Schubert bfd_boolean 88c50c785cSJohn Marino bfd_compress_section_contents (bfd *abfd ATTRIBUTE_UNUSED, 89c50c785cSJohn Marino sec_ptr sec ATTRIBUTE_UNUSED, 90c50c785cSJohn Marino bfd_byte *uncompressed_buffer ATTRIBUTE_UNUSED, 91c50c785cSJohn Marino bfd_size_type uncompressed_size ATTRIBUTE_UNUSED) 925796c8dcSSimon Schubert { 935796c8dcSSimon Schubert #ifndef HAVE_ZLIB_H 94c50c785cSJohn Marino bfd_set_error (bfd_error_invalid_operation); 955796c8dcSSimon Schubert return FALSE; 965796c8dcSSimon Schubert #else 97c50c785cSJohn Marino uLong compressed_size; 98c50c785cSJohn Marino bfd_byte *compressed_buffer; 99c50c785cSJohn Marino 100c50c785cSJohn Marino compressed_size = compressBound (uncompressed_size) + 12; 101c50c785cSJohn Marino compressed_buffer = (bfd_byte *) bfd_malloc (compressed_size); 102c50c785cSJohn Marino 103c50c785cSJohn Marino if (compressed_buffer == NULL) 104c50c785cSJohn Marino return FALSE; 105c50c785cSJohn Marino 106c50c785cSJohn Marino if (compress ((Bytef*) compressed_buffer + 12, 107c50c785cSJohn Marino &compressed_size, 108c50c785cSJohn Marino (const Bytef*) uncompressed_buffer, 109c50c785cSJohn Marino uncompressed_size) != Z_OK) 110c50c785cSJohn Marino { 111c50c785cSJohn Marino free (compressed_buffer); 112c50c785cSJohn Marino bfd_set_error (bfd_error_bad_value); 113c50c785cSJohn Marino return FALSE; 114c50c785cSJohn Marino } 115c50c785cSJohn Marino 116c50c785cSJohn Marino /* Write the zlib header. In this case, it should be "ZLIB" followed 117c50c785cSJohn Marino by the uncompressed section size, 8 bytes in big-endian order. */ 118c50c785cSJohn Marino memcpy (compressed_buffer, "ZLIB", 4); 119c50c785cSJohn Marino compressed_buffer[11] = uncompressed_size; uncompressed_size >>= 8; 120c50c785cSJohn Marino compressed_buffer[10] = uncompressed_size; uncompressed_size >>= 8; 121c50c785cSJohn Marino compressed_buffer[9] = uncompressed_size; uncompressed_size >>= 8; 122c50c785cSJohn Marino compressed_buffer[8] = uncompressed_size; uncompressed_size >>= 8; 123c50c785cSJohn Marino compressed_buffer[7] = uncompressed_size; uncompressed_size >>= 8; 124c50c785cSJohn Marino compressed_buffer[6] = uncompressed_size; uncompressed_size >>= 8; 125c50c785cSJohn Marino compressed_buffer[5] = uncompressed_size; uncompressed_size >>= 8; 126c50c785cSJohn Marino compressed_buffer[4] = uncompressed_size; 127c50c785cSJohn Marino compressed_size += 12; 128c50c785cSJohn Marino 129c50c785cSJohn Marino /* Free the uncompressed contents if we compress in place. */ 130c50c785cSJohn Marino if (uncompressed_buffer == sec->contents) 131c50c785cSJohn Marino free (uncompressed_buffer); 132c50c785cSJohn Marino 133c50c785cSJohn Marino sec->contents = compressed_buffer; 134c50c785cSJohn Marino sec->size = compressed_size; 135c50c785cSJohn Marino sec->compress_status = COMPRESS_SECTION_DONE; 136c50c785cSJohn Marino 137c50c785cSJohn Marino return TRUE; 138c50c785cSJohn Marino #endif /* HAVE_ZLIB_H */ 139c50c785cSJohn Marino } 140c50c785cSJohn Marino 141c50c785cSJohn Marino /* 142c50c785cSJohn Marino FUNCTION 143c50c785cSJohn Marino bfd_get_full_section_contents 144c50c785cSJohn Marino 145c50c785cSJohn Marino SYNOPSIS 146c50c785cSJohn Marino bfd_boolean bfd_get_full_section_contents 147c50c785cSJohn Marino (bfd *abfd, asection *section, bfd_byte **ptr); 148c50c785cSJohn Marino 149c50c785cSJohn Marino DESCRIPTION 150c50c785cSJohn Marino Read all data from @var{section} in BFD @var{abfd}, decompress 151c50c785cSJohn Marino if needed, and store in @var{*ptr}. If @var{*ptr} is NULL, 152c50c785cSJohn Marino return @var{*ptr} with memory malloc'd by this function. 153c50c785cSJohn Marino 154c50c785cSJohn Marino Return @code{TRUE} if the full section contents is retrieved 155c50c785cSJohn Marino successfully. 156c50c785cSJohn Marino */ 157c50c785cSJohn Marino 158c50c785cSJohn Marino bfd_boolean 159c50c785cSJohn Marino bfd_get_full_section_contents (bfd *abfd, sec_ptr sec, bfd_byte **ptr) 160c50c785cSJohn Marino { 161*a45ae5f8SJohn Marino bfd_size_type sz; 162c50c785cSJohn Marino bfd_byte *p = *ptr; 163c50c785cSJohn Marino #ifdef HAVE_ZLIB_H 164c50c785cSJohn Marino bfd_boolean ret; 165c50c785cSJohn Marino bfd_size_type compressed_size; 1665796c8dcSSimon Schubert bfd_size_type uncompressed_size; 167c50c785cSJohn Marino bfd_size_type rawsize; 168c50c785cSJohn Marino bfd_byte *compressed_buffer; 1695796c8dcSSimon Schubert bfd_byte *uncompressed_buffer; 170c50c785cSJohn Marino #endif 171c50c785cSJohn Marino 172*a45ae5f8SJohn Marino if (abfd->direction != write_direction && sec->rawsize != 0) 173*a45ae5f8SJohn Marino sz = sec->rawsize; 174*a45ae5f8SJohn Marino else 175*a45ae5f8SJohn Marino sz = sec->size; 176c50c785cSJohn Marino if (sz == 0) 177c50c785cSJohn Marino return TRUE; 178c50c785cSJohn Marino 179c50c785cSJohn Marino switch (sec->compress_status) 180c50c785cSJohn Marino { 181c50c785cSJohn Marino case COMPRESS_SECTION_NONE: 182c50c785cSJohn Marino if (p == NULL) 183c50c785cSJohn Marino { 184c50c785cSJohn Marino p = (bfd_byte *) bfd_malloc (sz); 185c50c785cSJohn Marino if (p == NULL) 186c50c785cSJohn Marino return FALSE; 187c50c785cSJohn Marino } 188c50c785cSJohn Marino if (!bfd_get_section_contents (abfd, sec, p, 0, sz)) 189c50c785cSJohn Marino { 190c50c785cSJohn Marino if (*ptr != p) 191c50c785cSJohn Marino free (p); 192c50c785cSJohn Marino return FALSE; 193c50c785cSJohn Marino } 194c50c785cSJohn Marino *ptr = p; 195c50c785cSJohn Marino return TRUE; 196c50c785cSJohn Marino 197c50c785cSJohn Marino case DECOMPRESS_SECTION_SIZED: 198c50c785cSJohn Marino #ifndef HAVE_ZLIB_H 199c50c785cSJohn Marino bfd_set_error (bfd_error_invalid_operation); 200c50c785cSJohn Marino return FALSE; 201c50c785cSJohn Marino #else 202c50c785cSJohn Marino /* Read in the full compressed section contents. */ 203c50c785cSJohn Marino uncompressed_size = sec->size; 204c50c785cSJohn Marino compressed_size = sec->compressed_size; 205c50c785cSJohn Marino compressed_buffer = (bfd_byte *) bfd_malloc (compressed_size); 206c50c785cSJohn Marino if (compressed_buffer == NULL) 207c50c785cSJohn Marino return FALSE; 208c50c785cSJohn Marino rawsize = sec->rawsize; 209c50c785cSJohn Marino /* Clear rawsize, set size to compressed size and set compress_status 210c50c785cSJohn Marino to COMPRESS_SECTION_NONE. If the compressed size is bigger than 211c50c785cSJohn Marino the uncompressed size, bfd_get_section_contents will fail. */ 212c50c785cSJohn Marino sec->rawsize = 0; 213c50c785cSJohn Marino sec->size = compressed_size; 214c50c785cSJohn Marino sec->compress_status = COMPRESS_SECTION_NONE; 215c50c785cSJohn Marino ret = bfd_get_section_contents (abfd, sec, compressed_buffer, 216c50c785cSJohn Marino 0, compressed_size); 217c50c785cSJohn Marino /* Restore rawsize and size. */ 218c50c785cSJohn Marino sec->rawsize = rawsize; 219c50c785cSJohn Marino sec->size = uncompressed_size; 220c50c785cSJohn Marino sec->compress_status = DECOMPRESS_SECTION_SIZED; 221c50c785cSJohn Marino if (!ret) 222c50c785cSJohn Marino goto fail_compressed; 223c50c785cSJohn Marino 224c50c785cSJohn Marino uncompressed_buffer = (bfd_byte *) bfd_malloc (uncompressed_size); 225c50c785cSJohn Marino if (uncompressed_buffer == NULL) 226c50c785cSJohn Marino goto fail_compressed; 227c50c785cSJohn Marino 228c50c785cSJohn Marino if (!decompress_contents (compressed_buffer, compressed_size, 229c50c785cSJohn Marino uncompressed_buffer, uncompressed_size)) 230c50c785cSJohn Marino { 231c50c785cSJohn Marino bfd_set_error (bfd_error_bad_value); 232c50c785cSJohn Marino free (uncompressed_buffer); 233c50c785cSJohn Marino fail_compressed: 234c50c785cSJohn Marino free (compressed_buffer); 235c50c785cSJohn Marino return FALSE; 236c50c785cSJohn Marino } 237c50c785cSJohn Marino 238c50c785cSJohn Marino free (compressed_buffer); 239c50c785cSJohn Marino sec->contents = uncompressed_buffer; 240c50c785cSJohn Marino sec->compress_status = COMPRESS_SECTION_DONE; 241c50c785cSJohn Marino /* Fall thru */ 242c50c785cSJohn Marino #endif 243c50c785cSJohn Marino 244c50c785cSJohn Marino case COMPRESS_SECTION_DONE: 245c50c785cSJohn Marino if (p == NULL) 246c50c785cSJohn Marino { 247c50c785cSJohn Marino p = (bfd_byte *) bfd_malloc (sz); 248c50c785cSJohn Marino if (p == NULL) 249c50c785cSJohn Marino return FALSE; 250c50c785cSJohn Marino *ptr = p; 251c50c785cSJohn Marino } 252c50c785cSJohn Marino memcpy (p, sec->contents, sz); 253c50c785cSJohn Marino return TRUE; 254c50c785cSJohn Marino 255c50c785cSJohn Marino default: 256c50c785cSJohn Marino abort (); 257c50c785cSJohn Marino } 258c50c785cSJohn Marino } 259c50c785cSJohn Marino 260c50c785cSJohn Marino /* 261c50c785cSJohn Marino FUNCTION 262c50c785cSJohn Marino bfd_is_section_compressed 263c50c785cSJohn Marino 264c50c785cSJohn Marino SYNOPSIS 265c50c785cSJohn Marino bfd_boolean bfd_is_section_compressed 266c50c785cSJohn Marino (bfd *abfd, asection *section); 267c50c785cSJohn Marino 268c50c785cSJohn Marino DESCRIPTION 269c50c785cSJohn Marino Return @code{TRUE} if @var{section} is compressed. 270c50c785cSJohn Marino */ 271c50c785cSJohn Marino 272c50c785cSJohn Marino bfd_boolean 273c50c785cSJohn Marino bfd_is_section_compressed (bfd *abfd, sec_ptr sec) 274c50c785cSJohn Marino { 275c50c785cSJohn Marino bfd_byte compressed_buffer [12]; 2765796c8dcSSimon Schubert 2775796c8dcSSimon Schubert /* Read the zlib header. In this case, it should be "ZLIB" followed 2785796c8dcSSimon Schubert by the uncompressed section size, 8 bytes in big-endian order. */ 279c50c785cSJohn Marino return (bfd_get_section_contents (abfd, sec, compressed_buffer, 0, 12) 280c50c785cSJohn Marino && CONST_STRNEQ ((char*) compressed_buffer, "ZLIB")); 281c50c785cSJohn Marino } 282c50c785cSJohn Marino 283c50c785cSJohn Marino /* 284c50c785cSJohn Marino FUNCTION 285c50c785cSJohn Marino bfd_init_section_decompress_status 286c50c785cSJohn Marino 287c50c785cSJohn Marino SYNOPSIS 288c50c785cSJohn Marino bfd_boolean bfd_init_section_decompress_status 289c50c785cSJohn Marino (bfd *abfd, asection *section); 290c50c785cSJohn Marino 291c50c785cSJohn Marino DESCRIPTION 292c50c785cSJohn Marino Record compressed section size, update section size with 293c50c785cSJohn Marino decompressed size and set compress_status to 294c50c785cSJohn Marino DECOMPRESS_SECTION_SIZED. 295c50c785cSJohn Marino 296c50c785cSJohn Marino Return @code{FALSE} if the section is not a valid compressed 297c50c785cSJohn Marino section or zlib is not installed on this machine. Otherwise, 298c50c785cSJohn Marino return @code{TRUE}. 299c50c785cSJohn Marino */ 300c50c785cSJohn Marino 301c50c785cSJohn Marino bfd_boolean 302c50c785cSJohn Marino bfd_init_section_decompress_status (bfd *abfd ATTRIBUTE_UNUSED, 303c50c785cSJohn Marino sec_ptr sec ATTRIBUTE_UNUSED) 304c50c785cSJohn Marino { 305c50c785cSJohn Marino #ifndef HAVE_ZLIB_H 306c50c785cSJohn Marino bfd_set_error (bfd_error_invalid_operation); 3075796c8dcSSimon Schubert return FALSE; 308c50c785cSJohn Marino #else 309c50c785cSJohn Marino bfd_byte compressed_buffer [12]; 310c50c785cSJohn Marino bfd_size_type uncompressed_size; 311c50c785cSJohn Marino 312c50c785cSJohn Marino if (sec->rawsize != 0 313c50c785cSJohn Marino || sec->contents != NULL 314c50c785cSJohn Marino || sec->compress_status != COMPRESS_SECTION_NONE 315c50c785cSJohn Marino || !bfd_get_section_contents (abfd, sec, compressed_buffer, 0, 12)) 316c50c785cSJohn Marino { 317c50c785cSJohn Marino bfd_set_error (bfd_error_invalid_operation); 318c50c785cSJohn Marino return FALSE; 319c50c785cSJohn Marino } 320c50c785cSJohn Marino 321c50c785cSJohn Marino /* Read the zlib header. In this case, it should be "ZLIB" followed 322c50c785cSJohn Marino by the uncompressed section size, 8 bytes in big-endian order. */ 323c50c785cSJohn Marino if (! CONST_STRNEQ ((char*) compressed_buffer, "ZLIB")) 324c50c785cSJohn Marino { 325c50c785cSJohn Marino bfd_set_error (bfd_error_wrong_format); 326c50c785cSJohn Marino return FALSE; 327c50c785cSJohn Marino } 328c50c785cSJohn Marino 3295796c8dcSSimon Schubert uncompressed_size = compressed_buffer[4]; uncompressed_size <<= 8; 3305796c8dcSSimon Schubert uncompressed_size += compressed_buffer[5]; uncompressed_size <<= 8; 3315796c8dcSSimon Schubert uncompressed_size += compressed_buffer[6]; uncompressed_size <<= 8; 3325796c8dcSSimon Schubert uncompressed_size += compressed_buffer[7]; uncompressed_size <<= 8; 3335796c8dcSSimon Schubert uncompressed_size += compressed_buffer[8]; uncompressed_size <<= 8; 3345796c8dcSSimon Schubert uncompressed_size += compressed_buffer[9]; uncompressed_size <<= 8; 3355796c8dcSSimon Schubert uncompressed_size += compressed_buffer[10]; uncompressed_size <<= 8; 3365796c8dcSSimon Schubert uncompressed_size += compressed_buffer[11]; 3375796c8dcSSimon Schubert 338c50c785cSJohn Marino sec->compressed_size = sec->size; 339c50c785cSJohn Marino sec->size = uncompressed_size; 340c50c785cSJohn Marino sec->compress_status = DECOMPRESS_SECTION_SIZED; 3415796c8dcSSimon Schubert 3425796c8dcSSimon Schubert return TRUE; 343c50c785cSJohn Marino #endif 344c50c785cSJohn Marino } 3455796c8dcSSimon Schubert 346c50c785cSJohn Marino /* 347c50c785cSJohn Marino FUNCTION 348c50c785cSJohn Marino bfd_init_section_compress_status 349c50c785cSJohn Marino 350c50c785cSJohn Marino SYNOPSIS 351c50c785cSJohn Marino bfd_boolean bfd_init_section_compress_status 352c50c785cSJohn Marino (bfd *abfd, asection *section); 353c50c785cSJohn Marino 354c50c785cSJohn Marino DESCRIPTION 355c50c785cSJohn Marino If open for read, compress section, update section size with 356c50c785cSJohn Marino compressed size and set compress_status to COMPRESS_SECTION_DONE. 357c50c785cSJohn Marino 358c50c785cSJohn Marino Return @code{FALSE} if the section is not a valid compressed 359c50c785cSJohn Marino section or zlib is not installed on this machine. Otherwise, 360c50c785cSJohn Marino return @code{TRUE}. 361c50c785cSJohn Marino */ 362c50c785cSJohn Marino 363c50c785cSJohn Marino bfd_boolean 364c50c785cSJohn Marino bfd_init_section_compress_status (bfd *abfd ATTRIBUTE_UNUSED, 365c50c785cSJohn Marino sec_ptr sec ATTRIBUTE_UNUSED) 366c50c785cSJohn Marino { 367c50c785cSJohn Marino #ifndef HAVE_ZLIB_H 368c50c785cSJohn Marino bfd_set_error (bfd_error_invalid_operation); 3695796c8dcSSimon Schubert return FALSE; 370c50c785cSJohn Marino #else 371c50c785cSJohn Marino bfd_size_type uncompressed_size; 372c50c785cSJohn Marino bfd_byte *uncompressed_buffer; 373c50c785cSJohn Marino bfd_boolean ret; 374c50c785cSJohn Marino 375c50c785cSJohn Marino /* Error if not opened for read. */ 376c50c785cSJohn Marino if (abfd->direction != read_direction 377c50c785cSJohn Marino || sec->size == 0 378c50c785cSJohn Marino || sec->rawsize != 0 379c50c785cSJohn Marino || sec->contents != NULL 380c50c785cSJohn Marino || sec->compress_status != COMPRESS_SECTION_NONE) 381c50c785cSJohn Marino { 382c50c785cSJohn Marino bfd_set_error (bfd_error_invalid_operation); 383c50c785cSJohn Marino return FALSE; 384c50c785cSJohn Marino } 385c50c785cSJohn Marino 386c50c785cSJohn Marino /* Read in the full section contents and compress it. */ 387c50c785cSJohn Marino uncompressed_size = sec->size; 388c50c785cSJohn Marino uncompressed_buffer = (bfd_byte *) bfd_malloc (uncompressed_size); 389c50c785cSJohn Marino if (!bfd_get_section_contents (abfd, sec, uncompressed_buffer, 390c50c785cSJohn Marino 0, uncompressed_size)) 391c50c785cSJohn Marino ret = FALSE; 392c50c785cSJohn Marino else 393c50c785cSJohn Marino ret = bfd_compress_section_contents (abfd, sec, 394c50c785cSJohn Marino uncompressed_buffer, 395c50c785cSJohn Marino uncompressed_size); 396c50c785cSJohn Marino 397c50c785cSJohn Marino free (uncompressed_buffer); 398c50c785cSJohn Marino return ret; 399c50c785cSJohn Marino #endif 4005796c8dcSSimon Schubert } 401