save_addend argument. Don't apply the 32-bit mask to a
GPREL32 value if it's to be used in another relocation. Don't
use forced-check computation of local_p to decide whether to
add gp0 to GPREL16 value. Don't use only the lowest 16 bits
of the addend of a non-in-place GPREL16 relocation.
(_bfd_mips_elf_relocate_section): Pass use_saved_addend_p to
mips_elf_calculate_relocation().
(sh_elf_link_hash_newfunc): Initialize it.
(allocate_dynrelocs): Transfer gotplt refs from plt.refcount
to got.refcount for symbols that are forced local or when
we have direct got refs.
(sh_elf_gc_sweep_hook): Adjust gotplt_refcount. Use it
to correctly adjust got.refcount and plt.refcount.
(sh_elf_copy_indirect_symbol): Copy gotplt_refcount across.
(sh_elf_check_relocs): Increment gotplt_refcount.
local_got_refcounts usage. Remove allocation of got slot.
(elf_vax_gc_sweep_hook): Remove unused local_got_refcounts usage.
Remove de-allocation of got slot.
(elf_vax_size_dynamic_section): Fix some indentation. Add hash
traversal for elf_vax_instantiate_got_entries. Allow empty .got
sections to be GC'ed.
(elf_vax_instantiate_got_entries): New function.
(elf_vax_relocate_section): Simplify R_VAX_GOT32 handling. Remove
tests that are now handled by elf_vax_instantiate_got_entries.
Assert GOT entry falls within .got section size. Remove redundant
comparisions. Fix comments.
addend into r_addend, not *r_offset.
(elf32_sparc_finish_dynamic_symbol): Likewise.
* elf64-sparc.c (sparc64_elf_finish_dynamic_symbol): Clear xword at
R_SPARC_RELATIVE's r_offset.
* elf32-ppc.c (ppc_elf_finish_dynamic_symbol): Clear .got word
even if generating R_PPC_RELATIVE reloc.
(ppc_elf_relocate_section): Make sure relocation is performed
if skip == -2. Clear memory at r_offset when creating dynamic
relocation.
* reloc.c (BFD_RELOC_386_TLS_TPOFF, BFD_RELOC_386_TLS_IE,
BFD_RELOC_386_TLS_GOTIE): Add.
* bfd-in2.h, libbfd.h: Rebuilt.
* elf32-i386.c (elf_howto_table): Add R_386_TLS_TPOFF, R_386_TLS_IE
and R_386_TLS_GOTIE.
(elf_i386_reloc_type_lookup): Handle it.
(struct elf_i386_link_hash_entry): Change tls_type type to unsigned
char instead of enum, change GOT_* into defines.
(GOT_TLS_IE_POS, GOT_TLS_IE_NEG, GOT_TLS_IE_BOTH): Define.
(elf_i386_tls_transition): Handle R_386_TLS_IE and R_386_TLS_GOTIE.
(elf_i386_check_relocs): Likewise. Avoid crash if local symbol is
accessed both as normal and TLS symbol. Move R_386_TLS_LDM and
R_386_PLT32 cases so that R_386_TLS_IE can fall through.
Handle R_386_TLS_LE_32 and R_386_TLS_LE in shared libs.
(elf_i386_gc_sweep_hook): Handle R_386_TLS_IE and R_386_TLS_GOTIE.
Handle R_386_TLS_LE_32 and R_386_TLS_LE in shared libs.
(allocate_dynrelocs): Allocate 2 .got and 2 .rel.got entries if
tls_type is GOT_TLS_IE_BOTH.
(elf_i386_size_dynamic_sections): Likewise.
(elf_i386_relocate_section): Handle R_386_TLS_IE and R_386_TLS_GOTIE.
Handle R_386_TLS_LE_32 and R_386_TLS_LE in shared libs.
(elf_i386_finish_dynamic_symbol): Use tls_type & GOT_TLS_IE to catch
all 4 GOT_TLS_* TLS types.
gas/
* config/tc-i386.c (tc_i386_fix_adjustable): Handle
BFD_RELOC_386_TLS_IE and BFD_RELOC_386_TLS_GOTIE.
(BFD_RELOC_386_TLS_IE, BFD_RELOC_386_TLS_GOTIE): Define to 0
if not defined.
(lex_got): Handle @GOTNTPOFF and @INDNTPOFF.
(md_apply_fix3, tc_gen_reloc): Handle BFD_RELOC_386_TLS_IE and
BFD_RELOC_386_TLS_GOTIE.
gas/testsuite/
* gas/i386/tlspic.s: Add tests.
* gas/i386/tlspic.d: Regenerated.
* gas/i386/tlsnopic.s: Add tests.
* gas/i386/tlsnopic.d: Regenerated.
include/
* elf/i386.h (R_386_TLS_TPOFF, R_386_TLS_IE, R_386_TLS_GOTIE):
Define.
ld/testsuite/
* ld-i386/i386.exp: New.
* ld-i386/tlsbin.dd: New test.
* ld-i386/tlsbinpic.s: New test.
* ld-i386/tlsbin.rd: New test.
* ld-i386/tlsbin.s: New test.
* ld-i386/tlsbin.sd: New test.
* ld-i386/tlsbin.td: New test.
* ld-i386/tlslib.s: New test.
* ld-i386/tlsnopic1.s: New test.
* ld-i386/tlsnopic2.s: New test.
* ld-i386/tlsnopic.dd: New test.
* ld-i386/tlsnopic.rd: New test.
* ld-i386/tlsnopic.sd: New test.
* ld-i386/tlspic1.s: New test.
* ld-i386/tlspic2.s: New test.
* ld-i386/tlspic.dd: New test.
* ld-i386/tlspic.rd: New test.
* ld-i386/tlspic.sd: New test.
* ld-i386/tlspic.td: New test.
* elf32-i386-fbsd.c: Always label using the EI_OSABI method.
It is benign for FreeBSD < 4.1. Minor reformatting.
* elf64-alpha-fbsd.c: Likewise.
Approved by: Alan Modra <amodra@bigpond.net.au>
Message-ID: <20020917182339.B14457@bubble.sa.bigpond.net.au>
* elf32-i386.c: Don't defined ELF_ARCH etc. if this file is included
by a target variant implementation.
* elf64-alpha.c: Likewise.
* elf32-i386-fbsd.c: New file.
* elf64-alpha-fbsd.c: New file.
* targets.c: Support bfd_elf32_i386_freebsd_vec and
bfd_elf64_alpha_freebsd_vec.
* configure.in: Accept the vectors bfd_elf32_i386_freebsd_vec,
bfd_elf64_alpha_freebsd_vec.
* Makefile.am (BFD32_BACKENDS): Add elf32-i386-fbsd.lo.
(BFD32_BACKENDS_CFILES): Add elf32-i386-fbsd.c.
(BFD64_BACKENDS): Add elf64-alpha-fbsd.lo.
(BFD64_BACKENDS_CFILES): Add elf64-alpha-fbsd.c.
(elf32-i386-fbsd.lo, elf64-alpha-fbsd.lo): Add dependencies.
* config.bfd: For FreeBSD targets, set targ_defvec to a FreeBSD
specific targets. Define OLD_FREEBSD_ABI_LABEL if appropriate.
* config/tc-i386.h (ELF_TARGET_FORMAT): New macro.
(TARGET_FORMAT): Use ELF_TARGET_FORMAT instead of "elf32-i386".
* config/tc-i386.c (i386_target_format): Likewise.
* config/tc-alpha.h (ELF_TARGET_FORMAT): New macro.
(TARGET_FORMAT): Use ELF_TARGET_FORMAT instead of "elf64-alpha".
* emulparams/elf_i386_fbsd.sh: Set OUTPUT_FORMAT to
elf32-i386-freebsd.
* emulparams/elf64alpha_fbsd.sh: Set OUTPUT_FORMAT to
elf64-alpha-freebsd.
Approved by: Alan Modra <amodra@bigpond.net.au>
Message-ID: <20020715021113.GJ30362@bubble.sa.bigpond.net.au>
Replace caching of external symbols with caching of internal symbols obtained
from calling bfd_elf_get_elf_syms().
Fixup problems with freeing cached allocated memory blocks.
(bfd_pj_arch): Use bfd_default_scan.
* cpu-v850.c (scan): Remove.
(N): Use bfd_default_scan.
* cpu-z8k.c (scan_mach): Remove.
(arch_info_struct, bfd_z8k_arch): Reorganize so that the default is
first. Use bfd_default_scan.
(create_got_section, allocate_dynrelocs, readonly_dynrelocs):
Likewise.
(struct elf_sh_pcrel_relocs_copied): Removed.
(struct elf_sh_dyn_relocs): New.
(struct elf_sh_link_hash_entry): Replace pcrel_relocs_copied
field with dyn_relocs.
(struct elf_sh_link_hash_table): Add short-cuts to get dynamic
sections and sym_sec.
(sh_elf_link_hash_newfunc): Clear dyn_relocs.
(sh_elf_link_hash_table_create): Clear shorts-cuts and sym_sec.
(sh_elf_create_dynamic_sections): Use create_got_section instead
of _bfd_elf_create_got_section.
(sh_elf_check_relocs): Likewise.
(sh_elf_create_dynamic_sections): Use short-cuts to the dynamic
sections.
(sh_elf_adjust_dynamic_symbol, sh_elf_size_dynamic_sections,
sh_elf_relocate_section, sh_elf_check_relocs,
sh_elf_finish_dynamic_symbol, sh_elf_finish_dynamic_sections):
Likewise.
(sh_elf_adjust_dynamic_symbol): Handle nocopyreloc. Keep the
dynamic relocations and avoiding the copy relocation when we
didn't find any dynamic relocations in the section which has
contents or is read-only.
(WILL_CALL_FINISH_DYNAMIC_SYMBOL): New.
(sh_elf_size_dynamic_sections): Don't reset the size of
.rela.got section even if dynamic_sections_created flag is off.
Don't use sh_elf_discard_copies. Scan all input bfd and use
allocate_dynrelocs. Call readonly_dynrelocs to determine
whether we need DT_TEXTREL.
(sh_elf_adjust_dynamic_symbol): Use plt.refcount to determine
whether the symbol was never referred to.
(sh_elf_relocate_section): Use WILL_CALL_FINISH_DYNAMIC_SYMBOL.
(sh_elf_gc_sweep_hook): Fill with the real sweep function.
(sh_elf_check_relocs): Call create_got_section if the short-cut
to .got is null. Increment reference counters only instead of
allocating space on dynamic sections here. Don't conditionalize
uninitialized got.offset value when marking the symbol as a
global offset table entry. Keep relocations for symbols satisfied
by a dynamic library to avoid copy relocations for the symbol.
Set dynobj field of an elf hash table if needed.
(sh_elf_finish_dynamic_sections): Handle null section pointer
correctly.
(elf_backend_copy_indirect_symbol): Defined.
(elf_backend_can_refcount): Defined.
contents of .got.plt[2] to tr0, not address of .got.plt.
(sh_elf_finish_dynamic_symbol): Do not apply GOT_BIAS when
patching absolute plt entry. For shmedia plt entry, set bottom bit
of branch to plt0 as this is a branch to an shmedia instruction.
* elf64-sh64.c (elf_sh64_plt0_entry_be, elf_sh64_plt0_entry_le):
Copy contents of .got.plt[2] to tr0, not address of .got.plt.
(elf_sh64_plt_entry_be, elf_sh64_plt_entry_le): Use ptrel to
branch to plt0.
(sh64_elf64_finish_dynamic_symbol): Do not apply GOT_BIAS when
patching absolute plt entry. For shmedia plt entry, branch to
plt0 is now ptrel, so use relative offset. Set bottom bit of
branch target as it is a branch to an shmedia instruction.
instructions.
(m68hc11_direct_relax): New to define table of relaxable instructions.
(find_relaxable_insn): New, find a relaxable insn.
(compare_reloc): New to compare two relocs.
(m68hc11_elf_relax_section): New, relax text sections.
(m68hc11_elf_relax_delete_bytes): New, delete bytes and adjust branchs.
(elf32_m68hc11_check_relocs): New function for GC support.
(elf32_m68hc11_relocate_section): New function for GC support.
(bfd_elf32_bfd_relax_section): Define to support linker relaxation.
(elf_backend_check_relocs): Likewise.
(elf_backend_relocate_section): Likewise.
(_bfd_m68hc11_elf_merge_private_bfd_data): New function.
(_bfd_m68hc11_elf_set_private_flags): New function.
Use them to set/check/print ELF flags specific to 68HC11.
* elf32-m68hc12.c (_bfd_m68hc12_elf_print_private_bfd_data): New.
(_bfd_m68hc12_elf_merge_private_bfd_data): New function.
(_bfd_m68hc12_elf_set_private_flags): New function.
Use them to set/check/print ELF flags specific to 68HC12.
fix masks for PC-rel relocs.
(m68hc11_elf_ignore_reloc): New function.
* elf32-m68hc12.c (m68hc12_elf_special_reloc): New to handle specific
68HC12 banked addressing relocs.
(m68hc12_phys_addr): New to compute physical address of banked memory.
(m68hc12_phys_page): Likewise for page.
(m68hc12_addr_is_banked): New to see if address is in banked area.
(elf_m68hc12_howto_table): Add new relocs and rename to xx12.
mask entries. Use complain_overflow_dont for R_REF.
(xcoff_reloc_type_ba): Revert last change.
(xcoff_reloc_type_br): Likewise.
(xcoff_reloc_type_crel): Likewise.
(xcoff_ppc_relocate_section): Likewise.
* coff64-rs6000.c (xcoff64_reloc_type_br): Likewise.
(xcoff64_ppc_relocate_section): Likewise.
(xcoff64_howto_table): Revert some of last change to mask entries.
Use complain_overflow_dont for R_REF.
relocs with bitsize == 16 have size = 1.
(xcoff_reloc_type_ba): Correct src_mask and dst_mask adjustment.
(xcoff_reloc_type_br): Likewise.
(xcoff_reloc_type_crel): Likewise.
(xcoff_ppc_relocate_section): Set up src_mask and dst_mask correctly.
* coff64-rs6000.c (xcoff64_reloc_type_br): Correct src_mask and
dst_mask adjustment.
(xcoff64_ppc_relocate_section): Set up src_mask and dst_mask correctly.
(xcoff64_howto_table): Fix src_mask entries. Make all relocs with
bitsize == 16 have size = 1.
(struct misc): New field isymbuf. All free_* fields removed.
(symbol_value): Pass in internal syms. No need to swap syms in.
(ip2k_elf_relax_section): Use bfd_elf_get_elf_syms. Properly free
possibly cached info.
(tidyup_after_error): Removed.
(ip2k_elf_relax_section_pass1): Don't use removed fields of struct
misc. Use new field.
(adjust_all_relocations): Use internal syms. No need to swap syms
in and out.
(add_page_insn): Don't use removed fields of struct misc.
* ldlang.c (lang_add_section): Don't turn .tbss into normal sections
for relocatable link.
(lang_size_sections_1): Don't make .tbss zero size for relocatable
link.
* elfxx-mips.c (_bfd_mips_elf_merge_private_bfd_data): Merge ASE
flags into resulting BFD.
[ld/testsuite/]
* ld-mips-elf/mips16-1.d,
* ld-mips-elf/mips16-1[ab].s: New test.
* ld-mips-elf/mips-elf.exp: Run it.
(mips_elf64_higher_reloc,mips_elf64_highest_reloc,
mips_elf64_gprel16_reloca): Remove prototypes.
(mips16_jump_reloc,mips16_gprel_reloc): Add functions.
(UNUSED_RELOC): Replace by EMPTY_RELOC.
(mips_elf64_howto_table_rel): Use special R_MIPS_HI16 handling. Remove
wrong comments. Remove disfunctional support of R_MIPS_HIGHER and
R_MIPS_HIGHEST.
(mips_elf64_howto_table_rela): Fix handling of R_MIPS_GPREL16 and
R_MIPS_GOT16. Remove wrong comments.
(elf_mips16_jump_howto,elf_mips16_gprel_howto,
elf_mips_gnu_vtinherit_howto,elf_mips_gnu_vtentry_howto): New, code
from elf32-mips.c.
(mips_elf64_hi16_reloc): Fix formatting.
(mips_elf64_higher_reloc,mips_elf64_highest_reloc): Remove.
(mips_elf64_got16_reloc): Fix formatting. Remove superfluous code.
Better comment. Fall back to R_MIPS_GOT_DISP instead of abort().
(mips_elf64_gprel16_reloc): Make static. Add check for
partial_inplace.
(mips_elf64_gprel16_reloca): Remove.
(mips_elf64_literal_reloc): New function.
(mips_elf64_gprel32_reloc): Fix formatting.
(mips_elf64_shift6_reloc): Fix comment. Make static.
(mips16_jump_reloc,mips16_gprel_reloc): New functions, code from
elf32-mips.c.
(elf_reloc_map,mips_reloc_map): New mapping table, similiar as in
elf32-mips.c
(bfd_elf64_bfd_reloc_type_lookup): Use the mapping table. Enable GNU
specific relocations.
(mips_elf64_rtype_to_howto): Enable GNU specific relocations.
(mips_elf64_object_p): Invert logic to check for SGI-ish ABI.
(ELF_MAXPAGESIZE): Add comment.
as elf_link_record_local_dynamic_symbol.
(_bfd_elf64_link_record_local_dynamic_symbol): Likewise.
(elf_link_record_local_dynamic_symbol): Declare. Now returns int.
* elflink.h (elf_link_record_local_dynamic_symbol): Move to..
* elflink.c: .. here. Use bfd_elf_get_elf_syms. Check whether an
attempt is made to record a symbol in a discarded section, and
return `2' in that case.