/* BFD back-end data structures for ELF files.
- Copyright (C) 1992-2016 Free Software Foundation, Inc.
+ Copyright (C) 1992-2017 Free Software Foundation, Inc.
Written by Cygnus Support.
This file is part of BFD, the Binary File Descriptor library.
{
AARCH64_ELF_DATA = 1,
ALPHA_ELF_DATA,
+ ARC_ELF_DATA,
ARM_ELF_DATA,
AVR_ELF_DATA,
BFIN_ELF_DATA,
OR1K_ELF_DATA,
PPC32_ELF_DATA,
PPC64_ELF_DATA,
+ PRU_ELF_DATA,
S390_ELF_DATA,
SH_ELF_DATA,
SPARC_ELF_DATA,
XGATE_ELF_DATA,
TILEGX_ELF_DATA,
TILEPRO_ELF_DATA,
+ RISCV_ELF_DATA,
GENERIC_ELF_DATA
};
/* The number of symbols found in the link which is intended for the
mandatory DT_SYMTAB tag (.dynsym section) in .dynamic section. */
bfd_size_type dynsymcount;
+ bfd_size_type local_dynsymcount;
/* The string table of dynamic symbols, which becomes the .dynstr
section. */
asection *srelgot;
asection *splt;
asection *srelplt;
+ asection *sdynbss;
+ asection *srelbss;
+ asection *sdynrelro;
+ asection *sreldynrelro;
asection *igotplt;
asection *iplt;
asection *irelplt;
enum elf_reloc_type_class {
reloc_class_normal,
reloc_class_relative,
- reloc_class_plt,
reloc_class_copy,
- reloc_class_ifunc
+ reloc_class_ifunc,
+ reloc_class_plt
};
struct elf_reloc_cookie
(asection *, struct bfd_link_info *, Elf_Internal_Rela *,
struct elf_link_hash_entry *, Elf_Internal_Sym *);
+struct bfd_elf_section_reloc_data;
+
struct elf_backend_data
{
/* The architecture for this backend. */
/* The ELF machine code (EM_xxxx) for this backend. */
int elf_machine_code;
- /* EI_OSABI. */
+ /* EI_OSABI. */
int elf_osabi;
/* The maximum page size for this backend. */
bfd_boolean (*elf_backend_modify_program_headers)
(bfd *, struct bfd_link_info *);
+ /* This function is called to see if the PHDR header should be
+ checked for validity. */
+ bfd_boolean (*elf_backend_allow_non_load_phdr)
+ (bfd *, const Elf_Internal_Phdr *, unsigned);
+
/* This function is called before section garbage collection to
mark entry symbol sections. */
void (*gc_keep)
bfd_boolean (*) (void *, const char *, Elf_Internal_Sym *, asection *,
struct elf_link_hash_entry *));
+ /* Filter what symbols of the output file to include in the import
+ library if one is created. */
+ unsigned int (*elf_backend_filter_implib_symbols)
+ (bfd *, struct bfd_link_info *, asymbol **, long);
+
/* Copy any information related to dynamic linking from a pre-existing
symbol to a newly created symbol. Also called to copy flags and
other back-end info to a weakdef, in which case the symbol is not
(bfd *, asection *, Elf_Internal_Shdr *, Elf_Internal_Rela *,
struct elf_link_hash_entry **);
+ /* Update relocations. It is allowed to change the number and the order.
+ In such a case hashes should be invalidated. */
+ void (*elf_backend_update_relocs)
+ (asection *, struct bfd_elf_section_reloc_data *);
+
/* Count relocations. Not called for relocatable links
or if all relocs are being preserved in the output. */
unsigned int (*elf_backend_count_relocs)
Elf_Internal_Shdr *osection);
/* Used to handle bad SHF_LINK_ORDER input. */
- bfd_error_handler_type link_order_error_handler;
+ void (*link_order_error_handler) (const char *, ...);
/* Name of the PLT relocation section. */
const char *relplt_name;
/* This is non-zero if static TLS segments require a special alignment. */
unsigned static_tls_alignment;
- /* Alignment for the PT_GNU_STACK segment. */
+ /* Alignment for the PT_GNU_STACK segment. */
unsigned stack_align;
/* Flag bits to assign to a section of type SHT_STRTAB. */
backend relocate_section routine for relocatable linking. */
unsigned rela_normal : 1;
+ /* Set if DT_REL/DT_RELA/DT_RELSZ/DT_RELASZ should not include PLT
+ relocations. */
+ unsigned dtrel_excludes_plt : 1;
+
/* TRUE if addresses "naturally" sign extend. This is used when
swapping in from Elf32 when BFD64. */
unsigned sign_extend_vma : 1;
unsigned can_refcount : 1;
unsigned want_got_sym : 1;
unsigned want_dynbss : 1;
+ unsigned want_dynrelro : 1;
/* Targets which do not support physical addressing often require
that the p_paddr field in the section header to be set to zero.
This field indicates whether this behavior is required. */
unsigned want_p_paddr_set_to_zero : 1;
+ /* Target has broken hardware and/or kernel that requires pages not
+ to be mapped twice with different permissions. */
+ unsigned no_page_alias : 1;
+
/* True if an object file lacking a .note.GNU-stack section
should be assumed to be requesting exec stack. At least one
other file in the link needs to have a .note.GNU-stack section
symbol type or STB_GNU_UNIQUE binding. Used to set the osabi
field in the ELF header structure. */
enum elf_gnu_symbols
- {
- elf_gnu_symbol_none = 0,
- elf_gnu_symbol_any = 1 << 0,
- elf_gnu_symbol_ifunc = (elf_gnu_symbol_any | 1 << 1),
- elf_gnu_symbol_unique = (elf_gnu_symbol_any | 1 << 2),
- elf_gnu_symbol_all = (elf_gnu_symbol_ifunc | elf_gnu_symbol_unique)
- };
+{
+ elf_gnu_symbol_none = 0,
+ elf_gnu_symbol_any = 1 << 0,
+ elf_gnu_symbol_ifunc = (elf_gnu_symbol_any | 1 << 1),
+ elf_gnu_symbol_unique = (elf_gnu_symbol_any | 1 << 2),
+ elf_gnu_symbol_all = (elf_gnu_symbol_ifunc | elf_gnu_symbol_unique)
+};
typedef struct elf_section_list
{
unsigned int ndx;
struct elf_section_list * next;
} elf_section_list;
-
-
+
/* Some private data is stashed away for future use using the tdata pointer
in the bfd structure. */
(bfd *, asection *, struct bfd_link_info *);
extern void bfd_elf_set_group_contents
(bfd *, asection *, void *);
+extern unsigned int _bfd_elf_filter_global_symbols
+ (bfd *, struct bfd_link_info *, asymbol **, long);
extern asection *_bfd_elf_check_kept_section
(asection *, struct bfd_link_info *);
#define _bfd_elf_link_just_syms _bfd_generic_link_just_syms
(void);
extern void _bfd_elf_strtab_free
(struct elf_strtab_hash *);
-extern bfd_size_type _bfd_elf_strtab_add
+extern size_t _bfd_elf_strtab_add
(struct elf_strtab_hash *, const char *, bfd_boolean);
extern void _bfd_elf_strtab_addref
- (struct elf_strtab_hash *, bfd_size_type);
+ (struct elf_strtab_hash *, size_t);
extern void _bfd_elf_strtab_delref
- (struct elf_strtab_hash *, bfd_size_type);
+ (struct elf_strtab_hash *, size_t);
extern unsigned int _bfd_elf_strtab_refcount
- (struct elf_strtab_hash *, bfd_size_type);
+ (struct elf_strtab_hash *, size_t);
extern void _bfd_elf_strtab_clear_all_refs
- (struct elf_strtab_hash *tab);
-extern void _bfd_elf_strtab_restore_size
- (struct elf_strtab_hash *, bfd_size_type);
+ (struct elf_strtab_hash *);
+extern void *_bfd_elf_strtab_save
+ (struct elf_strtab_hash *);
+extern void _bfd_elf_strtab_restore
+ (struct elf_strtab_hash *, void *);
extern bfd_size_type _bfd_elf_strtab_size
(struct elf_strtab_hash *);
extern bfd_size_type _bfd_elf_strtab_offset
- (struct elf_strtab_hash *, bfd_size_type);
+ (struct elf_strtab_hash *, size_t);
extern bfd_boolean _bfd_elf_strtab_emit
(bfd *, struct elf_strtab_hash *);
extern void _bfd_elf_strtab_finalize
extern Elf_Internal_Phdr * _bfd_elf_find_segment_containing_section
(bfd * abfd, asection * section);
-/* Exported interface for writing elf corefile notes. */
+/* PowerPC @tls opcode transform/validate. */
+extern unsigned int _bfd_elf_ppc_at_tls_transform
+ (unsigned int, unsigned int);
+/* PowerPC @tprel opcode transform/validate. */
+extern unsigned int _bfd_elf_ppc_at_tprel_transform
+ (unsigned int, unsigned int);
+/* PowerPC elf_object_p tweak. */
+extern bfd_boolean _bfd_elf_ppc_set_arch (bfd *);
+/* PowerPC .gnu.attributes handling common to both 32-bit and 64-bit. */
+extern void _bfd_elf_ppc_merge_fp_attributes (bfd *, struct bfd_link_info *);
+
+/* Exported interface for writing elf corefile notes. */
extern char *elfcore_write_note
(bfd *, char *, int *, const char *, int, const void *, int);
extern char *elfcore_write_prpsinfo
extern void _bfd_elf_copy_obj_attributes (bfd *, bfd *);
extern int _bfd_elf_obj_attrs_arg_type (bfd *, int, unsigned int);
extern void _bfd_elf_parse_attributes (bfd *, Elf_Internal_Shdr *);
-extern bfd_boolean _bfd_elf_merge_object_attributes (bfd *, bfd *);
+extern bfd_boolean _bfd_elf_merge_object_attributes
+ (bfd *, struct bfd_link_info *);
extern bfd_boolean _bfd_elf_merge_unknown_attribute_low (bfd *, bfd *, int);
extern bfd_boolean _bfd_elf_merge_unknown_attribute_list (bfd *, bfd *);
extern Elf_Internal_Shdr *_bfd_elf_single_rel_hdr (asection *sec);
extern bfd_boolean _bfd_elf_allocate_ifunc_dyn_relocs
(struct bfd_link_info *, struct elf_link_hash_entry *,
struct elf_dyn_relocs **, bfd_boolean *, unsigned int,
- unsigned int, unsigned int);
+ unsigned int, unsigned int, bfd_boolean);
extern long _bfd_elf_ifunc_get_synthetic_symtab
(bfd *, long, asymbol **, long, asymbol **, asymbol **, asection *,
bfd_vma *(*) (bfd *, asymbol **, asection *, asection *));
bfd_boolean err; \
err = (info->unresolved_syms_in_objects == RM_GENERATE_ERROR \
|| ELF_ST_VISIBILITY (h->other) != STV_DEFAULT); \
- if (!info->callbacks->undefined_symbol (info, \
- h->root.root.string, \
- input_bfd, \
- input_section, \
- rel->r_offset, err)) \
- return FALSE; \
+ (*info->callbacks->undefined_symbol) (info, \
+ h->root.root.string, \
+ input_bfd, \
+ input_section, \
+ rel->r_offset, err); \
warned = TRUE; \
} \
(void) unresolved_reloc; \