/* BFD back-end data structures for ELF files.
- Copyright (C) 1992-2021 Free Software Foundation, Inc.
+ Copyright (C) 1992-2022 Free Software Foundation, Inc.
Written by Cygnus Support.
This file is part of BFD, the Binary File Descriptor library.
_bfd_elf_symbol_refs_local_p (H, INFO, 1)
/* Whether an undefined weak symbol should resolve to its link-time
- value, even in PIC or PIE objects. */
+ value, even in PIC or PIE objects. The linker_def test is to
+ handle symbols like __ehdr_start that may be undefweak in early
+ stages of linking but are guaranteed to be defined later. */
#define UNDEFWEAK_NO_DYNAMIC_RELOC(INFO, H) \
((H)->root.type == bfd_link_hash_undefweak \
+ && !(H)->root.linker_def \
&& (ELF_ST_VISIBILITY ((H)->other) != STV_DEFAULT \
|| (INFO)->dynamic_undefined_weak == 0))
{
AARCH64_ELF_DATA = 1,
ALPHA_ELF_DATA,
+ AMDGCN_ELF_DATA,
ARC_ELF_DATA,
ARM_ELF_DATA,
AVR_ELF_DATA,
I386_ELF_DATA,
IA64_ELF_DATA,
LM32_ELF_DATA,
+ LARCH_ELF_DATA,
M32R_ELF_DATA,
M68HC11_ELF_DATA,
M68K_ELF_DATA,
/* TRUE if DT_JMPREL is a required dynamic tag. */
bool dt_jmprel_required;
+ /* TRUE when we are handling DT_NEEDED entries. */
+ bool handling_dt_needed;
+
/* The BFD used to hold special sections created by the linker.
This will be the first BFD found which requires these sections to
be created. */
asection *irelplt;
asection *irelifunc;
asection *dynsym;
+ asection *srelrdyn;
};
/* Returns TRUE if the hash table is a struct elf_link_hash_table. */
/* The common page size for this backend. */
bfd_vma commonpagesize;
- /* The value of commonpagesize to use when -z relro for this backend. */
- bfd_vma relropagesize;
+ /* The p_align value for this backend. If it is set, p_align of
+ PT_LOAD alignment will be to p_align by default. */
+ bfd_vma p_align;
/* The BFD flags applied to sections created for dynamic linking. */
flagword dynamic_sec_flags;
that CHECK_RELOCS will properly process them. PR 4424. */
bool (*relocs_compatible) (const bfd_target *, const bfd_target *);
- /* The CHECK_RELOCS function is called by the add_symbols phase of
- the ELF backend linker. It is called once for each section with
- relocs of an object file, just after the symbols for the object
- file have been added to the global linker hash table. The
- function must look through the relocs and do any special handling
- required. This generally means allocating space in the global
- offset table, and perhaps allocating space for a reloc. The
+ /* The CHECK_RELOCS function is called after all input files have been
+ opened. It is called once for each section with relocs of an object
+ file. The function must look through the relocs and do any special
+ handling required. This generally means allocating space in the
+ global offset table, and perhaps allocating space for a reloc. The
relocs are always passed as Rela structures; if the section
actually uses Rel structures, the r_addend field will always be
zero. */
(bfd *abfd, struct bfd_link_info *info, asection *o,
const Elf_Internal_Rela *relocs);
+ /* The SIZE_RELATIVE_RELOCS function is called to size relative
+ relocations when mappig sections to segments. */
+ bool (*size_relative_relocs)
+ (struct bfd_link_info *info, bool *need_layout);
+
+ /* The FINISH_RELATIVE_RELOCS function is called to finish relative
+ relocations in bfd_elf_final_link. */
+ bool (*finish_relative_relocs)
+ (struct bfd_link_info *info);
+
/* The CHECK_DIRECTIVES function is called once per input file by
the add_symbols phase of the ELF backend linker. The function
must inspect the bfd and create any additional symbols according
#define LEAST_KNOWN_OBJ_ATTRIBUTE 2
/* The maximum number of known object attributes for any target. */
-#define NUM_KNOWN_OBJ_ATTRIBUTES 71
+#define NUM_KNOWN_OBJ_ATTRIBUTES 77
/* The value of an object attribute. The type indicates whether the attribute
holds and integer, a string, or both. It can also indicate that there can
/* STT_SECTION symbols for each section */
asymbol **section_syms;
- /* Used to determine if PT_GNU_EH_FRAME segment header should be
- created. */
- asection *eh_frame_hdr;
-
/* NT_GNU_BUILD_ID note type info. */
struct
{
/* Linker information. */
struct bfd_link_info *link_info;
- int num_section_syms;
+ unsigned int num_section_syms;
unsigned int shstrtab_section, strtab_section;
/* Segment flags for the PT_GNU_STACK segment. */
#define elf_seg_map(bfd) (elf_tdata(bfd) -> o->seg_map)
#define elf_link_info(bfd) (elf_tdata(bfd) -> o->link_info)
#define elf_next_file_pos(bfd) (elf_tdata(bfd) -> o->next_file_pos)
-#define elf_eh_frame_hdr(bfd) (elf_tdata(bfd) -> o->eh_frame_hdr)
#define elf_stack_flags(bfd) (elf_tdata(bfd) -> o->stack_flags)
#define elf_shstrtab(bfd) (elf_tdata(bfd) -> o->strtab_ptr)
#define elf_onesymtab(bfd) (elf_tdata(bfd) -> symtab_section)
extern bool _bfd_elf_adjust_eh_frame_global_symbol
(struct elf_link_hash_entry *, void *);
extern bool _bfd_elf_discard_section_eh_frame_hdr
- (bfd *, struct bfd_link_info *);
+ (struct bfd_link_info *);
extern bfd_vma _bfd_elf_eh_frame_section_offset
(bfd *, struct bfd_link_info *, asection *, bfd_vma);
extern bool _bfd_elf_write_section_eh_frame
(bfd *, struct bfd_link_info *);
extern bool _bfd_elf_link_check_relocs
(bfd *, struct bfd_link_info *);
+extern bool _bfd_elf_link_iterate_on_relocs
+ (bfd *, struct bfd_link_info *,
+ bool (*) (bfd *, struct bfd_link_info *, asection *,
+ const Elf_Internal_Rela *));
extern bool bfd_elf_link_record_dynamic_symbol
(struct bfd_link_info *, struct elf_link_hash_entry *);
(bfd *, asection *);
extern bool _bfd_elf_map_sections_to_segments
- (bfd *, struct bfd_link_info *);
+ (bfd *, struct bfd_link_info *, bool *);
extern bool _bfd_elf_is_function_type (unsigned int);
(bfd *, char *, int *, const char *, const void *, int);
extern char *elfcore_write_file_note
(bfd *, char *, int *, const void*, int);
+extern char *elfcore_write_loongarch_cpucfg
+ (bfd *, char *, int *, const void*, int);
+extern char *elfcore_write_loongarch_lbt
+ (bfd *, char *, int *, const void*, int);
+extern char *elfcore_write_loongarch_lsx
+ (bfd *, char *, int *, const void*, int);
+extern char *elfcore_write_loongarch_lasx
+ (bfd *, char *, int *, const void*, int);
/* Internal structure which holds information to be included in the
PRPSINFO section of Linux core files.