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