diff options
author | H.J. Lu <hjl.tools@gmail.com> | 2017-10-06 00:40:56 -0700 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2017-10-06 00:41:58 -0700 |
commit | aebcc8ffd201adbee973b414818b01876dabe1a0 (patch) | |
tree | f1df81a7e76c022163872dfc39268a198ac6ffd2 /bfd/elfxx-x86.h | |
parent | cf1070f1a1ca1f8be1cd88aa6ece55a25e6a887b (diff) |
x86: Add GENERATE_DYNAMIC_RELOCATION_P
Add GENERATE_DYNAMIC_RELOCATION_P which returns TRUE if dynamic
relocation should be generated.
* elf32-i386.c (X86_SIZE_TYPE_P): New.
(elf_i386_relocate_section): Use GENERATE_DYNAMIC_RELOCATION_P.
* elf64-x86-64.c (X86_SIZE_TYPE_P): New.
(elf_x86_64_relocate_section): Use GENERATE_DYNAMIC_RELOCATION_P.
* elfxx-x86.h (GENERATE_DYNAMIC_RELOCATION_P): New.
Diffstat (limited to 'bfd/elfxx-x86.h')
-rw-r--r-- | bfd/elfxx-x86.h | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/bfd/elfxx-x86.h b/bfd/elfxx-x86.h index 3be85d085f..cef2eba30e 100644 --- a/bfd/elfxx-x86.h +++ b/bfd/elfxx-x86.h @@ -113,6 +113,36 @@ && ((H)->root.type == bfd_link_hash_defweak \ || !(H)->def_regular))) +/* TRUE if dynamic relocation should be generated. Don't copy a + pc-relative relocation into the output file if the symbol needs + copy reloc or the symbol is undefined when building executable. + 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, \ + NEED_COPY_RELOC_IN_PIE, \ + RESOLVED_TO_ZERO, PC32_RELOC) \ + ((bfd_link_pic (INFO) \ + && !(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))) \ + || (ELIMINATE_COPY_RELOCS \ + && !bfd_link_pic (INFO) \ + && (EH) != NULL \ + && (EH)->elf.dynindx != -1 \ + && (!(EH)->elf.non_got_ref \ + || (EH)->func_pointer_refcount > 0 \ + || ((EH)->elf.root.type == bfd_link_hash_undefweak \ + && !(RESOLVED_TO_ZERO))) \ + && (((EH)->elf.def_dynamic && !(EH)->elf.def_regular) \ + || (EH)->elf.root.type == bfd_link_hash_undefined))) + /* TRUE if this is actually a static link, or it is a -Bsymbolic link and the symbol is defined locally, or the symbol was forced to be local because of a version file. */ |