this size. */
extern unsigned long bfd_hash_set_default_size (unsigned long);
-/* Types of compressed DWARF debug sections. */
-enum compressed_debug_section_type
-{
- COMPRESS_DEBUG_NONE = 0,
- COMPRESS_DEBUG = 1 << 0,
- COMPRESS_DEBUG_GNU_ZLIB = COMPRESS_DEBUG | 1 << 1,
- COMPRESS_DEBUG_GABI_ZLIB = COMPRESS_DEBUG | 1 << 2,
- COMPRESS_DEBUG_ZSTD = COMPRESS_DEBUG | 1 << 3,
- COMPRESS_UNKNOWN = 1 << 4
-};
-
-/* Tuple for compressed_debug_section_type and their name. */
-
-struct compressed_type_tuple
-{
- enum compressed_debug_section_type type;
- const char *name;
-};
-
/* This structure is used to keep track of stabs in sections
information while linking. */
(bfd_window *);
extern bool bfd_get_file_window
(bfd *, file_ptr, bfd_size_type, bfd_window *, bool);
-
-
-extern enum compressed_debug_section_type bfd_get_compression_algorithm
- (const char *);
-extern const char *bfd_get_compression_algorithm_name
- (enum compressed_debug_section_type);
\f
/* Externally visible ELF routines. */
this size. */
extern unsigned long bfd_hash_set_default_size (unsigned long);
-/* Types of compressed DWARF debug sections. */
-enum compressed_debug_section_type
-{
- COMPRESS_DEBUG_NONE = 0,
- COMPRESS_DEBUG = 1 << 0,
- COMPRESS_DEBUG_GNU_ZLIB = COMPRESS_DEBUG | 1 << 1,
- COMPRESS_DEBUG_GABI_ZLIB = COMPRESS_DEBUG | 1 << 2,
- COMPRESS_DEBUG_ZSTD = COMPRESS_DEBUG | 1 << 3,
- COMPRESS_UNKNOWN = 1 << 4
-};
-
-/* Tuple for compressed_debug_section_type and their name. */
-
-struct compressed_type_tuple
-{
- enum compressed_debug_section_type type;
- const char *name;
-};
-
/* This structure is used to keep track of stabs in sections
information while linking. */
(bfd_window *);
extern bool bfd_get_file_window
(bfd *, file_ptr, bfd_size_type, bfd_window *, bool);
-
-
-extern enum compressed_debug_section_type bfd_get_compression_algorithm
- (const char *);
-extern const char *bfd_get_compression_algorithm_name
- (enum compressed_debug_section_type);
\f
/* Externally visible ELF routines. */
(bfd *abfd, asection *sec, bfd_byte *outbuf, asymbol **symbol_table);
/* Extracted from compress.c. */
+/* Types of compressed DWARF debug sections. */
+enum compressed_debug_section_type
+{
+ COMPRESS_DEBUG_NONE = 0,
+ COMPRESS_DEBUG_GNU_ZLIB = 1 << 1,
+ COMPRESS_DEBUG_GABI_ZLIB = 1 << 2,
+ COMPRESS_DEBUG_ZSTD = 1 << 3,
+ COMPRESS_UNKNOWN = 1 << 4
+};
+
+/* Tuple for compressed_debug_section_type and their name. */
+struct compressed_type_tuple
+{
+ enum compressed_debug_section_type type;
+ const char *name;
+};
+
+/* Compression header ch_type values. */
enum compression_type
{
ch_none = 0,
return new_name;
}
+enum compressed_debug_section_type
+bfd_get_compression_algorithm (const char *name);
+const char *bfd_get_compression_algorithm_name
+ (enum compressed_debug_section_type type);
void bfd_update_compression_header
(bfd *abfd, bfd_byte *contents, asection *sec);
#include "elf-bfd.h"
#include "libbfd.h"
#include "safe-ctype.h"
+#include "libiberty.h"
#define MAX_COMPRESSION_HEADER_SIZE 24
/*
CODE_FRAGMENT
+.{* Types of compressed DWARF debug sections. *}
+.enum compressed_debug_section_type
+.{
+. COMPRESS_DEBUG_NONE = 0,
+. COMPRESS_DEBUG_GNU_ZLIB = 1 << 1,
+. COMPRESS_DEBUG_GABI_ZLIB = 1 << 2,
+. COMPRESS_DEBUG_ZSTD = 1 << 3,
+. COMPRESS_UNKNOWN = 1 << 4
+.};
+.
+.{* Tuple for compressed_debug_section_type and their name. *}
+.struct compressed_type_tuple
+.{
+. enum compressed_debug_section_type type;
+. const char *name;
+.};
+.
+.{* Compression header ch_type values. *}
.enum compression_type
.{
. ch_none = 0,
.
*/
+/* Display texts for type of compressed DWARF debug sections. */
+static const struct compressed_type_tuple compressed_debug_section_names[] =
+{
+ { COMPRESS_DEBUG_NONE, "none" },
+ { COMPRESS_DEBUG_GABI_ZLIB, "zlib" },
+ { COMPRESS_DEBUG_GNU_ZLIB, "zlib-gnu" },
+ { COMPRESS_DEBUG_GABI_ZLIB, "zlib-gabi" },
+ { COMPRESS_DEBUG_ZSTD, "zstd" },
+};
+
+/*
+FUNCTION
+ bfd_get_compression_algorithm
+SYNOPSIS
+ enum compressed_debug_section_type
+ bfd_get_compression_algorithm (const char *name);
+DESCRIPTION
+ Return compressed_debug_section_type from a string representation.
+*/
+enum compressed_debug_section_type
+bfd_get_compression_algorithm (const char *name)
+{
+ for (unsigned i = 0; i < ARRAY_SIZE (compressed_debug_section_names); ++i)
+ if (strcasecmp (compressed_debug_section_names[i].name, name) == 0)
+ return compressed_debug_section_names[i].type;
+
+ return COMPRESS_UNKNOWN;
+}
+
+/*
+FUNCTION
+ bfd_get_compression_algorithm_name
+SYNOPSIS
+ const char *bfd_get_compression_algorithm_name
+ (enum compressed_debug_section_type type);
+DESCRIPTION
+ Return compression algorithm name based on the type.
+*/
+const char *
+bfd_get_compression_algorithm_name (enum compressed_debug_section_type type)
+{
+ for (unsigned i = 0; i < ARRAY_SIZE (compressed_debug_section_names); ++i)
+ if (type == compressed_debug_section_names[i].type)
+ return compressed_debug_section_names[i].name;
+
+ return NULL;
+}
+
/*
FUNCTION
bfd_update_compression_header
{
const char *name = *new_name;
- if ((ibfd->flags & (BFD_DECOMPRESS | BFD_COMPRESS_GABI)) != 0)
+ if ((obfd->flags & (BFD_DECOMPRESS | BFD_COMPRESS_GABI)) != 0)
{
/* When we decompress or compress with SHF_COMPRESSED,
convert section name from .zdebug_* to .debug_*. */
/* ld: compress DWARF debug sections with names: .debug_*. */
if (arg->link_info
- && (arg->link_info->compress_debug & COMPRESS_DEBUG) != 0
- && (asect->flags & SEC_DEBUGGING)
+ && (abfd->flags & BFD_COMPRESS) != 0
+ && (asect->flags & SEC_DEBUGGING) != 0
&& name[1] == 'd'
&& name[6] == '_')
{
{
return true;
}
-
-/* Display texts for type of compressed DWARF debug sections. */
-static const struct compressed_type_tuple compressed_debug_section_names[] =
-{
- { COMPRESS_DEBUG_NONE, "none" },
- { COMPRESS_DEBUG_GABI_ZLIB, "zlib" },
- { COMPRESS_DEBUG_GNU_ZLIB, "zlib-gnu" },
- { COMPRESS_DEBUG_GABI_ZLIB, "zlib-gabi" },
- { COMPRESS_DEBUG_ZSTD, "zstd" },
-};
-
-#ifndef ARRAY_SIZE
-#define ARRAY_SIZE(a) (sizeof (a) / sizeof ((a)[0]))
-#endif
-
-/* Return compressed_debug_section_type from a string representation. */
-enum compressed_debug_section_type
-bfd_get_compression_algorithm (const char *name)
-{
- for (unsigned i = 0; i < ARRAY_SIZE (compressed_debug_section_names); ++i)
- if (strcasecmp (compressed_debug_section_names[i].name, name) == 0)
- return compressed_debug_section_names[i].type;
-
- return COMPRESS_UNKNOWN;
-}
-
-/* Return compression algorithm name based on the type. */
-const char *
-bfd_get_compression_algorithm_name (enum compressed_debug_section_type type)
-{
- for (unsigned i = 0; i < ARRAY_SIZE (compressed_debug_section_names); ++i)
- if (type == compressed_debug_section_names[i].type)
- return compressed_debug_section_names[i].name;
-
- return NULL;
-}
switch (do_debug_sections)
{
+ case compress_gnu_zlib:
+ ibfd->flags |= BFD_COMPRESS;
+ break;
case compress:
case compress_zlib:
- case compress_gnu_zlib:
+ /* The above two cases ought to just set BFD_COMPRESS for non-ELF
+ but we can't tell whether a file is ELF or not until after
+ bfd_check_format_matches. FIXME maybe: decide compression
+ style in BFD after bfd_check_format_matches. */
case compress_gabi_zlib:
- ibfd->flags |= BFD_COMPRESS;
- /* Don't check if input is ELF here since this information is
- only available after bfd_check_format_matches is called. */
- if (do_debug_sections != compress_gnu_zlib)
- ibfd->flags |= BFD_COMPRESS_GABI;
+ ibfd->flags |= BFD_COMPRESS | BFD_COMPRESS_GABI;
break;
case compress_zstd:
ibfd->flags |= BFD_COMPRESS | BFD_COMPRESS_GABI | BFD_COMPRESS_ZSTD;
if (ctx == NULL)
return;
- if (flag_compress_debug == COMPRESS_DEBUG_GNU_ZLIB)
+ if ((abfd->flags & BFD_COMPRESS_GABI) == 0)
header_size = 12;
else
header_size = bfd_get_compression_header_size (stdoutput, NULL);
bfd_update_compression_header (abfd, (bfd_byte *) header, sec);
x = bfd_set_section_size (sec, compressed_size);
gas_assert (x);
- if (flag_compress_debug == COMPRESS_DEBUG_GNU_ZLIB
+ if ((abfd->flags & BFD_COMPRESS_GABI) == 0
&& section_name[1] == 'd')
{
compressed_name = concat (".z", section_name + 1, (char *) NULL);
contents of the debug sections. This needs to be done before
we start writing any sections, because it will affect the file
layout, which is fixed once we start writing contents. */
- if (flag_compress_debug)
+ if (flag_compress_debug != COMPRESS_DEBUG_NONE)
{
+ flagword flags = BFD_COMPRESS;
if (flag_compress_debug == COMPRESS_DEBUG_GABI_ZLIB)
- stdoutput->flags |= BFD_COMPRESS | BFD_COMPRESS_GABI;
+ flags = BFD_COMPRESS | BFD_COMPRESS_GABI;
else if (flag_compress_debug == COMPRESS_DEBUG_ZSTD)
- stdoutput->flags |= BFD_COMPRESS | BFD_COMPRESS_GABI | BFD_COMPRESS_ZSTD;
- else
- stdoutput->flags |= BFD_COMPRESS;
- bfd_map_over_sections (stdoutput, compress_debug, (char *) 0);
+ flags = BFD_COMPRESS | BFD_COMPRESS_GABI | BFD_COMPRESS_ZSTD;
+ stdoutput->flags |= flags & bfd_applicable_file_flags (stdoutput);
+ if ((stdoutput->flags & BFD_COMPRESS) != 0)
+ bfd_map_over_sections (stdoutput, compress_debug, (char *) 0);
}
bfd_map_over_sections (stdoutput, write_contents, (char *) 0);
/* Separator between archive and filename in linker script filespecs. */
char path_separator;
- /* Compress DWARF debug sections. */
- enum compressed_debug_section_type compress_debug;
-
/* Default stack size. Zero means default (often zero itself), -1
means explicitly zero-sized. */
bfd_signed_vma stacksize;
break;
case OPTION_COMPRESS_DEBUG:
- link_info.compress_debug = bfd_get_compression_algorithm (optarg);
+ config.compress_debug = bfd_get_compression_algorithm (optarg);
if (strcasecmp (optarg, "zstd") == 0)
{
#ifndef HAVE_ZSTD
- if (link_info.compress_debug == COMPRESS_DEBUG_ZSTD)
+ if (config.compress_debug == COMPRESS_DEBUG_ZSTD)
einfo (_ ("%F%P: --compress-debug-sections=zstd: ld is not built "
"with zstd support\n"));
#endif
}
- if (link_info.compress_debug == COMPRESS_UNKNOWN)
+ if (config.compress_debug == COMPRESS_UNKNOWN)
einfo (_("%F%P: invalid --compress-debug-sections option: \`%s'\n"),
optarg);
break;
/* If set, share only duplicated types in CTF, rather than sharing
all types that are not in conflict. */
bool ctf_share_duplicated;
+
+ /* Compress DWARF debug sections. */
+ enum compressed_debug_section_type compress_debug;
} ld_config_type;
extern ld_config_type config;
link_info.spare_dynamic_tags = 5;
link_info.path_separator = ':';
#ifdef DEFAULT_FLAG_COMPRESS_DEBUG
- link_info.compress_debug = DEFAULT_COMPRESSED_DEBUG_ALGORITHM;
+ config.compress_debug = DEFAULT_COMPRESSED_DEBUG_ALGORITHM;
#endif
#ifdef DEFAULT_NEW_DTAGS
link_info.new_dtags = DEFAULT_NEW_DTAGS;
else
link_info.output_bfd->flags |= EXEC_P;
- if ((link_info.compress_debug & COMPRESS_DEBUG))
+ flagword flags = 0;
+ switch (config.compress_debug)
{
- link_info.output_bfd->flags |= BFD_COMPRESS;
- if (link_info.compress_debug != COMPRESS_DEBUG_GNU_ZLIB)
- {
- link_info.output_bfd->flags |= BFD_COMPRESS_GABI;
- if (link_info.compress_debug == COMPRESS_DEBUG_ZSTD)
- link_info.output_bfd->flags |= BFD_COMPRESS_ZSTD;
- }
+ case COMPRESS_DEBUG_GNU_ZLIB:
+ flags = BFD_COMPRESS;
+ break;
+ case COMPRESS_DEBUG_GABI_ZLIB:
+ flags = BFD_COMPRESS | BFD_COMPRESS_GABI;
+ break;
+ case COMPRESS_DEBUG_ZSTD:
+ flags = BFD_COMPRESS | BFD_COMPRESS_GABI | BFD_COMPRESS_ZSTD;
+ break;
+ default:
+ break;
}
+ link_info.output_bfd->flags
+ |= flags & bfd_applicable_file_flags (link_info.output_bfd);
ldwrite ();
Compress DWARF debug sections\n"));
fprintf (file, _("\
Default: %s\n"),
- bfd_get_compression_algorithm_name (link_info.compress_debug));
+ bfd_get_compression_algorithm_name (config.compress_debug));
fprintf (file, _("\
-z common-page-size=SIZE Set common page size to SIZE\n"));
fprintf (file, _("\