x86: add missing pseudo ops for VPCLMULQDQ ISA extension
[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
256 /* The MMO file format supports its own special compression
257 technique, but it uses COMPRESS_SECTION_NONE when loading
258 a section's contents. */
259 && bfd_get_flavour (abfd) != bfd_target_mmo_flavour)
260 {
261 /* PR 24708: Avoid attempts to allocate a ridiculous amount
262 of memory. */
263 bfd_set_error (bfd_error_no_memory);
264 _bfd_error_handler
265 /* xgettext:c-format */
266 (_("error: %pB(%pA) section size (%#" PRIx64 " bytes) is larger than file size (%#" PRIx64 " bytes)"),
267 abfd, sec, (uint64_t) sz, (uint64_t) filesize);
268 return FALSE;
269 }
0d13c96b 270 p = (bfd_byte *) bfd_malloc (sz);
4a114e3e 271 if (p == NULL)
a18590c3
NC
272 {
273 /* PR 20801: Provide a more helpful error message. */
274 if (bfd_get_error () == bfd_error_no_memory)
275 _bfd_error_handler
276 /* xgettext:c-format */
2dcf00ce
AM
277 (_("error: %pB(%pA) is too large (%#" PRIx64 " bytes)"),
278 abfd, sec, (uint64_t) sz);
0630b49c 279 return FALSE;
a18590c3 280 }
4a114e3e 281 }
06614111 282
82c6068a
AM
283 if (!bfd_get_section_contents (abfd, sec, p, 0, sz))
284 {
285 if (*ptr != p)
286 free (p);
287 return FALSE;
288 }
289 *ptr = p;
4a114e3e
L
290 return TRUE;
291
292 case DECOMPRESS_SECTION_SIZED:
82c6068a 293 /* Read in the full compressed section contents. */
38b774d2 294 compressed_buffer = (bfd_byte *) bfd_malloc (sec->compressed_size);
82c6068a
AM
295 if (compressed_buffer == NULL)
296 return FALSE;
38b774d2
AM
297 save_rawsize = sec->rawsize;
298 save_size = sec->size;
82c6068a
AM
299 /* Clear rawsize, set size to compressed size and set compress_status
300 to COMPRESS_SECTION_NONE. If the compressed size is bigger than
301 the uncompressed size, bfd_get_section_contents will fail. */
302 sec->rawsize = 0;
38b774d2 303 sec->size = sec->compressed_size;
82c6068a
AM
304 sec->compress_status = COMPRESS_SECTION_NONE;
305 ret = bfd_get_section_contents (abfd, sec, compressed_buffer,
38b774d2 306 0, sec->compressed_size);
82c6068a 307 /* Restore rawsize and size. */
38b774d2
AM
308 sec->rawsize = save_rawsize;
309 sec->size = save_size;
4a114e3e 310 sec->compress_status = DECOMPRESS_SECTION_SIZED;
82c6068a
AM
311 if (!ret)
312 goto fail_compressed;
4a114e3e 313
38b774d2
AM
314 if (p == NULL)
315 p = (bfd_byte *) bfd_malloc (sz);
316 if (p == NULL)
4a114e3e 317 goto fail_compressed;
4a114e3e 318
151411f8 319 compression_header_size = bfd_get_compression_header_size (abfd, sec);
dab394de
L
320 if (compression_header_size == 0)
321 /* Set header size to the zlib header size if it is a
322 SHF_COMPRESSED section. */
323 compression_header_size = 12;
151411f8 324 if (!decompress_contents (compressed_buffer + compression_header_size,
6438d1be 325 sec->compressed_size - compression_header_size, p, sz))
82c6068a
AM
326 {
327 bfd_set_error (bfd_error_bad_value);
38b774d2
AM
328 if (p != *ptr)
329 free (p);
82c6068a
AM
330 fail_compressed:
331 free (compressed_buffer);
332 return FALSE;
333 }
4a114e3e 334
82c6068a 335 free (compressed_buffer);
38b774d2
AM
336 *ptr = p;
337 return TRUE;
4a114e3e 338
82c6068a 339 case COMPRESS_SECTION_DONE:
db6b071a
NC
340 if (sec->contents == NULL)
341 return FALSE;
82c6068a
AM
342 if (p == NULL)
343 {
344 p = (bfd_byte *) bfd_malloc (sz);
345 if (p == NULL)
346 return FALSE;
347 *ptr = p;
348 }
06614111
NC
349 /* PR 17512; file: 5bc29788. */
350 if (p != sec->contents)
351 memcpy (p, sec->contents, sz);
82c6068a 352 return TRUE;
4a114e3e 353
82c6068a
AM
354 default:
355 abort ();
356 }
4a114e3e
L
357}
358
8a72cc6e
AM
359/*
360FUNCTION
361 bfd_cache_section_contents
362
363SYNOPSIS
364 void bfd_cache_section_contents
365 (asection *sec, void *contents);
366
367DESCRIPTION
368 Stash @var(contents) so any following reads of @var(sec) do
369 not need to decompress again.
370*/
371
372void
373bfd_cache_section_contents (asection *sec, void *contents)
374{
375 if (sec->compress_status == DECOMPRESS_SECTION_SIZED)
376 sec->compress_status = COMPRESS_SECTION_DONE;
377 sec->contents = contents;
378 sec->flags |= SEC_IN_MEMORY;
379}
380
4a114e3e
L
381/*
382FUNCTION
151411f8 383 bfd_is_section_compressed_with_header
4a114e3e
L
384
385SYNOPSIS
151411f8
L
386 bfd_boolean bfd_is_section_compressed_with_header
387 (bfd *abfd, asection *section,
dab394de 388 int *compression_header_size_p,
4207142d
MW
389 bfd_size_type *uncompressed_size_p,
390 unsigned int *uncompressed_alignment_power_p);
4a114e3e
L
391
392DESCRIPTION
151411f8 393 Return @code{TRUE} if @var{section} is compressed. Compression
4207142d
MW
394 header size is returned in @var{compression_header_size_p},
395 uncompressed size is returned in @var{uncompressed_size_p}
396 and the uncompressed data alignement power is returned in
397 @var{uncompressed_align_pow_p}. If compression is
398 unsupported, compression header size is returned with -1
399 and uncompressed size is returned with 0.
4a114e3e
L
400*/
401
402bfd_boolean
151411f8 403bfd_is_section_compressed_with_header (bfd *abfd, sec_ptr sec,
dab394de 404 int *compression_header_size_p,
4207142d
MW
405 bfd_size_type *uncompressed_size_p,
406 unsigned int *uncompressed_align_pow_p)
4a114e3e 407{
dab394de 408 bfd_byte header[MAX_COMPRESSION_HEADER_SIZE];
151411f8 409 int compression_header_size;
dab394de 410 int header_size;
64f40162
L
411 unsigned int saved = sec->compress_status;
412 bfd_boolean compressed;
413
131a5a64
L
414 *uncompressed_align_pow_p = 0;
415
151411f8
L
416 compression_header_size = bfd_get_compression_header_size (abfd, sec);
417 if (compression_header_size > MAX_COMPRESSION_HEADER_SIZE)
418 abort ();
dab394de 419 header_size = compression_header_size ? compression_header_size : 12;
151411f8 420
64f40162
L
421 /* Don't decompress the section. */
422 sec->compress_status = COMPRESS_SECTION_NONE;
4a114e3e 423
dab394de
L
424 /* Read the header. */
425 if (bfd_get_section_contents (abfd, sec, header, 0, header_size))
426 {
427 if (compression_header_size == 0)
07d6d2b8 428 /* In this case, it should be "ZLIB" followed by the uncompressed
dab394de
L
429 section size, 8 bytes in big-endian order. */
430 compressed = CONST_STRNEQ ((char*) header , "ZLIB");
431 else
432 compressed = TRUE;
433 }
434 else
435 compressed = FALSE;
64f40162 436
dab394de 437 *uncompressed_size_p = sec->size;
151411f8
L
438 if (compressed)
439 {
440 if (compression_header_size != 0)
441 {
151411f8 442 if (!bfd_check_compression_header (abfd, header, sec,
4207142d
MW
443 uncompressed_size_p,
444 uncompressed_align_pow_p))
151411f8
L
445 compression_header_size = -1;
446 }
447 /* Check for the pathalogical case of a debug string section that
448 contains the string ZLIB.... as the first entry. We assume that
449 no uncompressed .debug_str section would ever be big enough to
450 have the first byte of its (big-endian) size be non-zero. */
451 else if (strcmp (sec->name, ".debug_str") == 0
dab394de 452 && ISPRINT (header[4]))
151411f8 453 compressed = FALSE;
dab394de
L
454 else
455 *uncompressed_size_p = bfd_getb64 (header + 4);
151411f8 456 }
a953eec9 457
64f40162
L
458 /* Restore compress_status. */
459 sec->compress_status = saved;
151411f8 460 *compression_header_size_p = compression_header_size;
64f40162 461 return compressed;
4a114e3e
L
462}
463
151411f8
L
464/*
465FUNCTION
466 bfd_is_section_compressed
467
468SYNOPSIS
469 bfd_boolean bfd_is_section_compressed
470 (bfd *abfd, asection *section);
471
472DESCRIPTION
473 Return @code{TRUE} if @var{section} is compressed.
474*/
475
476bfd_boolean
477bfd_is_section_compressed (bfd *abfd, sec_ptr sec)
478{
479 int compression_header_size;
dab394de 480 bfd_size_type uncompressed_size;
4207142d 481 unsigned int uncompressed_align_power;
151411f8 482 return (bfd_is_section_compressed_with_header (abfd, sec,
dab394de 483 &compression_header_size,
4207142d
MW
484 &uncompressed_size,
485 &uncompressed_align_power)
dab394de
L
486 && compression_header_size >= 0
487 && uncompressed_size > 0);
151411f8
L
488}
489
4a114e3e
L
490/*
491FUNCTION
492 bfd_init_section_decompress_status
493
494SYNOPSIS
495 bfd_boolean bfd_init_section_decompress_status
496 (bfd *abfd, asection *section);
497
498DESCRIPTION
499 Record compressed section size, update section size with
500 decompressed size and set compress_status to
501 DECOMPRESS_SECTION_SIZED.
502
503 Return @code{FALSE} if the section is not a valid compressed
18ece1de 504 section. Otherwise, return @code{TRUE}.
4a114e3e
L
505*/
506
507bfd_boolean
243340ad 508bfd_init_section_decompress_status (bfd *abfd, sec_ptr sec)
4a114e3e 509{
dab394de 510 bfd_byte header[MAX_COMPRESSION_HEADER_SIZE];
151411f8 511 int compression_header_size;
dab394de 512 int header_size;
4a114e3e 513 bfd_size_type uncompressed_size;
4207142d 514 unsigned int uncompressed_alignment_power = 0;
4a114e3e 515
151411f8
L
516 compression_header_size = bfd_get_compression_header_size (abfd, sec);
517 if (compression_header_size > MAX_COMPRESSION_HEADER_SIZE)
518 abort ();
dab394de 519 header_size = compression_header_size ? compression_header_size : 12;
151411f8 520
dab394de 521 /* Read the header. */
4a114e3e
L
522 if (sec->rawsize != 0
523 || sec->contents != NULL
524 || sec->compress_status != COMPRESS_SECTION_NONE
151411f8 525 || !bfd_get_section_contents (abfd, sec, header, 0, header_size))
4a114e3e
L
526 {
527 bfd_set_error (bfd_error_invalid_operation);
528 return FALSE;
529 }
1b315056 530
dab394de 531 if (compression_header_size == 0)
4a114e3e 532 {
dab394de
L
533 /* In this case, it should be "ZLIB" followed by the uncompressed
534 section size, 8 bytes in big-endian order. */
535 if (! CONST_STRNEQ ((char*) header, "ZLIB"))
536 {
537 bfd_set_error (bfd_error_wrong_format);
538 return FALSE;
539 }
540 uncompressed_size = bfd_getb64 (header + 4);
4a114e3e 541 }
dab394de 542 else if (!bfd_check_compression_header (abfd, header, sec,
4207142d
MW
543 &uncompressed_size,
544 &uncompressed_alignment_power))
151411f8
L
545 {
546 bfd_set_error (bfd_error_wrong_format);
547 return FALSE;
548 }
dab394de 549
4a114e3e
L
550 sec->compressed_size = sec->size;
551 sec->size = uncompressed_size;
4207142d 552 bfd_set_section_alignment (abfd, sec, uncompressed_alignment_power);
4a114e3e 553 sec->compress_status = DECOMPRESS_SECTION_SIZED;
1b315056 554
4a114e3e 555 return TRUE;
4a114e3e
L
556}
557
558/*
559FUNCTION
560 bfd_init_section_compress_status
561
562SYNOPSIS
563 bfd_boolean bfd_init_section_compress_status
564 (bfd *abfd, asection *section);
565
566DESCRIPTION
567 If open for read, compress section, update section size with
568 compressed size and set compress_status to COMPRESS_SECTION_DONE.
569
570 Return @code{FALSE} if the section is not a valid compressed
18ece1de 571 section. Otherwise, return @code{TRUE}.
4a114e3e
L
572*/
573
574bfd_boolean
243340ad 575bfd_init_section_compress_status (bfd *abfd, sec_ptr sec)
4a114e3e 576{
4a114e3e
L
577 bfd_size_type uncompressed_size;
578 bfd_byte *uncompressed_buffer;
4a114e3e
L
579
580 /* Error if not opened for read. */
581 if (abfd->direction != read_direction
582 || sec->size == 0
583 || sec->rawsize != 0
584 || sec->contents != NULL
585 || sec->compress_status != COMPRESS_SECTION_NONE)
1b315056 586 {
4a114e3e
L
587 bfd_set_error (bfd_error_invalid_operation);
588 return FALSE;
1b315056 589 }
1b315056 590
4a114e3e
L
591 /* Read in the full section contents and compress it. */
592 uncompressed_size = sec->size;
593 uncompressed_buffer = (bfd_byte *) bfd_malloc (uncompressed_size);
e63d1232
NC
594 /* PR 21431 */
595 if (uncompressed_buffer == NULL)
596 return FALSE;
597
4a114e3e
L
598 if (!bfd_get_section_contents (abfd, sec, uncompressed_buffer,
599 0, uncompressed_size))
e63d1232 600 return FALSE;
1b315056 601
e63d1232
NC
602 uncompressed_size = bfd_compress_section_contents (abfd, sec,
603 uncompressed_buffer,
604 uncompressed_size);
605 return uncompressed_size != 0;
1b315056 606}
0ce398f1
L
607
608/*
609FUNCTION
610 bfd_compress_section
611
612SYNOPSIS
613 bfd_boolean bfd_compress_section
614 (bfd *abfd, asection *section, bfd_byte *uncompressed_buffer);
615
616DESCRIPTION
617 If open for write, compress section, update section size with
618 compressed size and set compress_status to COMPRESS_SECTION_DONE.
619
620 Return @code{FALSE} if compression fail. Otherwise, return
621 @code{TRUE}.
622*/
623
624bfd_boolean
625bfd_compress_section (bfd *abfd, sec_ptr sec, bfd_byte *uncompressed_buffer)
626{
627 bfd_size_type uncompressed_size = sec->size;
628
629 /* Error if not opened for write. */
630 if (abfd->direction != write_direction
631 || uncompressed_size == 0
632 || uncompressed_buffer == NULL
633 || sec->contents != NULL
634 || sec->compressed_size != 0
635 || sec->compress_status != COMPRESS_SECTION_NONE)
636 {
637 bfd_set_error (bfd_error_invalid_operation);
638 return FALSE;
639 }
640
641 /* Compress it. */
642 return bfd_compress_section_contents (abfd, sec, uncompressed_buffer,
3e19fb8f 643 uncompressed_size) != 0;
0ce398f1 644}
This page took 0.523531 seconds and 4 git commands to generate.