- if (do_check_pic)
- {
- /* Don't complain about -fPIC if the symbol is undefined
- when building executable unless it is unresolved weak
- symbol, references a dynamic definition in PIE or
- -z nocopyreloc is used. */
- bfd_boolean no_copyreloc_p
- = (info->nocopyreloc
- || (h != NULL
- && !h->root.linker_def
- && !h->root.ldscript_def
- && eh->def_protected
- && elf_has_no_copy_on_protected (h->root.u.def.section->owner)));
- if ((sec->flags & SEC_ALLOC) != 0
- && (sec->flags & SEC_READONLY) != 0
- && h != NULL
- && ((bfd_link_executable (info)
- && ((h->root.type == bfd_link_hash_undefweak
- && (eh == NULL
- || !UNDEFINED_WEAK_RESOLVED_TO_ZERO (info,
- eh)))
- || (bfd_link_pie (info)
- && !SYMBOL_DEFINED_NON_SHARED_P (h)
- && h->def_dynamic)
- || (no_copyreloc_p
- && h->def_dynamic
- && !(h->root.u.def.section->flags & SEC_CODE))))
- || bfd_link_dll (info)))
- {
- bfd_boolean fail = FALSE;
- if (SYMBOL_REFERENCES_LOCAL_P (info, h))
- {
- /* Symbol is referenced locally. Make sure it is
- defined locally. */
- fail = !SYMBOL_DEFINED_NON_SHARED_P (h);
- }
- else if (bfd_link_pie (info))
- {
- /* We can only use PC-relative relocations in PIE
- from non-code sections. */
- if (h->type == STT_FUNC
- && (sec->flags & SEC_CODE) != 0)
- fail = TRUE;
- }
- else if (no_copyreloc_p || bfd_link_dll (info))
- {
- /* Symbol doesn't need copy reloc and isn't
- referenced locally. Don't allow PC-relative
- relocations against default and protected
- symbols since address of protected function
- and location of protected data may not be in
- the shared object. */
- fail = (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
- || ELF_ST_VISIBILITY (h->other) == STV_PROTECTED);
- }
-
- if (fail)
- return elf_x86_64_need_pic (info, abfd, sec, h,
- symtab_hdr, isym,
- &x86_64_elf_howto_table[r_type]);
- }
- }
-