X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=bfd%2Felfxx-x86.h;h=c717cd16e56ed18749fd9589410cad42adada3b9;hb=refs%2Fheads%2Fconcurrent-displaced-stepping-2020-04-01;hp=2415987d32bcf2d6e353558d93302f33916b3d36;hpb=2d5d5a8f0a8b5a03454bf168b7fa7024bb1ebbd8;p=deliverable%2Fbinutils-gdb.git diff --git a/bfd/elfxx-x86.h b/bfd/elfxx-x86.h index 2415987d32..c717cd16e5 100644 --- a/bfd/elfxx-x86.h +++ b/bfd/elfxx-x86.h @@ -1,5 +1,5 @@ /* x86 specific support for ELF - Copyright (C) 2017-2018 Free Software Foundation, Inc. + Copyright (C) 2017-2020 Free Software Foundation, Inc. This file is part of BFD, the Binary File Descriptor library. @@ -24,6 +24,7 @@ #include "libbfd.h" #include "elf-bfd.h" #include "hashtab.h" +#include "elf-linker-x86.h" #define PLT_CIE_LENGTH 20 #define PLT_FDE_LENGTH 36 @@ -118,19 +119,23 @@ Copy dynamic function pointer relocations. Don't generate dynamic relocations against resolved undefined weak symbols in PIE, except when PC32_RELOC is TRUE. Undefined weak symbol is bound locally - when PIC is false. */ -#define GENERATE_DYNAMIC_RELOCATION_P(INFO, EH, R_TYPE, \ + when PIC is false. Don't generate dynamic relocations against + non-preemptible absolute symbol. */ +#define GENERATE_DYNAMIC_RELOCATION_P(INFO, EH, R_TYPE, SEC, \ NEED_COPY_RELOC_IN_PIE, \ RESOLVED_TO_ZERO, PC32_RELOC) \ ((bfd_link_pic (INFO) \ + && !(bfd_is_abs_section (SEC) \ + && ((EH) == NULL \ + || SYMBOL_REFERENCES_LOCAL (INFO, &(EH)->elf))) \ && !(NEED_COPY_RELOC_IN_PIE) \ && ((EH) == NULL \ || ((ELF_ST_VISIBILITY ((EH)->elf.other) == STV_DEFAULT \ && (!(RESOLVED_TO_ZERO) || PC32_RELOC)) \ || (EH)->elf.root.type != bfd_link_hash_undefweak)) \ - && ((!X86_PCREL_TYPE_P (R_TYPE) \ - && !X86_SIZE_TYPE_P (R_TYPE)) \ - || ! SYMBOL_CALLS_LOCAL ((INFO), &(EH)->elf))) \ + && ((!X86_PCREL_TYPE_P (R_TYPE) && !X86_SIZE_TYPE_P (R_TYPE)) \ + || ! SYMBOL_CALLS_LOCAL ((INFO), \ + (struct elf_link_hash_entry *) (EH)))) \ || (ELIMINATE_COPY_RELOCS \ && !bfd_link_pic (INFO) \ && (EH) != NULL \ @@ -161,17 +166,33 @@ || (ELF_ST_VISIBILITY ((H)->other) \ && (H)->root.type == bfd_link_hash_undefweak)) +/* TRUE if this symbol isn't defined by a shared object. */ +#define SYMBOL_DEFINED_NON_SHARED_P(H) \ + ((H)->def_regular \ + || (H)->root.linker_def \ + || (H)->root.ldscript_def \ + || ((struct elf_x86_link_hash_entry *) (H))->linker_def \ + || ELF_COMMON_DEF_P (H)) + +/* Return TRUE if the symbol described by a linker hash entry H is + going to be absolute. Similar to bfd_is_abs_symbol, but excluding + all linker-script defined symbols. */ +#define ABS_SYMBOL_P(H) \ + (bfd_is_abs_symbol (&(H)->root) && !(H)->root.ldscript_def) + /* TRUE if relative relocation should be generated. GOT reference to global symbol in PIC will lead to dynamic symbol. It becomes a problem when "time" or "times" is defined as a variable in an executable, clashing with functions of the same name in libc. If a symbol isn't undefined weak symbol, don't make it dynamic in PIC and - generate relative relocation. */ + generate relative relocation. Don't generate relative relocation + against non-preemptible absolute symbol. */ #define GENERATE_RELATIVE_RELOC_P(INFO, H) \ ((H)->dynindx == -1 \ && !(H)->forced_local \ && (H)->root.type != bfd_link_hash_undefweak \ - && bfd_link_pic (INFO)) + && bfd_link_pic (INFO) \ + && !ABS_SYMBOL_P (H)) /* TRUE if this is a pointer reference to a local IFUNC. */ #define POINTER_LOCAL_IFUNC_P(INFO, H) \ @@ -229,9 +250,6 @@ struct elf_x86_link_hash_entry { struct elf_link_hash_entry elf; - /* Track dynamic relocs copied for this symbol. */ - struct elf_dyn_relocs *dyn_relocs; - unsigned char tls_type; /* Bit 0: Symbol has no GOT nor PLT relocations. @@ -405,6 +423,7 @@ struct elf_x86_plt_layout #define GOT_TLS_IE_NEG 6 #define GOT_TLS_IE_BOTH 7 #define GOT_TLS_GDESC 8 +#define GOT_ABS 9 #define GOT_TLS_GD_BOTH_P(type) \ ((type) == (GOT_TLS_GD | GOT_TLS_GDESC)) #define GOT_TLS_GD_P(type) \ @@ -523,6 +542,9 @@ struct elf_x86_link_hash_table int dynamic_interpreter_size; const char *dynamic_interpreter; const char *tls_get_addr; + + /* Options passed from the linker. */ + struct elf_linker_x86_params *params; }; /* Architecture-specific backend data for x86. */ @@ -589,6 +611,9 @@ struct elf_x86_plt long count; }; +/* Set if a relocation is converted from a GOTPCREL relocation. */ +#define R_X86_64_converted_reloc_bit (1 << 7) + #define elf_x86_tdata(abfd) \ ((struct elf_x86_obj_tdata *) (abfd)->tdata.any) @@ -640,6 +665,11 @@ extern int _bfd_x86_elf_compare_relocs extern bfd_boolean _bfd_x86_elf_link_check_relocs (bfd *, struct bfd_link_info *); +extern bfd_boolean _bfd_elf_x86_valid_reloc_p + (asection *, struct bfd_link_info *, struct elf_x86_link_hash_table *, + const Elf_Internal_Rela *, struct elf_link_hash_entry *, + Elf_Internal_Sym *, Elf_Internal_Shdr *, bfd_boolean *); + extern bfd_boolean _bfd_x86_elf_size_dynamic_sections (bfd *, struct bfd_link_info *); @@ -684,7 +714,7 @@ extern enum elf_property_kind _bfd_x86_elf_parse_gnu_properties (bfd *, unsigned int, bfd_byte *, unsigned int); extern bfd_boolean _bfd_x86_elf_merge_gnu_properties - (struct bfd_link_info *, bfd *, elf_property *, elf_property *); + (struct bfd_link_info *, bfd *, bfd *, elf_property *, elf_property *); extern void _bfd_x86_elf_link_fixup_gnu_properties (struct bfd_link_info *, elf_property_list **);