/* 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.
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
};
asection *srelgot;
asection *splt;
asection *srelplt;
+ asection *sdynbss;
+ asection *srelbss;
+ asection *sdynrelro;
+ asection *sreldynrelro;
asection *igotplt;
asection *iplt;
asection *irelplt;
(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 *, 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)
unsigned int (*elf_backend_count_additional_relocs)
(asection *);
- /* Count relocations to be output. The result may be different if the
- input relocations are expected to be modified by the backend. */
- unsigned int (* elf_backend_count_output_relocs)
- (struct bfd_link_info *, asection *, bfd_boolean is_rela);
-
/* Say whether to sort relocs output by ld -r and ld --emit-relocs,
by r_offset. If NULL, default to true. */
bfd_boolean (*sort_relocs_p)
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 *, Elf_Internal_Shdr *, Elf_Internal_Rela *,
struct elf_link_hash_entry **);
-extern unsigned int _bfd_elf_default_count_output_relocs
- (struct bfd_link_info * ATTRIBUTE_UNUSED, asection *, bfd_boolean);
-
extern bfd_boolean _bfd_elf_adjust_dynamic_copy
(struct bfd_link_info *, struct elf_link_hash_entry *, asection *);
(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. */
+/* 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);