1 /* Compressed section support (intended for debug sections). 2 Copyright (C) 2008-2022 Free Software Foundation, Inc. 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 21 #include "sysdep.h" 22 #include <zlib.h> 23 #ifdef HAVE_ZSTD 24 #include <zstd.h> 25 #endif 26 #include "bfd.h" 27 #include "elf-bfd.h" 28 #include "libbfd.h" 29 #include "safe-ctype.h" 30 #include "libiberty.h" 31 32 #define MAX_COMPRESSION_HEADER_SIZE 24 33 34 /* 35 CODE_FRAGMENT 36 .{* Types of compressed DWARF debug sections. *} 37 .enum compressed_debug_section_type 38 .{ 39 . COMPRESS_DEBUG_NONE = 0, 40 . COMPRESS_DEBUG_GNU_ZLIB = 1 << 1, 41 . COMPRESS_DEBUG_GABI_ZLIB = 1 << 2, 42 . COMPRESS_DEBUG_ZSTD = 1 << 3, 43 . COMPRESS_UNKNOWN = 1 << 4 44 .}; 45 . 46 .{* Tuple for compressed_debug_section_type and their name. *} 47 .struct compressed_type_tuple 48 .{ 49 . enum compressed_debug_section_type type; 50 . const char *name; 51 .}; 52 . 53 .{* Compression header ch_type values. *} 54 .enum compression_type 55 .{ 56 . ch_none = 0, 57 . ch_compress_zlib = 1 , {* Compressed with zlib. *} 58 . ch_compress_zstd = 2 {* Compressed with zstd (www.zstandard.org). *} 59 .}; 60 . 61 .static inline char * 62 .bfd_debug_name_to_zdebug (bfd *abfd, const char *name) 63 .{ 64 . size_t len = strlen (name); 65 . char *new_name = (char *) bfd_alloc (abfd, len + 2); 66 . if (new_name == NULL) 67 . return NULL; 68 . new_name[0] = '.'; 69 . new_name[1] = 'z'; 70 . memcpy (new_name + 2, name + 1, len); 71 . return new_name; 72 .} 73 . 74 .static inline char * 75 .bfd_zdebug_name_to_debug (bfd *abfd, const char *name) 76 .{ 77 . size_t len = strlen (name); 78 . char *new_name = (char *) bfd_alloc (abfd, len); 79 . if (new_name == NULL) 80 . return NULL; 81 . new_name[0] = '.'; 82 . memcpy (new_name + 1, name + 2, len - 1); 83 . return new_name; 84 .} 85 . 86 */ 87 88 /* Display texts for type of compressed DWARF debug sections. */ 89 static const struct compressed_type_tuple compressed_debug_section_names[] = 90 { 91 { COMPRESS_DEBUG_NONE, "none" }, 92 { COMPRESS_DEBUG_GABI_ZLIB, "zlib" }, 93 { COMPRESS_DEBUG_GNU_ZLIB, "zlib-gnu" }, 94 { COMPRESS_DEBUG_GABI_ZLIB, "zlib-gabi" }, 95 { COMPRESS_DEBUG_ZSTD, "zstd" }, 96 }; 97 98 /* 99 FUNCTION 100 bfd_get_compression_algorithm 101 SYNOPSIS 102 enum compressed_debug_section_type 103 bfd_get_compression_algorithm (const char *name); 104 DESCRIPTION 105 Return compressed_debug_section_type from a string representation. 106 */ 107 enum compressed_debug_section_type 108 bfd_get_compression_algorithm (const char *name) 109 { 110 for (unsigned i = 0; i < ARRAY_SIZE (compressed_debug_section_names); ++i) 111 if (strcasecmp (compressed_debug_section_names[i].name, name) == 0) 112 return compressed_debug_section_names[i].type; 113 114 return COMPRESS_UNKNOWN; 115 } 116 117 /* 118 FUNCTION 119 bfd_get_compression_algorithm_name 120 SYNOPSIS 121 const char *bfd_get_compression_algorithm_name 122 (enum compressed_debug_section_type type); 123 DESCRIPTION 124 Return compression algorithm name based on the type. 125 */ 126 const char * 127 bfd_get_compression_algorithm_name (enum compressed_debug_section_type type) 128 { 129 for (unsigned i = 0; i < ARRAY_SIZE (compressed_debug_section_names); ++i) 130 if (type == compressed_debug_section_names[i].type) 131 return compressed_debug_section_names[i].name; 132 133 return NULL; 134 } 135 136 /* 137 FUNCTION 138 bfd_update_compression_header 139 140 SYNOPSIS 141 void bfd_update_compression_header 142 (bfd *abfd, bfd_byte *contents, asection *sec); 143 144 DESCRIPTION 145 Set the compression header at CONTENTS of SEC in ABFD and update 146 elf_section_flags for compression. 147 */ 148 149 void 150 bfd_update_compression_header (bfd *abfd, bfd_byte *contents, 151 asection *sec) 152 { 153 if ((abfd->flags & BFD_COMPRESS) == 0) 154 abort (); 155 156 switch (bfd_get_flavour (abfd)) 157 { 158 case bfd_target_elf_flavour: 159 if ((abfd->flags & BFD_COMPRESS_GABI) != 0) 160 { 161 const struct elf_backend_data *bed = get_elf_backend_data (abfd); 162 struct bfd_elf_section_data * esd = elf_section_data (sec); 163 enum compression_type ch_type = (abfd->flags & BFD_COMPRESS_ZSTD 164 ? ch_compress_zstd 165 : ch_compress_zlib); 166 167 /* Set the SHF_COMPRESSED bit. */ 168 elf_section_flags (sec) |= SHF_COMPRESSED; 169 170 if (bed->s->elfclass == ELFCLASS32) 171 { 172 Elf32_External_Chdr *echdr = (Elf32_External_Chdr *) contents; 173 bfd_put_32 (abfd, ch_type, &echdr->ch_type); 174 bfd_put_32 (abfd, sec->size, &echdr->ch_size); 175 bfd_put_32 (abfd, 1u << sec->alignment_power, 176 &echdr->ch_addralign); 177 /* bfd_log2 (alignof (Elf32_Chdr)) */ 178 bfd_set_section_alignment (sec, 2); 179 esd->this_hdr.sh_addralign = 4; 180 } 181 else 182 { 183 Elf64_External_Chdr *echdr = (Elf64_External_Chdr *) contents; 184 bfd_put_32 (abfd, ch_type, &echdr->ch_type); 185 bfd_put_32 (abfd, 0, &echdr->ch_reserved); 186 bfd_put_64 (abfd, sec->size, &echdr->ch_size); 187 bfd_put_64 (abfd, UINT64_C (1) << sec->alignment_power, 188 &echdr->ch_addralign); 189 /* bfd_log2 (alignof (Elf64_Chdr)) */ 190 bfd_set_section_alignment (sec, 3); 191 esd->this_hdr.sh_addralign = 8; 192 } 193 break; 194 } 195 196 /* Clear the SHF_COMPRESSED bit. */ 197 elf_section_flags (sec) &= ~SHF_COMPRESSED; 198 /* Fall through. */ 199 200 default: 201 /* Write the zlib header. It should be "ZLIB" followed by 202 the uncompressed section size, 8 bytes in big-endian 203 order. */ 204 memcpy (contents, "ZLIB", 4); 205 bfd_putb64 (sec->size, contents + 4); 206 /* No way to keep the original alignment, just use 1 always. */ 207 bfd_set_section_alignment (sec, 0); 208 break; 209 } 210 } 211 212 /* Check the compression header at CONTENTS of SEC in ABFD and store the 213 ch_type in CH_TYPE, uncompressed size in UNCOMPRESSED_SIZE, and the 214 uncompressed data alignment in UNCOMPRESSED_ALIGNMENT_POWER if the 215 compression header is valid. */ 216 217 static bool 218 bfd_check_compression_header (bfd *abfd, bfd_byte *contents, 219 asection *sec, 220 enum compression_type *ch_type, 221 bfd_size_type *uncompressed_size, 222 unsigned int *uncompressed_alignment_power) 223 { 224 if (bfd_get_flavour (abfd) == bfd_target_elf_flavour 225 && (elf_section_flags (sec) & SHF_COMPRESSED) != 0) 226 { 227 Elf_Internal_Chdr chdr; 228 const struct elf_backend_data *bed = get_elf_backend_data (abfd); 229 if (bed->s->elfclass == ELFCLASS32) 230 { 231 Elf32_External_Chdr *echdr = (Elf32_External_Chdr *) contents; 232 chdr.ch_type = bfd_get_32 (abfd, &echdr->ch_type); 233 chdr.ch_size = bfd_get_32 (abfd, &echdr->ch_size); 234 chdr.ch_addralign = bfd_get_32 (abfd, &echdr->ch_addralign); 235 } 236 else 237 { 238 Elf64_External_Chdr *echdr = (Elf64_External_Chdr *) contents; 239 chdr.ch_type = bfd_get_32 (abfd, &echdr->ch_type); 240 chdr.ch_size = bfd_get_64 (abfd, &echdr->ch_size); 241 chdr.ch_addralign = bfd_get_64 (abfd, &echdr->ch_addralign); 242 } 243 *ch_type = chdr.ch_type; 244 if ((chdr.ch_type == ch_compress_zlib 245 || chdr.ch_type == ch_compress_zstd) 246 && chdr.ch_addralign == (chdr.ch_addralign & -chdr.ch_addralign)) 247 { 248 *uncompressed_size = chdr.ch_size; 249 *uncompressed_alignment_power = bfd_log2 (chdr.ch_addralign); 250 return true; 251 } 252 } 253 254 return false; 255 } 256 257 /* 258 FUNCTION 259 bfd_get_compression_header_size 260 261 SYNOPSIS 262 int bfd_get_compression_header_size (bfd *abfd, asection *sec); 263 264 DESCRIPTION 265 Return the size of the compression header of SEC in ABFD. 266 267 RETURNS 268 Return the size of the compression header in bytes. 269 */ 270 271 int 272 bfd_get_compression_header_size (bfd *abfd, asection *sec) 273 { 274 if (bfd_get_flavour (abfd) == bfd_target_elf_flavour) 275 { 276 if (sec == NULL) 277 { 278 if (!(abfd->flags & BFD_COMPRESS_GABI)) 279 return 0; 280 } 281 else if (!(elf_section_flags (sec) & SHF_COMPRESSED)) 282 return 0; 283 284 if (get_elf_backend_data (abfd)->s->elfclass == ELFCLASS32) 285 return sizeof (Elf32_External_Chdr); 286 else 287 return sizeof (Elf64_External_Chdr); 288 } 289 290 return 0; 291 } 292 293 /* 294 FUNCTION 295 bfd_convert_section_setup 296 297 SYNOPSIS 298 bool bfd_convert_section_setup 299 (bfd *ibfd, asection *isec, bfd *obfd, 300 const char **new_name, bfd_size_type *new_size); 301 302 DESCRIPTION 303 Do early setup for objcopy, when copying @var{isec} in input 304 BFD @var{ibfd} to output BFD @var{obfd}. Returns the name and 305 size of the output section. 306 */ 307 308 bool 309 bfd_convert_section_setup (bfd *ibfd, asection *isec, bfd *obfd, 310 const char **new_name, bfd_size_type *new_size) 311 { 312 bfd_size_type hdr_size; 313 314 if ((isec->flags & SEC_DEBUGGING) != 0 315 && (isec->flags & SEC_HAS_CONTENTS) != 0) 316 { 317 const char *name = *new_name; 318 319 if ((obfd->flags & (BFD_DECOMPRESS | BFD_COMPRESS_GABI)) != 0) 320 { 321 /* When we decompress or compress with SHF_COMPRESSED, 322 convert section name from .zdebug_* to .debug_*. */ 323 if (startswith (name, ".zdebug_")) 324 { 325 name = bfd_zdebug_name_to_debug (obfd, name); 326 if (name == NULL) 327 return false; 328 } 329 } 330 331 /* PR binutils/18087: Compression does not always make a 332 section smaller. So only rename the section when 333 compression has actually taken place. If input section 334 name is .zdebug_*, we should never compress it again. */ 335 else if (isec->compress_status == COMPRESS_SECTION_DONE 336 && startswith (name, ".debug_")) 337 { 338 name = bfd_debug_name_to_zdebug (obfd, name); 339 if (name == NULL) 340 return false; 341 } 342 *new_name = name; 343 } 344 *new_size = bfd_section_size (isec); 345 346 /* Do nothing if either input or output aren't ELF. */ 347 if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour 348 || bfd_get_flavour (obfd) != bfd_target_elf_flavour) 349 return true; 350 351 /* Do nothing if ELF classes of input and output are the same. */ 352 if (get_elf_backend_data (ibfd)->s->elfclass 353 == get_elf_backend_data (obfd)->s->elfclass) 354 return true; 355 356 /* Convert GNU property size. */ 357 if (startswith (isec->name, NOTE_GNU_PROPERTY_SECTION_NAME)) 358 { 359 *new_size = _bfd_elf_convert_gnu_property_size (ibfd, obfd); 360 return true; 361 } 362 363 /* Do nothing if input file will be decompressed. */ 364 if ((ibfd->flags & BFD_DECOMPRESS)) 365 return true; 366 367 /* Do nothing if the input section isn't a SHF_COMPRESSED section. */ 368 hdr_size = bfd_get_compression_header_size (ibfd, isec); 369 if (hdr_size == 0) 370 return true; 371 372 /* Adjust the size of the output SHF_COMPRESSED section. */ 373 if (hdr_size == sizeof (Elf32_External_Chdr)) 374 *new_size += sizeof (Elf64_External_Chdr) - sizeof (Elf32_External_Chdr); 375 else 376 *new_size -= sizeof (Elf64_External_Chdr) - sizeof (Elf32_External_Chdr); 377 return true; 378 } 379 380 /* 381 FUNCTION 382 bfd_convert_section_contents 383 384 SYNOPSIS 385 bool bfd_convert_section_contents 386 (bfd *ibfd, asection *isec, bfd *obfd, 387 bfd_byte **ptr, bfd_size_type *ptr_size); 388 389 DESCRIPTION 390 Convert the contents, stored in @var{*ptr}, of the section 391 @var{isec} in input BFD @var{ibfd} to output BFD @var{obfd} 392 if needed. The original buffer pointed to by @var{*ptr} may 393 be freed and @var{*ptr} is returned with memory malloc'd by this 394 function, and the new size written to @var{ptr_size}. 395 */ 396 397 bool 398 bfd_convert_section_contents (bfd *ibfd, sec_ptr isec, bfd *obfd, 399 bfd_byte **ptr, bfd_size_type *ptr_size) 400 { 401 bfd_byte *contents; 402 bfd_size_type ihdr_size, ohdr_size, size; 403 Elf_Internal_Chdr chdr; 404 bool use_memmove; 405 406 /* Do nothing if either input or output aren't ELF. */ 407 if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour 408 || bfd_get_flavour (obfd) != bfd_target_elf_flavour) 409 return true; 410 411 /* Do nothing if ELF classes of input and output are the same. */ 412 if (get_elf_backend_data (ibfd)->s->elfclass 413 == get_elf_backend_data (obfd)->s->elfclass) 414 return true; 415 416 /* Convert GNU properties. */ 417 if (startswith (isec->name, NOTE_GNU_PROPERTY_SECTION_NAME)) 418 return _bfd_elf_convert_gnu_properties (ibfd, isec, obfd, ptr, 419 ptr_size); 420 421 /* Do nothing if input file will be decompressed. */ 422 if ((ibfd->flags & BFD_DECOMPRESS)) 423 return true; 424 425 /* Do nothing if the input section isn't a SHF_COMPRESSED section. */ 426 ihdr_size = bfd_get_compression_header_size (ibfd, isec); 427 if (ihdr_size == 0) 428 return true; 429 430 /* PR 25221. Check for corrupt input sections. */ 431 if (ihdr_size > bfd_get_section_limit (ibfd, isec)) 432 /* FIXME: Issue a warning about a corrupt 433 compression header size field ? */ 434 return false; 435 436 contents = *ptr; 437 438 /* Convert the contents of the input SHF_COMPRESSED section to 439 output. Get the input compression header and the size of the 440 output compression header. */ 441 if (ihdr_size == sizeof (Elf32_External_Chdr)) 442 { 443 Elf32_External_Chdr *echdr = (Elf32_External_Chdr *) contents; 444 chdr.ch_type = bfd_get_32 (ibfd, &echdr->ch_type); 445 chdr.ch_size = bfd_get_32 (ibfd, &echdr->ch_size); 446 chdr.ch_addralign = bfd_get_32 (ibfd, &echdr->ch_addralign); 447 448 ohdr_size = sizeof (Elf64_External_Chdr); 449 450 use_memmove = false; 451 } 452 else if (ihdr_size != sizeof (Elf64_External_Chdr)) 453 { 454 /* FIXME: Issue a warning about a corrupt 455 compression header size field ? */ 456 return false; 457 } 458 else 459 { 460 Elf64_External_Chdr *echdr = (Elf64_External_Chdr *) contents; 461 chdr.ch_type = bfd_get_32 (ibfd, &echdr->ch_type); 462 chdr.ch_size = bfd_get_64 (ibfd, &echdr->ch_size); 463 chdr.ch_addralign = bfd_get_64 (ibfd, &echdr->ch_addralign); 464 465 ohdr_size = sizeof (Elf32_External_Chdr); 466 use_memmove = true; 467 } 468 469 size = bfd_section_size (isec) - ihdr_size + ohdr_size; 470 if (!use_memmove) 471 { 472 contents = (bfd_byte *) bfd_malloc (size); 473 if (contents == NULL) 474 return false; 475 } 476 477 /* Write out the output compression header. */ 478 if (ohdr_size == sizeof (Elf32_External_Chdr)) 479 { 480 Elf32_External_Chdr *echdr = (Elf32_External_Chdr *) contents; 481 bfd_put_32 (obfd, chdr.ch_type, &echdr->ch_type); 482 bfd_put_32 (obfd, chdr.ch_size, &echdr->ch_size); 483 bfd_put_32 (obfd, chdr.ch_addralign, &echdr->ch_addralign); 484 } 485 else 486 { 487 Elf64_External_Chdr *echdr = (Elf64_External_Chdr *) contents; 488 bfd_put_32 (obfd, chdr.ch_type, &echdr->ch_type); 489 bfd_put_32 (obfd, 0, &echdr->ch_reserved); 490 bfd_put_64 (obfd, chdr.ch_size, &echdr->ch_size); 491 bfd_put_64 (obfd, chdr.ch_addralign, &echdr->ch_addralign); 492 } 493 494 /* Copy the compressed contents. */ 495 if (use_memmove) 496 memmove (contents + ohdr_size, *ptr + ihdr_size, size - ohdr_size); 497 else 498 { 499 memcpy (contents + ohdr_size, *ptr + ihdr_size, size - ohdr_size); 500 free (*ptr); 501 *ptr = contents; 502 } 503 504 *ptr_size = size; 505 return true; 506 } 507 508 static bool 509 decompress_contents (bool is_zstd, bfd_byte *compressed_buffer, 510 bfd_size_type compressed_size, 511 bfd_byte *uncompressed_buffer, 512 bfd_size_type uncompressed_size) 513 { 514 if (is_zstd) 515 { 516 #ifdef HAVE_ZSTD 517 size_t ret = ZSTD_decompress (uncompressed_buffer, uncompressed_size, 518 compressed_buffer, compressed_size); 519 return !ZSTD_isError (ret); 520 #endif 521 } 522 523 z_stream strm; 524 int rc; 525 526 /* It is possible the section consists of several compressed 527 buffers concatenated together, so we uncompress in a loop. */ 528 /* PR 18313: The state field in the z_stream structure is supposed 529 to be invisible to the user (ie us), but some compilers will 530 still complain about it being used without initialisation. So 531 we first zero the entire z_stream structure and then set the fields 532 that we need. */ 533 memset (& strm, 0, sizeof strm); 534 strm.avail_in = compressed_size; 535 strm.next_in = (Bytef*) compressed_buffer; 536 strm.avail_out = uncompressed_size; 537 /* FIXME: strm.avail_in and strm.avail_out are typically unsigned 538 int. Supporting sizes that don't fit in an unsigned int is 539 possible but will require some rewriting of this function. */ 540 if (strm.avail_in != compressed_size || strm.avail_out != uncompressed_size) 541 return false; 542 543 BFD_ASSERT (Z_OK == 0); 544 rc = inflateInit (&strm); 545 while (strm.avail_in > 0 && strm.avail_out > 0) 546 { 547 if (rc != Z_OK) 548 break; 549 strm.next_out = ((Bytef*) uncompressed_buffer 550 + (uncompressed_size - strm.avail_out)); 551 rc = inflate (&strm, Z_FINISH); 552 if (rc != Z_STREAM_END) 553 break; 554 rc = inflateReset (&strm); 555 } 556 return inflateEnd (&strm) == Z_OK && rc == Z_OK && strm.avail_out == 0; 557 } 558 559 /* Compress section contents using zlib/zstd and store 560 as the contents field. This function assumes the contents 561 field was allocated using bfd_malloc() or equivalent. 562 563 Return the uncompressed size if the full section contents is 564 compressed successfully. Otherwise return 0. */ 565 566 static bfd_size_type 567 bfd_compress_section_contents (bfd *abfd, sec_ptr sec) 568 { 569 bfd_byte *input_buffer; 570 uLong compressed_size; 571 bfd_byte *buffer; 572 bfd_size_type buffer_size; 573 int zlib_size = 0; 574 int orig_header_size; 575 bfd_size_type uncompressed_size; 576 unsigned int uncompressed_alignment_pow; 577 enum compression_type ch_type = ch_none; 578 int new_header_size = bfd_get_compression_header_size (abfd, NULL); 579 bool compressed 580 = bfd_is_section_compressed_info (abfd, sec, 581 &orig_header_size, 582 &uncompressed_size, 583 &uncompressed_alignment_pow, 584 &ch_type); 585 bool update = false; 586 587 /* We shouldn't be trying to decompress unsupported compressed sections. */ 588 if (compressed && orig_header_size < 0) 589 abort (); 590 591 /* Either ELF compression header or the 12-byte, "ZLIB" + 8-byte size, 592 overhead in .zdebug* section. */ 593 if (!new_header_size) 594 new_header_size = 12; 595 if (ch_type == ch_none) 596 orig_header_size = 12; 597 598 input_buffer = sec->contents; 599 if (compressed) 600 { 601 zlib_size = sec->size - orig_header_size; 602 compressed_size = zlib_size + new_header_size; 603 604 /* If we are converting between zlib-gnu and zlib-gabi then the 605 compressed contents just need to be moved. */ 606 update = (ch_type < ch_compress_zstd 607 && (abfd->flags & BFD_COMPRESS_ZSTD) == 0); 608 609 /* Uncompress when not just moving contents or when compressed 610 is not smaller than uncompressed. */ 611 if (!update || compressed_size >= uncompressed_size) 612 { 613 buffer_size = uncompressed_size; 614 buffer = bfd_malloc (buffer_size); 615 if (buffer == NULL) 616 return 0; 617 618 if (!decompress_contents (ch_type == ch_compress_zstd, 619 input_buffer + orig_header_size, 620 zlib_size, buffer, buffer_size)) 621 { 622 bfd_set_error (bfd_error_bad_value); 623 free (buffer); 624 return 0; 625 } 626 free (input_buffer); 627 bfd_set_section_alignment (sec, uncompressed_alignment_pow); 628 sec->contents = buffer; 629 sec->flags |= SEC_IN_MEMORY; 630 sec->compress_status = COMPRESS_SECTION_NONE; 631 sec->size = uncompressed_size; 632 input_buffer = buffer; 633 } 634 } 635 636 if (!update) 637 compressed_size = compressBound (uncompressed_size) + new_header_size; 638 639 buffer_size = compressed_size; 640 buffer = bfd_alloc (abfd, buffer_size); 641 if (buffer == NULL) 642 return 0; 643 644 if (update) 645 { 646 if (compressed_size < uncompressed_size) 647 memcpy (buffer + new_header_size, 648 input_buffer + orig_header_size, 649 zlib_size); 650 } 651 else 652 { 653 if (abfd->flags & BFD_COMPRESS_ZSTD) 654 { 655 #if HAVE_ZSTD 656 compressed_size = ZSTD_compress (buffer + new_header_size, 657 compressed_size, 658 input_buffer, 659 uncompressed_size, 660 ZSTD_CLEVEL_DEFAULT); 661 if (ZSTD_isError (compressed_size)) 662 { 663 bfd_release (abfd, buffer); 664 bfd_set_error (bfd_error_bad_value); 665 return 0; 666 } 667 #endif 668 } 669 else if (compress ((Bytef *) buffer + new_header_size, &compressed_size, 670 (const Bytef *) input_buffer, uncompressed_size) 671 != Z_OK) 672 { 673 bfd_release (abfd, buffer); 674 bfd_set_error (bfd_error_bad_value); 675 return 0; 676 } 677 678 compressed_size += new_header_size; 679 } 680 681 /* If compression didn't make the section smaller, keep it uncompressed. */ 682 if (compressed_size >= uncompressed_size) 683 { 684 memcpy (buffer, input_buffer, uncompressed_size); 685 if (bfd_get_flavour (abfd) == bfd_target_elf_flavour) 686 elf_section_flags (sec) &= ~SHF_COMPRESSED; 687 sec->compress_status = COMPRESS_SECTION_NONE; 688 } 689 else 690 { 691 sec->size = uncompressed_size; 692 bfd_update_compression_header (abfd, buffer, sec); 693 sec->size = compressed_size; 694 sec->compress_status = COMPRESS_SECTION_DONE; 695 } 696 sec->contents = buffer; 697 sec->flags |= SEC_IN_MEMORY; 698 free (input_buffer); 699 return uncompressed_size; 700 } 701 702 /* 703 FUNCTION 704 bfd_get_full_section_contents 705 706 SYNOPSIS 707 bool bfd_get_full_section_contents 708 (bfd *abfd, asection *section, bfd_byte **ptr); 709 710 DESCRIPTION 711 Read all data from @var{section} in BFD @var{abfd}, decompress 712 if needed, and store in @var{*ptr}. If @var{*ptr} is NULL, 713 return @var{*ptr} with memory malloc'd by this function. 714 715 Return @code{TRUE} if the full section contents is retrieved 716 successfully. If the section has no contents then this function 717 returns @code{TRUE} but @var{*ptr} is set to NULL. 718 */ 719 720 bool 721 bfd_get_full_section_contents (bfd *abfd, sec_ptr sec, bfd_byte **ptr) 722 { 723 bfd_size_type readsz = bfd_get_section_limit_octets (abfd, sec); 724 bfd_size_type allocsz = bfd_get_section_alloc_size (abfd, sec); 725 bfd_byte *p = *ptr; 726 bool ret; 727 bfd_size_type save_size; 728 bfd_size_type save_rawsize; 729 bfd_byte *compressed_buffer; 730 unsigned int compression_header_size; 731 const unsigned int compress_status = sec->compress_status; 732 733 if (allocsz == 0) 734 { 735 *ptr = NULL; 736 return true; 737 } 738 739 if (p == NULL 740 && compress_status != COMPRESS_SECTION_DONE 741 && _bfd_section_size_insane (abfd, sec)) 742 { 743 /* PR 24708: Avoid attempts to allocate a ridiculous amount 744 of memory. */ 745 _bfd_error_handler 746 /* xgettext:c-format */ 747 (_("error: %pB(%pA) is too large (%#" PRIx64 " bytes)"), 748 abfd, sec, (uint64_t) readsz); 749 return false; 750 } 751 752 switch (compress_status) 753 { 754 case COMPRESS_SECTION_NONE: 755 if (p == NULL) 756 { 757 p = (bfd_byte *) bfd_malloc (allocsz); 758 if (p == NULL) 759 { 760 /* PR 20801: Provide a more helpful error message. */ 761 if (bfd_get_error () == bfd_error_no_memory) 762 _bfd_error_handler 763 /* xgettext:c-format */ 764 (_("error: %pB(%pA) is too large (%#" PRIx64 " bytes)"), 765 abfd, sec, (uint64_t) allocsz); 766 return false; 767 } 768 } 769 770 if (!bfd_get_section_contents (abfd, sec, p, 0, readsz)) 771 { 772 if (*ptr != p) 773 free (p); 774 return false; 775 } 776 *ptr = p; 777 return true; 778 779 case DECOMPRESS_SECTION_ZLIB: 780 case DECOMPRESS_SECTION_ZSTD: 781 /* Read in the full compressed section contents. */ 782 compressed_buffer = (bfd_byte *) bfd_malloc (sec->compressed_size); 783 if (compressed_buffer == NULL) 784 return false; 785 save_rawsize = sec->rawsize; 786 save_size = sec->size; 787 /* Clear rawsize, set size to compressed size and set compress_status 788 to COMPRESS_SECTION_NONE. If the compressed size is bigger than 789 the uncompressed size, bfd_get_section_contents will fail. */ 790 sec->rawsize = 0; 791 sec->size = sec->compressed_size; 792 sec->compress_status = COMPRESS_SECTION_NONE; 793 ret = bfd_get_section_contents (abfd, sec, compressed_buffer, 794 0, sec->compressed_size); 795 /* Restore rawsize and size. */ 796 sec->rawsize = save_rawsize; 797 sec->size = save_size; 798 sec->compress_status = compress_status; 799 if (!ret) 800 goto fail_compressed; 801 802 if (p == NULL) 803 p = (bfd_byte *) bfd_malloc (allocsz); 804 if (p == NULL) 805 goto fail_compressed; 806 807 compression_header_size = bfd_get_compression_header_size (abfd, sec); 808 if (compression_header_size == 0) 809 /* Set header size to the zlib header size if it is a 810 SHF_COMPRESSED section. */ 811 compression_header_size = 12; 812 bool is_zstd = compress_status == DECOMPRESS_SECTION_ZSTD; 813 if (!decompress_contents ( 814 is_zstd, compressed_buffer + compression_header_size, 815 sec->compressed_size - compression_header_size, p, readsz)) 816 { 817 bfd_set_error (bfd_error_bad_value); 818 if (p != *ptr) 819 free (p); 820 fail_compressed: 821 free (compressed_buffer); 822 return false; 823 } 824 825 free (compressed_buffer); 826 *ptr = p; 827 return true; 828 829 case COMPRESS_SECTION_DONE: 830 if (sec->contents == NULL) 831 return false; 832 if (p == NULL) 833 { 834 p = (bfd_byte *) bfd_malloc (allocsz); 835 if (p == NULL) 836 return false; 837 *ptr = p; 838 } 839 /* PR 17512; file: 5bc29788. */ 840 if (p != sec->contents) 841 memcpy (p, sec->contents, readsz); 842 return true; 843 844 default: 845 abort (); 846 } 847 } 848 849 /* 850 FUNCTION 851 bfd_is_section_compressed_info 852 853 SYNOPSIS 854 bool bfd_is_section_compressed_info 855 (bfd *abfd, asection *section, 856 int *compression_header_size_p, 857 bfd_size_type *uncompressed_size_p, 858 unsigned int *uncompressed_alignment_power_p, 859 enum compression_type *ch_type); 860 861 DESCRIPTION 862 Return @code{TRUE} if @var{section} is compressed. Compression 863 header size is returned in @var{compression_header_size_p}, 864 uncompressed size is returned in @var{uncompressed_size_p} 865 and the uncompressed data alignement power is returned in 866 @var{uncompressed_align_pow_p}. If compression is 867 unsupported, compression header size is returned with -1 868 and uncompressed size is returned with 0. 869 */ 870 871 bool 872 bfd_is_section_compressed_info (bfd *abfd, sec_ptr sec, 873 int *compression_header_size_p, 874 bfd_size_type *uncompressed_size_p, 875 unsigned int *uncompressed_align_pow_p, 876 enum compression_type *ch_type) 877 { 878 bfd_byte header[MAX_COMPRESSION_HEADER_SIZE]; 879 int compression_header_size; 880 int header_size; 881 unsigned int saved = sec->compress_status; 882 bool compressed; 883 884 *uncompressed_align_pow_p = 0; 885 886 compression_header_size = bfd_get_compression_header_size (abfd, sec); 887 if (compression_header_size > MAX_COMPRESSION_HEADER_SIZE) 888 abort (); 889 header_size = compression_header_size ? compression_header_size : 12; 890 891 /* Don't decompress the section. */ 892 sec->compress_status = COMPRESS_SECTION_NONE; 893 894 /* Read the header. */ 895 if (bfd_get_section_contents (abfd, sec, header, 0, header_size)) 896 { 897 if (compression_header_size == 0) 898 /* In this case, it should be "ZLIB" followed by the uncompressed 899 section size, 8 bytes in big-endian order. */ 900 compressed = startswith ((char*) header , "ZLIB"); 901 else 902 compressed = true; 903 } 904 else 905 compressed = false; 906 907 *uncompressed_size_p = sec->size; 908 if (compressed) 909 { 910 if (compression_header_size != 0) 911 { 912 if (!bfd_check_compression_header (abfd, header, sec, ch_type, 913 uncompressed_size_p, 914 uncompressed_align_pow_p)) 915 compression_header_size = -1; 916 } 917 /* Check for the pathalogical case of a debug string section that 918 contains the string ZLIB.... as the first entry. We assume that 919 no uncompressed .debug_str section would ever be big enough to 920 have the first byte of its (big-endian) size be non-zero. */ 921 else if (strcmp (sec->name, ".debug_str") == 0 922 && ISPRINT (header[4])) 923 compressed = false; 924 else 925 *uncompressed_size_p = bfd_getb64 (header + 4); 926 } 927 928 /* Restore compress_status. */ 929 sec->compress_status = saved; 930 *compression_header_size_p = compression_header_size; 931 return compressed; 932 } 933 934 /* 935 FUNCTION 936 bfd_is_section_compressed 937 938 SYNOPSIS 939 bool bfd_is_section_compressed 940 (bfd *abfd, asection *section); 941 942 DESCRIPTION 943 Return @code{TRUE} if @var{section} is compressed. 944 */ 945 946 bool 947 bfd_is_section_compressed (bfd *abfd, sec_ptr sec) 948 { 949 int compression_header_size; 950 bfd_size_type uncompressed_size; 951 unsigned int uncompressed_align_power; 952 enum compression_type ch_type; 953 return (bfd_is_section_compressed_info (abfd, sec, 954 &compression_header_size, 955 &uncompressed_size, 956 &uncompressed_align_power, 957 &ch_type) 958 && compression_header_size >= 0 959 && uncompressed_size > 0); 960 } 961 962 /* 963 FUNCTION 964 bfd_init_section_decompress_status 965 966 SYNOPSIS 967 bool bfd_init_section_decompress_status 968 (bfd *abfd, asection *section); 969 970 DESCRIPTION 971 Record compressed section size, update section size with 972 decompressed size and set compress_status to 973 DECOMPRESS_SECTION_{ZLIB,ZSTD}. 974 975 Return @code{FALSE} if the section is not a valid compressed 976 section. Otherwise, return @code{TRUE}. 977 */ 978 979 bool 980 bfd_init_section_decompress_status (bfd *abfd, sec_ptr sec) 981 { 982 bfd_byte header[MAX_COMPRESSION_HEADER_SIZE]; 983 int compression_header_size; 984 int header_size; 985 bfd_size_type uncompressed_size; 986 unsigned int uncompressed_alignment_power = 0; 987 enum compression_type ch_type; 988 z_stream strm; 989 990 compression_header_size = bfd_get_compression_header_size (abfd, sec); 991 if (compression_header_size > MAX_COMPRESSION_HEADER_SIZE) 992 abort (); 993 header_size = compression_header_size ? compression_header_size : 12; 994 995 /* Read the header. */ 996 if (sec->rawsize != 0 997 || sec->contents != NULL 998 || sec->compress_status != COMPRESS_SECTION_NONE 999 || !bfd_get_section_contents (abfd, sec, header, 0, header_size)) 1000 { 1001 bfd_set_error (bfd_error_invalid_operation); 1002 return false; 1003 } 1004 1005 if (compression_header_size == 0) 1006 { 1007 /* In this case, it should be "ZLIB" followed by the uncompressed 1008 section size, 8 bytes in big-endian order. */ 1009 if (! startswith ((char*) header, "ZLIB")) 1010 { 1011 bfd_set_error (bfd_error_wrong_format); 1012 return false; 1013 } 1014 uncompressed_size = bfd_getb64 (header + 4); 1015 ch_type = ch_none; 1016 } 1017 else if (!bfd_check_compression_header (abfd, header, sec, 1018 &ch_type, 1019 &uncompressed_size, 1020 &uncompressed_alignment_power)) 1021 { 1022 bfd_set_error (bfd_error_wrong_format); 1023 return false; 1024 } 1025 1026 /* PR28530, reject sizes unsupported by decompress_contents. */ 1027 strm.avail_in = sec->size; 1028 strm.avail_out = uncompressed_size; 1029 if (strm.avail_in != sec->size || strm.avail_out != uncompressed_size) 1030 { 1031 bfd_set_error (bfd_error_nonrepresentable_section); 1032 return false; 1033 } 1034 1035 sec->compressed_size = sec->size; 1036 sec->size = uncompressed_size; 1037 bfd_set_section_alignment (sec, uncompressed_alignment_power); 1038 sec->compress_status = (ch_type == ch_compress_zstd 1039 ? DECOMPRESS_SECTION_ZSTD : DECOMPRESS_SECTION_ZLIB); 1040 1041 return true; 1042 } 1043 1044 /* 1045 FUNCTION 1046 bfd_init_section_compress_status 1047 1048 SYNOPSIS 1049 bool bfd_init_section_compress_status 1050 (bfd *abfd, asection *section); 1051 1052 DESCRIPTION 1053 If open for read, compress section, update section size with 1054 compressed size and set compress_status to COMPRESS_SECTION_DONE. 1055 1056 Return @code{FALSE} if the section is not a valid compressed 1057 section. Otherwise, return @code{TRUE}. 1058 */ 1059 1060 bool 1061 bfd_init_section_compress_status (bfd *abfd, sec_ptr sec) 1062 { 1063 bfd_size_type uncompressed_size; 1064 bfd_byte *uncompressed_buffer; 1065 1066 /* Error if not opened for read. */ 1067 if (abfd->direction != read_direction 1068 || sec->size == 0 1069 || sec->rawsize != 0 1070 || sec->contents != NULL 1071 || sec->compress_status != COMPRESS_SECTION_NONE) 1072 { 1073 bfd_set_error (bfd_error_invalid_operation); 1074 return false; 1075 } 1076 1077 /* Read in the full section contents and compress it. */ 1078 uncompressed_size = sec->size; 1079 uncompressed_buffer = (bfd_byte *) bfd_malloc (uncompressed_size); 1080 /* PR 21431 */ 1081 if (uncompressed_buffer == NULL) 1082 return false; 1083 1084 if (!bfd_get_section_contents (abfd, sec, uncompressed_buffer, 1085 0, uncompressed_size)) 1086 return false; 1087 1088 sec->contents = uncompressed_buffer; 1089 if (bfd_compress_section_contents (abfd, sec) == 0) 1090 { 1091 free (sec->contents); 1092 sec->contents = NULL; 1093 return false; 1094 } 1095 return true; 1096 } 1097 1098 /* 1099 FUNCTION 1100 bfd_compress_section 1101 1102 SYNOPSIS 1103 bool bfd_compress_section 1104 (bfd *abfd, asection *section, bfd_byte *uncompressed_buffer); 1105 1106 DESCRIPTION 1107 If open for write, compress section, update section size with 1108 compressed size and set compress_status to COMPRESS_SECTION_DONE. 1109 1110 Return @code{FALSE} if compression fail. Otherwise, return 1111 @code{TRUE}. UNCOMPRESSED_BUFFER is freed in both cases. 1112 */ 1113 1114 bool 1115 bfd_compress_section (bfd *abfd, sec_ptr sec, bfd_byte *uncompressed_buffer) 1116 { 1117 bfd_size_type uncompressed_size = sec->size; 1118 1119 /* Error if not opened for write. */ 1120 if (abfd->direction != write_direction 1121 || uncompressed_size == 0 1122 || uncompressed_buffer == NULL 1123 || sec->contents != NULL 1124 || sec->compressed_size != 0 1125 || sec->compress_status != COMPRESS_SECTION_NONE) 1126 { 1127 bfd_set_error (bfd_error_invalid_operation); 1128 return false; 1129 } 1130 1131 sec->contents = uncompressed_buffer; 1132 if (bfd_compress_section_contents (abfd, sec) == 0) 1133 { 1134 free (sec->contents); 1135 sec->contents = NULL; 1136 return false; 1137 } 1138 return true; 1139 } 1140