/* Generic BFD library interface and support routines.
- Copyright (C) 1990-2019 Free Software Foundation, Inc.
+ Copyright (C) 1990-2020 Free Software Foundation, Inc.
Written by Cygnus Support.
This file is part of BFD, the Binary File Descriptor library.
. ENUM_BITFIELD (bfd_direction) direction : 2;
.
. {* Format_specific flags. *}
-. flagword flags : 20;
+. flagword flags;
.
. {* Values that may appear in the flags field of a BFD. These also
. appear in the object_flags field of the bfd_target structure, where
. {* Use the ELF STT_COMMON type in this BFD. *}
.#define BFD_USE_ELF_STT_COMMON 0x80000
.
+. {* Put pathnames into archives (non-POSIX). *}
+.#define BFD_ARCHIVE_FULL_PATH 0x100000
+.
. {* Flags bits to be saved in bfd_preserve_save. *}
.#define BFD_FLAGS_SAVED \
. (BFD_IN_MEMORY | BFD_COMPRESS | BFD_DECOMPRESS | BFD_LINKER_CREATED \
.static inline bfd_size_type
.bfd_get_section_limit (const bfd *abfd, const asection *sec)
.{
-. return bfd_get_section_limit_octets (abfd, sec) / bfd_octets_per_byte (abfd);
+. return (bfd_get_section_limit_octets (abfd, sec)
+. / bfd_octets_per_byte (abfd, sec));
.}
.
.{* Functions to handle insertion and deletion of a bfd's sections. These
. bfd_error_bad_value,
. bfd_error_file_truncated,
. bfd_error_file_too_big,
+. bfd_error_sorry,
. bfd_error_on_input,
. bfd_error_invalid_error_code
.}
N_("bad value"),
N_("file truncated"),
N_("file too big"),
+ N_("sorry, cannot handle this file"),
N_("error reading %s: %s"),
N_("#<invalid error code>")
};
bfd_update_compression_header (bfd *abfd, bfd_byte *contents,
asection *sec)
{
- if ((abfd->flags & BFD_COMPRESS) != 0)
+ if ((abfd->flags & BFD_COMPRESS) == 0)
+ abort ();
+
+ switch (bfd_get_flavour (abfd))
{
- if (bfd_get_flavour (abfd) == bfd_target_elf_flavour)
+ case bfd_target_elf_flavour:
+ if ((abfd->flags & BFD_COMPRESS_GABI) != 0)
{
- if ((abfd->flags & BFD_COMPRESS_GABI) != 0)
- {
- const struct elf_backend_data *bed
- = get_elf_backend_data (abfd);
+ const struct elf_backend_data *bed = get_elf_backend_data (abfd);
- /* Set the SHF_COMPRESSED bit. */
- elf_section_flags (sec) |= SHF_COMPRESSED;
+ /* Set the SHF_COMPRESSED bit. */
+ elf_section_flags (sec) |= SHF_COMPRESSED;
- if (bed->s->elfclass == ELFCLASS32)
- {
- Elf32_External_Chdr *echdr
- = (Elf32_External_Chdr *) contents;
- bfd_put_32 (abfd, ELFCOMPRESS_ZLIB, &echdr->ch_type);
- bfd_put_32 (abfd, sec->size, &echdr->ch_size);
- bfd_put_32 (abfd, 1 << sec->alignment_power,
- &echdr->ch_addralign);
- /* bfd_log2 (alignof (Elf32_Chdr)) */
- bfd_set_section_alignment (sec, 2);
- }
- else
- {
- Elf64_External_Chdr *echdr
- = (Elf64_External_Chdr *) contents;
- bfd_put_32 (abfd, ELFCOMPRESS_ZLIB, &echdr->ch_type);
- bfd_put_32 (abfd, 0, &echdr->ch_reserved);
- bfd_put_64 (abfd, sec->size, &echdr->ch_size);
- bfd_put_64 (abfd, 1 << sec->alignment_power,
- &echdr->ch_addralign);
- /* bfd_log2 (alignof (Elf64_Chdr)) */
- bfd_set_section_alignment (sec, 3);
- }
+ if (bed->s->elfclass == ELFCLASS32)
+ {
+ Elf32_External_Chdr *echdr = (Elf32_External_Chdr *) contents;
+ bfd_put_32 (abfd, ELFCOMPRESS_ZLIB, &echdr->ch_type);
+ bfd_put_32 (abfd, sec->size, &echdr->ch_size);
+ bfd_put_32 (abfd, 1 << sec->alignment_power,
+ &echdr->ch_addralign);
+ /* bfd_log2 (alignof (Elf32_Chdr)) */
+ bfd_set_section_alignment (sec, 2);
}
else
{
- /* Clear the SHF_COMPRESSED bit. */
- elf_section_flags (sec) &= ~SHF_COMPRESSED;
-
- /* Write the zlib header. It should be "ZLIB" followed by
- the uncompressed section size, 8 bytes in big-endian
- order. */
- memcpy (contents, "ZLIB", 4);
- bfd_putb64 (sec->size, contents + 4);
- /* No way to keep the original alignment, just use 1 always. */
- bfd_set_section_alignment (sec, 0);
+ Elf64_External_Chdr *echdr = (Elf64_External_Chdr *) contents;
+ bfd_put_32 (abfd, ELFCOMPRESS_ZLIB, &echdr->ch_type);
+ bfd_put_32 (abfd, 0, &echdr->ch_reserved);
+ bfd_put_64 (abfd, sec->size, &echdr->ch_size);
+ bfd_put_64 (abfd, 1 << sec->alignment_power,
+ &echdr->ch_addralign);
+ /* bfd_log2 (alignof (Elf64_Chdr)) */
+ bfd_set_section_alignment (sec, 3);
}
+ break;
}
+
+ /* Clear the SHF_COMPRESSED bit. */
+ elf_section_flags (sec) &= ~SHF_COMPRESSED;
+ /* Fall through. */
+
+ default:
+ /* Write the zlib header. It should be "ZLIB" followed by
+ the uncompressed section size, 8 bytes in big-endian
+ order. */
+ memcpy (contents, "ZLIB", 4);
+ bfd_putb64 (sec->size, contents + 4);
+ /* No way to keep the original alignment, just use 1 always. */
+ bfd_set_section_alignment (sec, 0);
+ break;
}
- else
- abort ();
}
/*