1 /* Compressed section support (intended for debug sections).
2 Copyright (C) 2008-2020 Free Software Foundation, Inc.
4 This file is part of BFD, the Binary File Descriptor library.
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.
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.
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. */
25 #include "safe-ctype.h"
27 #define MAX_COMPRESSION_HEADER_SIZE 24
30 decompress_contents (bfd_byte
*compressed_buffer
,
31 bfd_size_type compressed_size
,
32 bfd_byte
*uncompressed_buffer
,
33 bfd_size_type uncompressed_size
)
38 /* It is possible the section consists of several compressed
39 buffers concatenated together, so we uncompress in a loop. */
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
45 memset (& strm
, 0, sizeof strm
);
46 strm
.avail_in
= compressed_size
;
47 strm
.next_in
= (Bytef
*) compressed_buffer
;
48 strm
.avail_out
= uncompressed_size
;
50 BFD_ASSERT (Z_OK
== 0);
51 rc
= inflateInit (&strm
);
52 while (strm
.avail_in
> 0 && strm
.avail_out
> 0)
56 strm
.next_out
= ((Bytef
*) uncompressed_buffer
57 + (uncompressed_size
- strm
.avail_out
));
58 rc
= inflate (&strm
, Z_FINISH
);
59 if (rc
!= Z_STREAM_END
)
61 rc
= inflateReset (&strm
);
63 rc
|= inflateEnd (&strm
);
64 return rc
== Z_OK
&& strm
.avail_out
== 0;
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
70 field was allocated using bfd_malloc() or equivalent.
72 Return the uncompressed size if the full section contents is
73 compressed successfully. Otherwise return 0. */
76 bfd_compress_section_contents (bfd
*abfd
, sec_ptr sec
,
77 bfd_byte
*uncompressed_buffer
,
78 bfd_size_type uncompressed_size
)
80 uLong compressed_size
;
82 bfd_size_type buffer_size
;
83 bfd_boolean decompress
;
85 int orig_compression_header_size
;
86 bfd_size_type orig_uncompressed_size
;
87 unsigned int orig_uncompressed_alignment_pow
;
88 int header_size
= bfd_get_compression_header_size (abfd
, NULL
);
89 bfd_boolean compressed
90 = bfd_is_section_compressed_with_header (abfd
, sec
,
91 &orig_compression_header_size
,
92 &orig_uncompressed_size
,
93 &orig_uncompressed_alignment_pow
);
95 /* Either ELF compression header or the 12-byte, "ZLIB" + 8-byte size,
96 overhead in .zdebug* section. */
102 /* We shouldn't decompress unsupported compressed section. */
103 if (orig_compression_header_size
< 0)
106 /* Different compression schemes. Just move the compressed section
107 contents to the right position. */
108 if (orig_compression_header_size
== 0)
110 /* Convert it from .zdebug* section. Get the uncompressed
111 size first. We need to subtract the 12-byte overhead in
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;
119 /* Convert it to .zdebug* section. */
120 zlib_size
= uncompressed_size
- orig_compression_header_size
;
123 /* Add the header size. */
124 compressed_size
= zlib_size
+ header_size
;
127 compressed_size
= compressBound (uncompressed_size
) + header_size
;
129 /* Uncompress if it leads to smaller size. */
130 if (compressed
&& compressed_size
> orig_uncompressed_size
)
133 buffer_size
= orig_uncompressed_size
;
138 buffer_size
= compressed_size
;
140 buffer
= (bfd_byte
*) bfd_alloc (abfd
, buffer_size
);
146 sec
->size
= orig_uncompressed_size
;
149 if (!decompress_contents (uncompressed_buffer
150 + orig_compression_header_size
,
151 zlib_size
, buffer
, buffer_size
))
153 bfd_set_error (bfd_error_bad_value
);
154 bfd_release (abfd
, buffer
);
157 free (uncompressed_buffer
);
158 bfd_set_section_alignment (sec
, orig_uncompressed_alignment_pow
);
160 sec
->contents
= buffer
;
161 sec
->compress_status
= COMPRESS_SECTION_DONE
;
162 return orig_uncompressed_size
;
166 bfd_update_compression_header (abfd
, buffer
, sec
);
167 memmove (buffer
+ header_size
,
168 uncompressed_buffer
+ orig_compression_header_size
,
174 if (compress ((Bytef
*) buffer
+ header_size
,
176 (const Bytef
*) uncompressed_buffer
,
177 uncompressed_size
) != Z_OK
)
179 bfd_release (abfd
, buffer
);
180 bfd_set_error (bfd_error_bad_value
);
184 compressed_size
+= header_size
;
185 /* PR binutils/18087: If compression didn't make the section smaller,
186 just keep it uncompressed. */
187 if (compressed_size
< uncompressed_size
)
188 bfd_update_compression_header (abfd
, buffer
, sec
);
191 /* NOTE: There is a small memory leak here since
192 uncompressed_buffer is malloced and won't be freed. */
193 bfd_release (abfd
, buffer
);
194 sec
->contents
= uncompressed_buffer
;
195 sec
->compress_status
= COMPRESS_SECTION_NONE
;
196 return uncompressed_size
;
200 free (uncompressed_buffer
);
201 sec
->contents
= buffer
;
202 sec
->size
= compressed_size
;
203 sec
->compress_status
= COMPRESS_SECTION_DONE
;
205 return uncompressed_size
;
210 bfd_get_full_section_contents
213 bfd_boolean bfd_get_full_section_contents
214 (bfd *abfd, asection *section, bfd_byte **ptr);
217 Read all data from @var{section} in BFD @var{abfd}, decompress
218 if needed, and store in @var{*ptr}. If @var{*ptr} is NULL,
219 return @var{*ptr} with memory malloc'd by this function.
221 Return @code{TRUE} if the full section contents is retrieved
222 successfully. If the section has no contents then this function
223 returns @code{TRUE} but @var{*ptr} is set to NULL.
227 bfd_get_full_section_contents (bfd
*abfd
, sec_ptr sec
, bfd_byte
**ptr
)
232 bfd_size_type save_size
;
233 bfd_size_type save_rawsize
;
234 bfd_byte
*compressed_buffer
;
235 unsigned int compression_header_size
;
237 if (abfd
->direction
!= write_direction
&& sec
->rawsize
!= 0)
247 switch (sec
->compress_status
)
249 case COMPRESS_SECTION_NONE
:
252 ufile_ptr filesize
= bfd_get_file_size (abfd
);
255 /* PR 24753: Linker created sections can be larger than
256 the file size, eg if they are being used to hold stubs. */
257 && (bfd_section_flags (sec
) & SEC_LINKER_CREATED
) == 0
258 /* PR 24753: Sections which have no content should also be
259 excluded as they contain no size on disk. */
260 && (bfd_section_flags (sec
) & SEC_HAS_CONTENTS
) != 0
261 /* The MMO file format supports its own special compression
262 technique, but it uses COMPRESS_SECTION_NONE when loading
263 a section's contents. */
264 && bfd_get_flavour (abfd
) != bfd_target_mmo_flavour
)
266 /* PR 24708: Avoid attempts to allocate a ridiculous amount
268 bfd_set_error (bfd_error_no_memory
);
270 /* xgettext:c-format */
271 (_("error: %pB(%pA) section size (%#" PRIx64
" bytes) is larger than file size (%#" PRIx64
" bytes)"),
272 abfd
, sec
, (uint64_t) sz
, (uint64_t) filesize
);
275 p
= (bfd_byte
*) bfd_malloc (sz
);
278 /* PR 20801: Provide a more helpful error message. */
279 if (bfd_get_error () == bfd_error_no_memory
)
281 /* xgettext:c-format */
282 (_("error: %pB(%pA) is too large (%#" PRIx64
" bytes)"),
283 abfd
, sec
, (uint64_t) sz
);
288 if (!bfd_get_section_contents (abfd
, sec
, p
, 0, sz
))
297 case DECOMPRESS_SECTION_SIZED
:
298 /* Read in the full compressed section contents. */
299 compressed_buffer
= (bfd_byte
*) bfd_malloc (sec
->compressed_size
);
300 if (compressed_buffer
== NULL
)
302 save_rawsize
= sec
->rawsize
;
303 save_size
= sec
->size
;
304 /* Clear rawsize, set size to compressed size and set compress_status
305 to COMPRESS_SECTION_NONE. If the compressed size is bigger than
306 the uncompressed size, bfd_get_section_contents will fail. */
308 sec
->size
= sec
->compressed_size
;
309 sec
->compress_status
= COMPRESS_SECTION_NONE
;
310 ret
= bfd_get_section_contents (abfd
, sec
, compressed_buffer
,
311 0, sec
->compressed_size
);
312 /* Restore rawsize and size. */
313 sec
->rawsize
= save_rawsize
;
314 sec
->size
= save_size
;
315 sec
->compress_status
= DECOMPRESS_SECTION_SIZED
;
317 goto fail_compressed
;
320 p
= (bfd_byte
*) bfd_malloc (sz
);
322 goto fail_compressed
;
324 compression_header_size
= bfd_get_compression_header_size (abfd
, sec
);
325 if (compression_header_size
== 0)
326 /* Set header size to the zlib header size if it is a
327 SHF_COMPRESSED section. */
328 compression_header_size
= 12;
329 if (!decompress_contents (compressed_buffer
+ compression_header_size
,
330 sec
->compressed_size
- compression_header_size
, p
, sz
))
332 bfd_set_error (bfd_error_bad_value
);
336 free (compressed_buffer
);
340 free (compressed_buffer
);
344 case COMPRESS_SECTION_DONE
:
345 if (sec
->contents
== NULL
)
349 p
= (bfd_byte
*) bfd_malloc (sz
);
354 /* PR 17512; file: 5bc29788. */
355 if (p
!= sec
->contents
)
356 memcpy (p
, sec
->contents
, sz
);
366 bfd_cache_section_contents
369 void bfd_cache_section_contents
370 (asection *sec, void *contents);
373 Stash @var(contents) so any following reads of @var(sec) do
374 not need to decompress again.
378 bfd_cache_section_contents (asection
*sec
, void *contents
)
380 if (sec
->compress_status
== DECOMPRESS_SECTION_SIZED
)
381 sec
->compress_status
= COMPRESS_SECTION_DONE
;
382 sec
->contents
= contents
;
383 sec
->flags
|= SEC_IN_MEMORY
;
388 bfd_is_section_compressed_with_header
391 bfd_boolean bfd_is_section_compressed_with_header
392 (bfd *abfd, asection *section,
393 int *compression_header_size_p,
394 bfd_size_type *uncompressed_size_p,
395 unsigned int *uncompressed_alignment_power_p);
398 Return @code{TRUE} if @var{section} is compressed. Compression
399 header size is returned in @var{compression_header_size_p},
400 uncompressed size is returned in @var{uncompressed_size_p}
401 and the uncompressed data alignement power is returned in
402 @var{uncompressed_align_pow_p}. If compression is
403 unsupported, compression header size is returned with -1
404 and uncompressed size is returned with 0.
408 bfd_is_section_compressed_with_header (bfd
*abfd
, sec_ptr sec
,
409 int *compression_header_size_p
,
410 bfd_size_type
*uncompressed_size_p
,
411 unsigned int *uncompressed_align_pow_p
)
413 bfd_byte header
[MAX_COMPRESSION_HEADER_SIZE
];
414 int compression_header_size
;
416 unsigned int saved
= sec
->compress_status
;
417 bfd_boolean compressed
;
419 *uncompressed_align_pow_p
= 0;
421 compression_header_size
= bfd_get_compression_header_size (abfd
, sec
);
422 if (compression_header_size
> MAX_COMPRESSION_HEADER_SIZE
)
424 header_size
= compression_header_size
? compression_header_size
: 12;
426 /* Don't decompress the section. */
427 sec
->compress_status
= COMPRESS_SECTION_NONE
;
429 /* Read the header. */
430 if (bfd_get_section_contents (abfd
, sec
, header
, 0, header_size
))
432 if (compression_header_size
== 0)
433 /* In this case, it should be "ZLIB" followed by the uncompressed
434 section size, 8 bytes in big-endian order. */
435 compressed
= CONST_STRNEQ ((char*) header
, "ZLIB");
442 *uncompressed_size_p
= sec
->size
;
445 if (compression_header_size
!= 0)
447 if (!bfd_check_compression_header (abfd
, header
, sec
,
449 uncompressed_align_pow_p
))
450 compression_header_size
= -1;
452 /* Check for the pathalogical case of a debug string section that
453 contains the string ZLIB.... as the first entry. We assume that
454 no uncompressed .debug_str section would ever be big enough to
455 have the first byte of its (big-endian) size be non-zero. */
456 else if (strcmp (sec
->name
, ".debug_str") == 0
457 && ISPRINT (header
[4]))
460 *uncompressed_size_p
= bfd_getb64 (header
+ 4);
463 /* Restore compress_status. */
464 sec
->compress_status
= saved
;
465 *compression_header_size_p
= compression_header_size
;
471 bfd_is_section_compressed
474 bfd_boolean bfd_is_section_compressed
475 (bfd *abfd, asection *section);
478 Return @code{TRUE} if @var{section} is compressed.
482 bfd_is_section_compressed (bfd
*abfd
, sec_ptr sec
)
484 int compression_header_size
;
485 bfd_size_type uncompressed_size
;
486 unsigned int uncompressed_align_power
;
487 return (bfd_is_section_compressed_with_header (abfd
, sec
,
488 &compression_header_size
,
490 &uncompressed_align_power
)
491 && compression_header_size
>= 0
492 && uncompressed_size
> 0);
497 bfd_init_section_decompress_status
500 bfd_boolean bfd_init_section_decompress_status
501 (bfd *abfd, asection *section);
504 Record compressed section size, update section size with
505 decompressed size and set compress_status to
506 DECOMPRESS_SECTION_SIZED.
508 Return @code{FALSE} if the section is not a valid compressed
509 section. Otherwise, return @code{TRUE}.
513 bfd_init_section_decompress_status (bfd
*abfd
, sec_ptr sec
)
515 bfd_byte header
[MAX_COMPRESSION_HEADER_SIZE
];
516 int compression_header_size
;
518 bfd_size_type uncompressed_size
;
519 unsigned int uncompressed_alignment_power
= 0;
521 compression_header_size
= bfd_get_compression_header_size (abfd
, sec
);
522 if (compression_header_size
> MAX_COMPRESSION_HEADER_SIZE
)
524 header_size
= compression_header_size
? compression_header_size
: 12;
526 /* Read the header. */
527 if (sec
->rawsize
!= 0
528 || sec
->contents
!= NULL
529 || sec
->compress_status
!= COMPRESS_SECTION_NONE
530 || !bfd_get_section_contents (abfd
, sec
, header
, 0, header_size
))
532 bfd_set_error (bfd_error_invalid_operation
);
536 if (compression_header_size
== 0)
538 /* In this case, it should be "ZLIB" followed by the uncompressed
539 section size, 8 bytes in big-endian order. */
540 if (! CONST_STRNEQ ((char*) header
, "ZLIB"))
542 bfd_set_error (bfd_error_wrong_format
);
545 uncompressed_size
= bfd_getb64 (header
+ 4);
547 else if (!bfd_check_compression_header (abfd
, header
, sec
,
549 &uncompressed_alignment_power
))
551 bfd_set_error (bfd_error_wrong_format
);
555 sec
->compressed_size
= sec
->size
;
556 sec
->size
= uncompressed_size
;
557 bfd_set_section_alignment (sec
, uncompressed_alignment_power
);
558 sec
->compress_status
= DECOMPRESS_SECTION_SIZED
;
565 bfd_init_section_compress_status
568 bfd_boolean bfd_init_section_compress_status
569 (bfd *abfd, asection *section);
572 If open for read, compress section, update section size with
573 compressed size and set compress_status to COMPRESS_SECTION_DONE.
575 Return @code{FALSE} if the section is not a valid compressed
576 section. Otherwise, return @code{TRUE}.
580 bfd_init_section_compress_status (bfd
*abfd
, sec_ptr sec
)
582 bfd_size_type uncompressed_size
;
583 bfd_byte
*uncompressed_buffer
;
585 /* Error if not opened for read. */
586 if (abfd
->direction
!= read_direction
589 || sec
->contents
!= NULL
590 || sec
->compress_status
!= COMPRESS_SECTION_NONE
)
592 bfd_set_error (bfd_error_invalid_operation
);
596 /* Read in the full section contents and compress it. */
597 uncompressed_size
= sec
->size
;
598 uncompressed_buffer
= (bfd_byte
*) bfd_malloc (uncompressed_size
);
600 if (uncompressed_buffer
== NULL
)
603 if (!bfd_get_section_contents (abfd
, sec
, uncompressed_buffer
,
604 0, uncompressed_size
))
607 uncompressed_size
= bfd_compress_section_contents (abfd
, sec
,
610 return uncompressed_size
!= 0;
618 bfd_boolean bfd_compress_section
619 (bfd *abfd, asection *section, bfd_byte *uncompressed_buffer);
622 If open for write, compress section, update section size with
623 compressed size and set compress_status to COMPRESS_SECTION_DONE.
625 Return @code{FALSE} if compression fail. Otherwise, return
630 bfd_compress_section (bfd
*abfd
, sec_ptr sec
, bfd_byte
*uncompressed_buffer
)
632 bfd_size_type uncompressed_size
= sec
->size
;
634 /* Error if not opened for write. */
635 if (abfd
->direction
!= write_direction
636 || uncompressed_size
== 0
637 || uncompressed_buffer
== NULL
638 || sec
->contents
!= NULL
639 || sec
->compressed_size
!= 0
640 || sec
->compress_status
!= COMPRESS_SECTION_NONE
)
642 bfd_set_error (bfd_error_invalid_operation
);
647 return bfd_compress_section_contents (abfd
, sec
, uncompressed_buffer
,
648 uncompressed_size
) != 0;