Add RESOLVED_LOCALLY_P

This commit is contained in:
H.J. Lu
2017-10-05 14:36:58 -07:00
parent daf1c414a4
commit 2eba97c207
3 changed files with 21 additions and 34 deletions

View File

@ -2512,26 +2512,13 @@ r_386_got32:
relative_reloc = FALSE; relative_reloc = FALSE;
if (h != NULL) if (h != NULL)
{ {
bfd_boolean dyn;
off = h->got.offset; off = h->got.offset;
dyn = htab->elf.dynamic_sections_created; if (RESOLVED_LOCALLY_P (info, h, htab))
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))
{ {
/* This is actually a static link, or it is a /* We must initialize this entry in the global offset
-Bsymbolic link and the symbol is defined table. Since the offset must always be a multiple
locally, or the symbol was forced to be local of 4, we use the least significant bit to record
because of a version file. We must initialize whether we have initialized it already.
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 When doing a dynamic link, we create a .rel.got
relocation entry to initialize the value. This relocation entry to initialize the value. This

View File

@ -2762,8 +2762,6 @@ do_ifunc_pointer:
relative_reloc = FALSE; relative_reloc = FALSE;
if (h != NULL) if (h != NULL)
{ {
bfd_boolean dyn;
off = h->got.offset; off = h->got.offset;
if (h->needs_plt if (h->needs_plt
&& h->plt.offset != (bfd_vma)-1 && h->plt.offset != (bfd_vma)-1
@ -2779,21 +2777,12 @@ do_ifunc_pointer:
base_got = htab->elf.sgotplt; base_got = htab->elf.sgotplt;
} }
dyn = htab->elf.dynamic_sections_created; if (RESOLVED_LOCALLY_P (info, h, htab))
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))
{ {
/* This is actually a static link, or it is a -Bsymbolic /* We must initialize this entry in the global offset
link and the symbol is defined locally, or the symbol table. Since the offset must always be a multiple
was forced to be local because of a version file. We of 8, we use the least significant bit to record
must initialize this entry in the global offset table. whether we have initialized it already.
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 When doing a dynamic link, we create a .rela.got
relocation entry to initialize the value. This is relocation entry to initialize the value. This is

View File

@ -113,6 +113,17 @@
&& ((H)->root.type == bfd_link_hash_defweak \ && ((H)->root.type == bfd_link_hash_defweak \
|| !(H)->def_regular))) || !(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. */ /* TRUE if TLS IE->LE transition is OK. */
#define TLS_TRANSITION_IE_TO_LE_P(INFO, H, TLS_TYPE) \ #define TLS_TRANSITION_IE_TO_LE_P(INFO, H, TLS_TYPE) \
(bfd_link_executable (INFO) \ (bfd_link_executable (INFO) \