(ppc64_elf_adjust_dynamic_symbol): Allow copy relocs against
function descriptors, but warn.
(ppc_build_one_stub): Remove a couple of vars. Move code creating
stub syms so that we can avoid a stub sym if we already have a
plt sym. Do not redefine an existing symbol.
(ppc64_elf_build_stubs): When --emit-stub-syms, print a symbol for
glink.
* elf64-ppc.c (get_fdh): New function, split out from
ppc64_elf_edit_opd.
(ppc64_elf_check_relocs): Use get_fdh.
(func_desc_adjust): Likewise. Tidy.
(ppc64_elf_edit_opd): Tighten reloc checks. Free local_syms on error
exit. Use get_fdh. Account for superfluous dynamic relocs.
(ppc64_elf_relocate_section): Warning fix.
on function descriptors.
(ELIMINATE_COPY_RELOCS): Expand comment.
(ppc64_elf_special_sections): Move. Don't include non-ppc64 sections.
Do include ".toc1".
* elfxx-ia64.c (struct elfNN_ia64_link_hash_table): Add rel_fptr_sec.
(elfNN_ia64_dynamic_symbol_p): Change info->shared into
!info->executable.
(get_fptr): For -pie create .opd as writable section and create
.rela.opd as well.
(elfNN_ia64_check_relocs): Change info->shared into
!info->executable.
(allocate_fptr): Likewise.
(allocate_dynrel_entries): Account for a relative reloc for -pie
@fptr(). Don't account for a relative reloc if -pie want_ltoff_fptr
for undefweak symbol. Account for an IPLT reloc in .rela.opd
section if -pie.
(set_got_entry): Don't create a relative reloc if -pie
want_ltoff_fptr for undefweak symbol.
(set_fptr_entry): Emit an IPLT reloc in .rela.opd for -pie.
(elfNN_ia64_relocate_section): Emit a relative reloc for -pie
@fptr().
* elfxx-ia64.c (elfNN_ia64_relocate_section): Issue undefined_symbol
even if -pie.
* elf32-i386.c (elf_i386_relocate_section): Likewise.
* elf64-x86-64.c (elf64_x86_64_relocate_section): Likewise.
* elf64-sparc.c (sparc64_elf_relocate_section): Likewise.
* elf64-s390.c (elf_s390_relocate_section): Likewise.
* elf64-ppc.c (ppc64_elf_relocate_section): Likewise.
* elf64-alpha.c (elf64_alpha_relocate_section): Likewise.
* elf32-sparc.c (elf32_sparc_relocate_section): Likewise.
* elf32-s390.c (elf_s390_relocate_section): Likewise.
* elf32-ppc.c (ppc_elf_relocate_section): Likewise.
ld/
* emulparams/elf64_ia64.sh (OTHER_READONLY_SECTIONS): Don't include
.opd if -pie.
(OTHER_READWRITE_SECTIONS): Include .opd if -pie.
* scripttempl/elf.sc: Use SHLIB_DATA_ADDR instead of DATA_ADDR
if -pie.
_restf* to be satisfied by shared libs, and always force them local.
(toc_adjusting_stub_needed): Avoid scanning linker created sections.
Correct test for "bl".
(ppc64_elf_relocate_section <R_PPC64_TLS>): Correct test for
primary opcode 31.
(ppc64_elf_next_input_section): Use it here to set has_gp_reloc.
Return error condition.
(ppc64_elf_size_stubs): Restrict toc adjusting stubs to sections
that have has_gp_reloc set.
(struct ppc_link_hash_table): Add stub_count.
(ppc_build_one_stub): Increment it.
(ppc64_elf_link_hash_table_create): zmalloc rather than clearing
individual fields.
* elf64-ppc.h (ppc64_elf_next_input_section): Update prototype.
input_list.
(ppc64_elf_link_hash_table_create): Init input_list here.
(ppc64_elf_setup_section_lists): Remove code setting up input lists
per output section. Set toc_off for abs and other standard sections.
(ppc64_elf_reinit_toc): Don't set elf_gp on input bfds lacking a toc.
(ppc64_elf_next_input_section): Adjust for single input section list.
Don't set toc_curr from input bfds that haven't set elf_gp.
(group_sections): Adjust for single input section list.
tls, check that a TOC16_DS or TOC16_LO_DS reloc isn't pointing to a
dtprel entry. Ensure TLS_LD DTPMOD reloc has a zero addend. Write
got section for RELATIVE relocs. Fix wrong comment. Change condition
under which dynamic relocs update the section contents.
elf32-ppc.c. Add ELF_LINK_FORCED_LOCAL check.
* elf32-ppc.c: (SYMBOL_REFERENCES_LOCAL, SYMBOL_CALLS_LOCAL): Delete.
(allocate_dynrelocs): Use SYMBOL_REFERENCES_LOCAL for dynreloc check.
(ppc_elf_relocate_section): Likewise.
* elf64-ppc.c (allocate_dynrelocs): Likewise.
(ppc64_elf_relocate_section): Likewise. Use for .got relocs too.
(ppc64_elf_adjust_dynamic_symbol): Don't assume symbols with .plt
relocs need no other types.
* elf32-i386.c (allocate_dynrelocs): Use SYMBOL_REFERENCES_LOCAL for
dynreloc check.
(elf_i386_relocate_section): Likewise. Use for .got relocs too.
(elf_i386_finish_dynamic_symbol): Use SYMBOL_REFERENCES_LOCAL for
.got relocs.
non-default visibility, a) don't make them dynamic, b) discard
space for dynamic relocs.
* elf64-x86-64.c (allocate_dynrelocs): Likewise.
* elf32-ppc.c (allocate_dynrelocs): For undef weak syms with
non-default visibility, a) don't allocate plt entries, b) don't
allocate .got relocs, c) discard dyn rel space,
(ppc_elf_relocate_section): d) don't generate .got relocs, e)
don't generate dynamic relocs.
* elf64-ppc.c (allocate_dynrelocs): As above.
(ppc64_elf_relocate_section): As above.
weakdef sym has already been adjusted before treating it specially.
* elf32-i386.c (elf_i386_copy_indirect_symbol): Don't copy
ELF_LINK_NON_GOT_REF for weakdefs when symbol already adjusted.
* elf64-ppc.c (ppc64_elf_copy_indirect_symbol): Likewise.
(ppc64_elf_check_relocs): Set ELF_LINK_NON_GOT_REF.
zero index dynamic tls relocs generated for the GOT. Tidy code.
Set "relocation" to 1 on DTPMOD32 relocs. Optimize HA adjustment.
* elf64-ppc.c (ppc64_elf_relocate_section): Likewise.
* ld-powerpc/tlsso.r: Adjust for corrected zero symbol index relocs.
* ld-powerpc/tlsso32.r: Likewise.
(ppc_elf_adjust_dynamic_symbol): For weak symbols, copy
ELF_LINK_NON_GOT_REF from weakdef.
* elf64-ppc.c (ELIMINATE_COPY_RELOCS): Define as one.
(ppc64_elf_adjust_dynamic_symbol): For weak symbols, copy
ELF_LINK_NON_GOT_REF from weakdef.
* elf32-i386.c (ELIMINATE_COPY_RELOCS): Define as one. Use throughout.
(elf_i386_adjust_dynamic_symbol): For weak symbols, copy
ELF_LINK_NON_GOT_REF from weakdef.
error messages.
(ELIMINATE_COPY_RELOCS): Define to zero.
(ppc_elf_relocate_section): Don't deref htab->tls_sec when calculating
TLSLD relocs. Report reloc types on a number of errors. Optimize
LOCAL24PC check for non-local syms. Don't capitalize error messages.
* elf64-ppc.c (ELIMINATE_COPY_RELOCS): Define to zero.
(ppc64_elf_relocate_section): Don't deref htab->tls_sec when
calculating TLSLD relocs. Report reloc types on a number of errors.
Don't capitalize error messages.
(ppc64_elf_check_relocs): Use it. Correct comment. Move SEC_ALLOC
test.
(ppc64_elf_adjust_dynamic_symbol): Use ELIMINATE_COPY_RELOCS.
(WILL_CALL_FINISH_DYNAMIC_SYMBOL): Pass SHARED instead of INFO.
(allocate_dynrelocs): Adjust WILL_CALL_FINISH_DYNAMIC_SYMBOL uses,
and optimize. Use ELIMINATE_COPY_RELOCS.
(ppc64_elf_relocate_section): Likewise.
* elf64-ppc.c (ppc64_elf_tls_optimize): Decrement tlsld_got.refcount
on invalid LD relocs.
(allocate_dynrelocs): Invalid LD relocs don't use tlsld_got entry.
(ppc64_elf_relocate_section): Unify new handling of LD relocs and
tlsld_got entry. Use IS_PPC64_TLS_RELOC.
(ppc64_elf_copy_indirect_symbol): Merge tls_mask too.
(ppc64_elf_gc_sweep_hook): Simplify removal of dyn_relocs.
(allocate_dynrelocs): Don't treat undefined and undefweak specially.
(ppc_size_one_stub): Fix warning, and tighten plt entry check.
(group_sections): Don't share a stub section if stubs are for a large
section. Adjust comment.
(ppc64_elf_size_stubs): Roughly double the size left for stubs if
!stubs_always_before_branch.
(ppc64_elf_relocate_section): Initialize tlsld GOT entry once. Don't
treat undefined and undefweak specially when processing dyn relocs.
variables, structure fields or function params to tls_mask or
similar to better reflect usage.
(struct got_entry): Comment.
(struct ppc_link_hash_entry): Expand comment, and renumber TLS_*.
(get_tls_mask): Rename from get_tls_type.
(TLS_GD): ..define this instead and update all uses.
(TLS_TPRELGD): Define.
(ppc64_elf_link_hash_table_create): Tweak initialization of
init_refcount and init_offset.
(ppc64_elf_check_relocs): Add one extra element to t_symndx array.
Mark second slot of GD or LD toc entries.
(get_tls_type): Return an int. Distinguish toc GD and LD entries
from other tls types.
(ppc64_elf_tls_setup): New function, split out from..
(ppc64_elf_tls_optimize): ..here. Don't optimize when symbols are
defined in a dynamic object. Fix LD optimization. Don't set TLS_TPREL
on GD->IE optimization, use TLS_TPRELGD instead. Use get_tls_type
return value to properly decide whether toc GD and LD entries can
optimize away __tls_get_addr call. Check next reloc after DTPMOD64
to determine GD or LD rather than looking at TLS_LD flag. Don't
attempt to adjust got entry tls_type here..
(allocate_dynrelocs): ..instead, adjust got entry tls_type here, and
look for possible merges.
(ppc64_elf_size_dynamic_sections): Adjust local got entries for
optimization.
(ppc64_elf_size_stubs): Tweak __tls_get_addr fudge.
(ppc64_elf_relocate_section): Rename some vars to better reflect usage.
Make use of return value from get_tls_type to properly detect GD and
LD optimizations. Split tlsld/gd hi/ha from lo/ds case. Don't
handle tls_get_addr removal when looking at REL24 relocs, do it when
looking at the previous reloc. Check reloc after DTPMOD64 to determine
GD or LD.
* elf64-ppc.h (ppc64_elf_tls_setup): Declare.