/* bfdlink.h -- header file for BFD link routines
- Copyright (C) 1993-2017 Free Software Foundation, Inc.
+ Copyright (C) 1993-2020 Free Software Foundation, Inc.
Written by Steve Chamberlain and Ian Lance Taylor, Cygnus Support.
This file is part of BFD, the Binary File Descriptor library.
discard_all /* Discard all locals. */
};
+enum notice_asneeded_action {
+ notice_as_needed,
+ notice_not_needed,
+ notice_needed
+};
+
/* Whether to generate ELF common symbols with the STT_COMMON type
during a relocatable link. */
enum bfd_link_elf_stt_common
/* Type of this entry. */
ENUM_BITFIELD (bfd_link_hash_type) type : 8;
- /* Symbol is referenced in a normal object file, as distict from a LTO
- IR object file. */
- unsigned int non_ir_ref : 1;
+ /* Symbol is referenced in a normal regular object file,
+ as distinct from a LTO IR object file. */
+ unsigned int non_ir_ref_regular : 1;
+
+ /* Symbol is referenced in a normal dynamic object file,
+ as distinct from a LTO IR object file. */
+ unsigned int non_ir_ref_dynamic : 1;
/* Symbol is a built-in define. These will be overridden by PROVIDE
in a linker script. */
/* Symbol defined in a linker script. */
unsigned int ldscript_def : 1;
+ /* Symbol will be converted from absolute to section-relative. Set for
+ symbols defined by a script from "dot" (also SEGMENT_START or ORIGIN)
+ outside of an output section statement. */
+ unsigned int rel_from_abs : 1;
+
/* A union of information depending upon the type. */
union
{
struct bfd_link_hash_entry *next;
/* BFD symbol was found in. */
bfd *abfd;
- /* For __start_<name> and __stop_<name> symbols, the first
- input section matching the name. */
- asection *section;
} undef;
/* bfd_link_hash_defined, bfd_link_hash_defweak. */
struct
allowed to set the value. */
RM_NOT_YET_SET = 0,
RM_IGNORE,
- RM_GENERATE_WARNING,
- RM_GENERATE_ERROR
+ RM_DIAGNOSE,
};
typedef enum {with_flags, without_flags} flag_type;
/* TRUE if all data symbols should be dynamic. */
unsigned int dynamic_data: 1;
+ /* TRUE if section groups should be resolved. */
+ unsigned int resolve_section_groups: 1;
+
+ /* Set if output file is big-endian, or if that is unknown, from
+ the command line or first input file endianness. */
+ unsigned int big_endian : 1;
+
/* Which symbols to strip. */
ENUM_BITFIELD (bfd_link_strip) strip : 2;
ENUM_BITFIELD (bfd_link_elf_stt_common) elf_stt_common : 2;
/* Criteria for skipping symbols when determining
- whether to include an object from an archive. */
+ whether to include an object from an archive. */
ENUM_BITFIELD (bfd_link_common_skip_ar_symbols) common_skip_ar_symbols : 2;
/* What to do with unresolved symbols in an object file.
The same defaults apply. */
ENUM_BITFIELD (report_method) unresolved_syms_in_shared_libs : 2;
+ /* TRUE if unresolved symbols are to be warned, rather than errored. */
+ unsigned int warn_unresolved_syms: 1;
+
/* TRUE if shared objects should be linked directly, not shared. */
unsigned int static_link: 1;
/* TRUE if PT_GNU_RELRO segment should be created. */
unsigned int relro: 1;
+ /* TRUE if separate code segment should be created. */
+ unsigned int separate_code: 1;
+
/* Nonzero if .eh_frame_hdr section and PT_GNU_EH_FRAME ELF segment
should be created. 1 for DWARF2 tables, 2 for compact tables. */
unsigned int eh_frame_hdr_type: 2;
/* TRUE if ok to have multiple definition. */
unsigned int allow_multiple_definition: 1;
+ /* TRUE if ok to have prohibit multiple definition of absolute symbols. */
+ unsigned int prohibit_multiple_definition_absolute: 1;
+
/* TRUE if ok to have version with no definition. */
unsigned int allow_undefined_version: 1;
/* TRUE if the linker script contained an explicit PHDRS command. */
unsigned int user_phdrs: 1;
+ /* TRUE if program headers ought to be loaded. */
+ unsigned int load_phdrs: 1;
+
/* TRUE if we should check relocations after all input files have
been opened. */
unsigned int check_relocs_after_open_input: 1;
- /* TRUE if BND prefix in PLT entries is always generated. */
- unsigned int bndplt: 1;
-
/* TRUE if generation of .interp/PT_INTERP should be suppressed. */
unsigned int nointerp: 1;
- /* TRUE if we shouldn't check relocation overflow. */
- unsigned int no_reloc_overflow_check: 1;
+ /* TRUE if common symbols should be treated as undefined. */
+ unsigned int inhibit_common_definition : 1;
+
+ /* TRUE if "-Map map" is passed to linker. */
+ unsigned int has_map_file : 1;
- /* TRUE if generate a 1-byte NOP as suffix for x86 call instruction. */
- unsigned int call_nop_as_suffix : 1;
+ /* TRUE if "--enable-non-contiguous-regions" is passed to the
+ linker. */
+ unsigned int non_contiguous_regions : 1;
- /* The 1-byte NOP for x86 call instruction. */
- char call_nop_byte;
+ /* TRUE if "--enable-non-contiguous-regions-warnings" is passed to
+ the linker. */
+ unsigned int non_contiguous_regions_warnings : 1;
/* Char that may appear as the first char of a symbol, but should be
skipped (like symbol_leading_char) when looking up symbols in
backend to decide. */
int extern_protected_data;
- /* > 0 to treat undefined weak symbol in the executable as dynamic,
- requiring dynamic relocation. */
+ /* 1 to make undefined weak symbols dynamic when building a dynamic
+ object. 0 to resolve undefined weak symbols to zero. -1 to let
+ the backend decide. */
int dynamic_undefined_weak;
/* Non-zero if auto-import thunks for DATA items in pei386 DLLs
struct bfd_elf_version_tree *version_info;
};
+/* Some forward-definitions used by some callbacks. */
+
+struct elf_strtab_hash;
+struct elf_sym_strtab;
+
/* This structures holds a set of callback functions. These are called
by the BFD linker routines. */
(struct bfd_link_info *, bfd * abfd,
asection * current_section, asection * previous_section,
bfd_boolean new_segment);
+ /* This callback provides a chance for callers of the BFD to examine the
+ ELF string table and symbol table once they are complete and indexes and
+ offsets assigned. */
+ void (*examine_strtab)
+ (struct elf_sym_strtab *syms, bfd_size_type symcount,
+ struct elf_strtab_hash *symstrtab);
+ /* This callback should emit the CTF section into a non-loadable section in
+ the output BFD named .ctf or a name beginning with ".ctf.". */
+ void (*emit_ctf)
+ (void);
};
\f
/* The linker builds link_order structures which tell the code how to
struct bfd_link_order *next;
/* Type of link_order. */
enum bfd_link_order_type type;
- /* Offset within output section. */
+ /* Offset within output section in bytes. */
bfd_vma offset;
- /* Size within output section. */
+ /* Size within output section in octets. */
bfd_size_type size;
/* Type specific information. */
union
/* Allocate a new link_order for a section. */
extern struct bfd_link_order *bfd_new_link_order (bfd *, asection *);
+struct bfd_section_already_linked;
+
+extern bfd_boolean bfd_section_already_linked_table_init (void);
+extern void bfd_section_already_linked_table_free (void);
+extern bfd_boolean _bfd_handle_already_linked
+ (struct bfd_section *, struct bfd_section_already_linked *,
+ struct bfd_link_info *);
+
+extern struct bfd_section *_bfd_nearby_section
+ (bfd *, struct bfd_section *, bfd_vma);
+
+extern void _bfd_fix_excluded_sec_syms
+ (bfd *, struct bfd_link_info *);
+
/* These structures are used to describe version information for the
ELF linker. These structures could be manipulated entirely inside
BFD, but it would be a pain. Instead, the regular linker sets up