From 2eba97c207399d8b541092a7b0a4428dc02f5cf1 Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Thu, 5 Oct 2017 14:36:58 -0700 Subject: [PATCH] Add RESOLVED_LOCALLY_P --- bfd/elf32-i386.c | 23 +++++------------------ bfd/elf64-x86-64.c | 21 +++++---------------- bfd/elfxx-x86.h | 11 +++++++++++ 3 files changed, 21 insertions(+), 34 deletions(-) diff --git a/bfd/elf32-i386.c b/bfd/elf32-i386.c index 4a3c690..25d349c 100644 --- a/bfd/elf32-i386.c +++ b/bfd/elf32-i386.c @@ -2512,26 +2512,13 @@ r_386_got32: relative_reloc = FALSE; if (h != NULL) { - bfd_boolean dyn; - off = h->got.offset; - dyn = htab->elf.dynamic_sections_created; - if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, - bfd_link_pic (info), - h) - || (bfd_link_pic (info) - && SYMBOL_REFERENCES_LOCAL_P (info, h)) - || (ELF_ST_VISIBILITY (h->other) - && h->root.type == bfd_link_hash_undefweak)) + if (RESOLVED_LOCALLY_P (info, h, htab)) { - /* 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. We must initialize - this entry in the global offset table. Since the - offset must always be a multiple of 4, we use the - least significant bit to record whether we have - initialized it already. + /* We must initialize this entry in the global offset + table. Since the offset must always be a multiple + of 4, we use the least significant bit to record + whether we have initialized it already. When doing a dynamic link, we create a .rel.got relocation entry to initialize the value. This diff --git a/bfd/elf64-x86-64.c b/bfd/elf64-x86-64.c index df91ab8..5a9e3fd 100644 --- a/bfd/elf64-x86-64.c +++ b/bfd/elf64-x86-64.c @@ -2762,8 +2762,6 @@ do_ifunc_pointer: relative_reloc = FALSE; if (h != NULL) { - bfd_boolean dyn; - off = h->got.offset; if (h->needs_plt && h->plt.offset != (bfd_vma)-1 @@ -2779,21 +2777,12 @@ do_ifunc_pointer: base_got = htab->elf.sgotplt; } - dyn = htab->elf.dynamic_sections_created; - - if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, bfd_link_pic (info), h) - || (bfd_link_pic (info) - && SYMBOL_REFERENCES_LOCAL_P (info, h)) - || (ELF_ST_VISIBILITY (h->other) - && h->root.type == bfd_link_hash_undefweak)) + if (RESOLVED_LOCALLY_P (info, h, htab)) { - /* 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. We - must initialize this entry in the global offset table. - Since the offset must always be a multiple of 8, we - use the least significant bit to record whether we - have initialized it already. + /* We must initialize this entry in the global offset + table. Since the offset must always be a multiple + of 8, we use the least significant bit to record + whether we have initialized it already. When doing a dynamic link, we create a .rela.got relocation entry to initialize the value. This is diff --git a/bfd/elfxx-x86.h b/bfd/elfxx-x86.h index 88202b4..317c86e 100644 --- a/bfd/elfxx-x86.h +++ b/bfd/elfxx-x86.h @@ -113,6 +113,17 @@ && ((H)->root.type == bfd_link_hash_defweak \ || !(H)->def_regular))) +/* 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. */ +#define RESOLVED_LOCALLY_P(INFO, H, HTAB) \ + (!WILL_CALL_FINISH_DYNAMIC_SYMBOL ((HTAB)->elf.dynamic_sections_created, \ + bfd_link_pic (INFO), (H)) \ + || (bfd_link_pic (INFO) \ + && SYMBOL_REFERENCES_LOCAL_P ((INFO), (H))) \ + || (ELF_ST_VISIBILITY ((H)->other) \ + && (H)->root.type == bfd_link_hash_undefweak)) + /* TRUE if TLS IE->LE transition is OK. */ #define TLS_TRANSITION_IE_TO_LE_P(INFO, H, TLS_TYPE) \ (bfd_link_executable (INFO) \ -- 2.7.4