/* Main header file for the bfd library -- portable access to object files.
- Copyright (C) 1990-2020 Free Software Foundation, Inc.
+ Copyright (C) 1990-2021 Free Software Foundation, Inc.
Contributed by Cygnus Support.
#include "ansidecl.h"
#include "symcat.h"
-#include "bfd_stdint.h"
+#include <stdint.h>
#include "diagnostics.h"
#include <stdarg.h>
+#include <string.h>
#include <sys/stat.h>
#if defined (__STDC__) || defined (ALMOST_STDC) || defined (HAVE_STRINGIZE)
comma and then the length of the string. Doing this by hand
is error prone, so using this macro is safer. */
#define STRING_COMMA_LEN(STR) (STR), (sizeof (STR) - 1)
-/* Unfortunately it is not possible to use the STRING_COMMA_LEN macro
- to create the arguments to another macro, since the preprocessor
- will mis-count the number of arguments to the outer macro (by not
- evaluating STRING_COMMA_LEN and so missing the comma). This is a
- problem for example when trying to use STRING_COMMA_LEN to build
- the arguments to the strncmp() macro. Hence this alternative
- definition of strncmp is provided here.
-
- Note - these macros do NOT work if STR2 is not a constant string. */
-#define CONST_STRNEQ(STR1,STR2) (strncmp ((STR1), (STR2), sizeof (STR2) - 1) == 0)
- /* strcpy() can have a similar problem, but since we know we are
- copying a constant string, we can use memcpy which will be faster
- since there is no need to check for a NUL byte inside STR. We
- can also save time if we do not need to copy the terminating NUL. */
-#define LITMEMCPY(DEST,STR2) memcpy ((DEST), (STR2), sizeof (STR2) - 1)
-#define LITSTRCPY(DEST,STR2) memcpy ((DEST), (STR2), sizeof (STR2))
-
#define BFD_SUPPORTS_PLUGINS @supports_plugins@
struct ecoff_extr;
struct bfd_link_info;
struct bfd_link_hash_entry;
+
+/* Return TRUE if the start of STR matches PREFIX, FALSE otherwise. */
+
+static inline bfd_boolean
+startswith (const char *str, const char *prefix)
+{
+ return strncmp (str, prefix, strlen (prefix)) == 0;
+}
/* Extracted from init.c. */
unsigned int bfd_init (void);
bfd *bfd_fdopenr (const char *filename, const char *target, int fd);
+bfd *bfd_fdopenw (const char *filename, const char *target, int fd);
+
bfd *bfd_openstreamr (const char * filename, const char * target,
void * stream);
char *bfd_follow_build_id_debuglink (bfd *abfd, const char *dir);
-void bfd_set_filename (bfd *abfd, char *filename);
+const char *bfd_set_filename (bfd *abfd, const char *filename);
/* Extracted from libbfd.c. */
struct bfd_section *s;
const char *linked_to_symbol_name;
} map_head, map_tail;
+ /* Points to the output section this section is already assigned to, if any.
+ This is used when support for non-contiguous memory regions is enabled. */
+ struct bfd_section *already_assigned;
+
} asection;
/* Relax table contains information about instructions which can
static inline bfd_boolean
bfd_is_const_section (const asection *sec)
{
- return sec >= bfd_abs_section_ptr && sec <= bfd_ind_section_ptr;
+ return (sec >= _bfd_std_section
+ && sec < _bfd_std_section + (sizeof (_bfd_std_section)
+ / sizeof (_bfd_std_section[0])));
}
/* Return TRUE if input section SEC has been discarded. */
/* name, id, section_id, index, next, prev, flags, user_set_vma, */ \
{ NAME, IDX, 0, 0, NULL, NULL, FLAGS, 0, \
\
- /* linker_mark, linker_has_input, gc_mark, decompress_status, */ \
+ /* linker_mark, linker_has_input, gc_mark, decompress_status, */ \
0, 0, 1, 0, \
\
- /* segment_mark, sec_info_type, use_rela_p, */ \
+ /* segment_mark, sec_info_type, use_rela_p, */ \
0, 0, 0, \
\
- /* sec_flg0, sec_flg1, sec_flg2, sec_flg3, sec_flg4, sec_flg5, */ \
+ /* sec_flg0, sec_flg1, sec_flg2, sec_flg3, sec_flg4, sec_flg5, */ \
0, 0, 0, 0, 0, 0, \
\
- /* vma, lma, size, rawsize, compressed_size, relax, relax_count, */ \
+ /* vma, lma, size, rawsize, compressed_size, relax, relax_count, */ \
0, 0, 0, 0, 0, 0, 0, \
\
- /* output_offset, output_section, alignment_power, */ \
+ /* output_offset, output_section, alignment_power, */ \
0, &SEC, 0, \
\
- /* relocation, orelocation, reloc_count, filepos, rel_filepos, */ \
+ /* relocation, orelocation, reloc_count, filepos, rel_filepos, */ \
NULL, NULL, 0, 0, 0, \
\
- /* line_filepos, userdata, contents, lineno, lineno_count, */ \
+ /* line_filepos, userdata, contents, lineno, lineno_count, */ \
0, NULL, NULL, NULL, 0, \
\
/* entsize, kept_section, moving_line_filepos, */ \
- 0, NULL, 0, \
+ 0, NULL, 0, \
\
- /* target_index, used_by_bfd, constructor_chain, owner, */ \
+ /* target_index, used_by_bfd, constructor_chain, owner, */ \
0, NULL, NULL, NULL, \
\
- /* symbol, symbol_ptr_ptr, */ \
+ /* symbol, symbol_ptr_ptr, */ \
(struct bfd_symbol *) SYM, &SEC.symbol, \
\
- /* map_head, map_tail */ \
- { NULL }, { NULL } \
+ /* map_head, map_tail, already_assigned */ \
+ { NULL }, { NULL }, NULL \
+ \
}
/* We use a macro to initialize the static asymbol structures because
bfd_arch_k1om, /* Intel K1OM. */
#define bfd_mach_k1om (1 << 6)
#define bfd_mach_k1om_intel_syntax (bfd_mach_k1om | bfd_mach_i386_intel_syntax)
-#define bfd_mach_i386_nacl (1 << 7)
-#define bfd_mach_i386_i386_nacl (bfd_mach_i386_i386 | bfd_mach_i386_nacl)
-#define bfd_mach_x86_64_nacl (bfd_mach_x86_64 | bfd_mach_i386_nacl)
-#define bfd_mach_x64_32_nacl (bfd_mach_x64_32 | bfd_mach_i386_nacl)
bfd_arch_iamcu, /* Intel MCU. */
#define bfd_mach_iamcu (1 << 8)
#define bfd_mach_i386_iamcu (bfd_mach_i386_i386 | bfd_mach_iamcu)
#define bfd_mach_iq10 2
bfd_arch_bpf, /* Linux eBPF. */
#define bfd_mach_bpf 1
+#define bfd_mach_xbpf 2
bfd_arch_epiphany, /* Adapteva EPIPHANY. */
#define bfd_mach_epiphany16 1
#define bfd_mach_epiphany32 2
#define bfd_mach_tilegx32 2
bfd_arch_aarch64, /* AArch64. */
#define bfd_mach_aarch64 0
+#define bfd_mach_aarch64_8R 1
#define bfd_mach_aarch64_ilp32 32
bfd_arch_nios2, /* Nios II. */
#define bfd_mach_nios2 0
#define bfd_mach_ck803 5
#define bfd_mach_ck807 6
#define bfd_mach_ck810 7
+#define bfd_mach_ck860 8
bfd_arch_last
};
BFD_RELOC_PPC_B26,
BFD_RELOC_PPC_BA26,
BFD_RELOC_PPC_TOC16,
+ BFD_RELOC_PPC_TOC16_LO,
+ BFD_RELOC_PPC_TOC16_HI,
BFD_RELOC_PPC_B16,
BFD_RELOC_PPC_B16_BRTAKEN,
BFD_RELOC_PPC_B16_BRNTAKEN,
BFD_RELOC_PPC_TLS,
BFD_RELOC_PPC_TLSGD,
BFD_RELOC_PPC_TLSLD,
+ BFD_RELOC_PPC_TLSLE,
+ BFD_RELOC_PPC_TLSIE,
+ BFD_RELOC_PPC_TLSM,
+ BFD_RELOC_PPC_TLSML,
BFD_RELOC_PPC_DTPMOD,
BFD_RELOC_PPC_TPREL16,
BFD_RELOC_PPC_TPREL16_LO,
BFD_RELOC_PPC_GOT_DTPREL16_LO,
BFD_RELOC_PPC_GOT_DTPREL16_HI,
BFD_RELOC_PPC_GOT_DTPREL16_HA,
+ BFD_RELOC_PPC64_TLSGD,
+ BFD_RELOC_PPC64_TLSLD,
+ BFD_RELOC_PPC64_TLSLE,
+ BFD_RELOC_PPC64_TLSIE,
+ BFD_RELOC_PPC64_TLSM,
+ BFD_RELOC_PPC64_TLSML,
BFD_RELOC_PPC64_TPREL16_DS,
BFD_RELOC_PPC64_TPREL16_LO_DS,
BFD_RELOC_PPC64_TPREL16_HIGH,
BFD_RELOC_PPC64_DTPREL16_HIGHESTA,
BFD_RELOC_PPC64_TPREL34,
BFD_RELOC_PPC64_DTPREL34,
- BFD_RELOC_PPC64_GOT_TLSGD34,
- BFD_RELOC_PPC64_GOT_TLSLD34,
- BFD_RELOC_PPC64_GOT_TPREL34,
- BFD_RELOC_PPC64_GOT_DTPREL34,
+ BFD_RELOC_PPC64_GOT_TLSGD_PCREL34,
+ BFD_RELOC_PPC64_GOT_TLSLD_PCREL34,
+ BFD_RELOC_PPC64_GOT_TPREL_PCREL34,
+ BFD_RELOC_PPC64_GOT_DTPREL_PCREL34,
BFD_RELOC_PPC64_TLS_PCREL,
/* IBM 370/390 relocations */
BFD_RELOC_MSP430_ABS_HI16,
BFD_RELOC_MSP430_PREL31,
BFD_RELOC_MSP430_SYM_DIFF,
+ BFD_RELOC_MSP430_SET_ULEB128,
+ BFD_RELOC_MSP430_SUB_ULEB128,
/* Relocations used by the Altera Nios II core. */
BFD_RELOC_NIOS2_S16,
PLT entries. Otherwise, this is just a generic 32-bit relocation. */
BFD_RELOC_XTENSA_PLT,
-/* Xtensa relocations to mark the difference of two local symbols.
+/* Xtensa relocations for backward compatibility. These have been replaced
+by BFD_RELOC_XTENSA_PDIFF and BFD_RELOC_XTENSA_NDIFF.
+Xtensa relocations to mark the difference of two local symbols.
These are only needed to support linker relaxation and can be ignored
when not relaxing. The field is set to the value of the difference
assuming no relaxation. The relocation encodes the position of the
BFD_RELOC_XTENSA_TLS_ARG,
BFD_RELOC_XTENSA_TLS_CALL,
+/* Xtensa relocations to mark the difference of two local symbols.
+These are only needed to support linker relaxation and can be ignored
+when not relaxing. The field is set to the value of the difference
+assuming no relaxation. The relocation encodes the position of the
+subtracted symbol so the linker can determine whether to adjust the field
+value. PDIFF relocations are used for positive differences, NDIFF
+relocations are used for negative differences. The difference value
+is treated as unsigned with these relocation types, giving full
+8/16 value ranges. */
+ BFD_RELOC_XTENSA_PDIFF8,
+ BFD_RELOC_XTENSA_PDIFF16,
+ BFD_RELOC_XTENSA_PDIFF32,
+ BFD_RELOC_XTENSA_NDIFF8,
+ BFD_RELOC_XTENSA_NDIFF16,
+ BFD_RELOC_XTENSA_NDIFF32,
+
/* 8 bit signed offset in (ix+d) or (iy+d). */
BFD_RELOC_Z80_DISP8,
with this name and type in use. BSF_OBJECT must also be set. */
#define BSF_GNU_UNIQUE (1 << 23)
+ /* This section symbol should be included in the symbol table. */
+#define BSF_SECTION_SYM_USED (1 << 24)
+
flagword flags;
/* A pointer to the section to which this symbol is
/* Set if this is a slim LTO object not loaded with a compiler plugin. */
unsigned int lto_slim_object : 1;
+ /* Do not attempt to modify this file. Set when detecting errors
+ that BFD is not prepared to handle for objcopy/strip. */
+ unsigned int read_only : 1;
+
/* Set to dummy BFD created when claimed by a compiler plug-in
library. */
bfd *plugin_dummy_bfd;
- /* Currently my_archive is tested before adding origin to
- anything. I believe that this can become always an add of
- origin, with origin set to 0 for non archive files. */
+ /* The offset of this bfd in the file, typically 0 if it is not
+ contained in an archive. */
ufile_ptr origin;
/* The origin in the archive of the proxy entry. This will
BFD_SEND (abfd, _bfd_debug_info_accumulate, (abfd, section))
#define bfd_stat_arch_elt(abfd, stat) \
- BFD_SEND (abfd, _bfd_stat_arch_elt,(abfd, stat))
+ BFD_SEND (abfd->my_archive ? abfd->my_archive : abfd, \
+ _bfd_stat_arch_elt, (abfd, stat))
#define bfd_update_armap_timestamp(abfd) \
BFD_SEND (abfd, _bfd_update_armap_timestamp, (abfd))
bfd_vma bfd_emul_get_maxpagesize (const char *);
-void bfd_emul_set_maxpagesize (const char *, bfd_vma);
-
bfd_vma bfd_emul_get_commonpagesize (const char *, bfd_boolean);
-void bfd_emul_set_commonpagesize (const char *, bfd_vma);
-
char *bfd_demangle (bfd *, const char *, int);
void bfd_update_compression_header
(bfd_assert (__FILE__,__LINE__), NULL))
#endif
+/* Defined to TRUE if unused section symbol should be kept. */
+#ifndef TARGET_KEEP_UNUSED_SECTION_SYMBOLS
+#define TARGET_KEEP_UNUSED_SECTION_SYMBOLS TRUE
+#endif
+
enum bfd_flavour
{
/* N.B. Update bfd_flavour_name if you change this. */
/* Forward declaration. */
typedef struct flag_info flag_info;
+typedef void (*bfd_cleanup) (bfd *);
+
typedef struct bfd_target
{
/* Identifies the kind of target, e.g., SunOS4, Ultrix, etc. */
possible targets when more than one target matches. */
unsigned char match_priority;
+ /* TRUE if unused section symbols should be kept. */
+ bfd_boolean keep_unused_section_symbols;
+
/* Entries for byte swapping for data. These are different from the
other entry points, since they don't take a BFD as the first argument.
Certain other handlers could do the same. */
/* Format dependent routines: these are vectors of entry points
within the target vector structure, one for each format to check. */
- /* Check the format of a file being read. Return a <<bfd_target *>> or zero. */
- const struct bfd_target *
- (*_bfd_check_format[bfd_type_end]) (bfd *);
+ /* Check the format of a file being read. Return a <<bfd_cleanup>> on
+ success or zero on failure. */
+ bfd_cleanup (*_bfd_check_format[bfd_type_end]) (bfd *);
/* Set the format of a file being written. */
bfd_boolean (*_bfd_set_format[bfd_type_end]) (bfd *);
#define bfd_get_symbol_info(b,p,e) \
BFD_SEND (b, _bfd_get_symbol_info, (b,p,e))
const char *(*_bfd_get_symbol_version_string) (bfd *, struct bfd_symbol *,
+ bfd_boolean,
bfd_boolean *);
-#define bfd_get_symbol_version_string(b,s,h) \
- BFD_SEND (b, _bfd_get_symbol_version_string, (b,s,h))
+#define bfd_get_symbol_version_string(b,s,p,h) \
+ BFD_SEND (b, _bfd_get_symbol_version_string, (b,s,p,h))
bfd_boolean (*_bfd_is_local_label_name) (bfd *, const char *);
bfd_boolean (*_bfd_is_target_special_symbol) (bfd *, asymbol *);
alent * (*_get_lineno) (bfd *, struct bfd_symbol *);
return sy->the_bfd->xvec->flavour;
}
+static inline bfd_boolean
+bfd_keep_unused_section_symbols (const bfd *abfd)
+{
+ return abfd->xvec->keep_unused_section_symbols;
+}
+
bfd_boolean bfd_set_default_target (const char *name);
const bfd_target *bfd_find_target (const char *target_name, bfd *abfd);