X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=bfd%2Felf64-sparc.c;h=c4e97a72460e51096ebb021296655f177580c559;hb=72b016b4ac0d7532a8f173fe3472e2e88ac49d45;hp=3cfa09463e955e92f421ac7e9719bc0314708b32;hpb=cd123cb70c845b890eed231a84e6e84c92c2ef92;p=binutils-gdb.git diff --git a/bfd/elf64-sparc.c b/bfd/elf64-sparc.c index 3cfa09463e9..c4e97a72460 100644 --- a/bfd/elf64-sparc.c +++ b/bfd/elf64-sparc.c @@ -1,6 +1,6 @@ /* SPARC-specific support for 64-bit ELF Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, - 2003, 2004, 2005, 2007 Free Software Foundation, Inc. + 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. This file is part of BFD, the Binary File Descriptor library. @@ -98,7 +98,7 @@ elf64_sparc_slurp_one_reloc_table (bfd *abfd, asection *asect, else relent->address = rela.r_offset - asect->vma; - if (ELF64_R_SYM (rela.r_info) == 0) + if (ELF64_R_SYM (rela.r_info) == STN_UNDEF) relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr; else { @@ -163,10 +163,10 @@ elf64_sparc_slurp_reloc_table (bfd *abfd, asection *asect, || asect->reloc_count == 0) return TRUE; - rel_hdr = &d->rel_hdr; - rel_hdr2 = d->rel_hdr2; + rel_hdr = d->rel.hdr; + rel_hdr2 = d->rela.hdr; - BFD_ASSERT (asect->rel_filepos == rel_hdr->sh_offset + BFD_ASSERT ((rel_hdr && asect->rel_filepos == rel_hdr->sh_offset) || (rel_hdr2 && asect->rel_filepos == rel_hdr2->sh_offset)); } else @@ -193,8 +193,9 @@ elf64_sparc_slurp_reloc_table (bfd *abfd, asection *asect, canon_reloc_count. */ canon_reloc_count (asect) = 0; - if (!elf64_sparc_slurp_one_reloc_table (abfd, asect, rel_hdr, symbols, - dynamic)) + if (rel_hdr + && !elf64_sparc_slurp_one_reloc_table (abfd, asect, rel_hdr, symbols, + dynamic)) return FALSE; if (rel_hdr2 @@ -325,7 +326,7 @@ elf64_sparc_write_relocs (bfd *abfd, asection *sec, PTR data) } } - rela_hdr = &elf_section_data (sec)->rel_hdr; + rela_hdr = elf_section_data (sec)->rela.hdr; rela_hdr->sh_size = rela_hdr->sh_entsize * count; rela_hdr->contents = (PTR) bfd_alloc (abfd, rela_hdr->sh_size); @@ -424,6 +425,11 @@ elf64_sparc_add_symbol_hook (bfd *abfd, struct bfd_link_info *info, { static const char *const stt_types[] = { "NOTYPE", "OBJECT", "FUNCTION" }; + if ((abfd->flags & DYNAMIC) == 0 + && (ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC + || ELF_ST_BIND (sym->st_info) == STB_GNU_UNIQUE)) + elf_tdata (info->output_bfd)->has_gnu_symbols = TRUE; + if (ELF_ST_TYPE (sym->st_info) == STT_REGISTER) { int reg; @@ -441,7 +447,7 @@ elf64_sparc_add_symbol_hook (bfd *abfd, struct bfd_link_info *info, return FALSE; } - if (info->hash->creator != abfd->xvec + if (info->output_bfd->xvec != abfd->xvec || (abfd->flags & DYNAMIC) != 0) { /* STT_REGISTER only works when linking an elf64_sparc object. @@ -510,7 +516,7 @@ elf64_sparc_add_symbol_hook (bfd *abfd, struct bfd_link_info *info, return TRUE; } else if (*namep && **namep - && info->hash->creator == abfd->xvec) + && info->output_bfd->xvec == abfd->xvec) { int i; struct _bfd_sparc_elf_app_reg *p; @@ -538,10 +544,11 @@ elf64_sparc_add_symbol_hook (bfd *abfd, struct bfd_link_info *info, static bfd_boolean elf64_sparc_output_arch_syms (bfd *output_bfd ATTRIBUTE_UNUSED, struct bfd_link_info *info, - PTR finfo, bfd_boolean (*func) (PTR, const char *, - Elf_Internal_Sym *, - asection *, - struct elf_link_hash_entry *)) + PTR finfo, + int (*func) (PTR, const char *, + Elf_Internal_Sym *, + asection *, + struct elf_link_hash_entry *)) { int reg; struct _bfd_sparc_elf_app_reg *app_regs = @@ -585,10 +592,11 @@ elf64_sparc_output_arch_syms (bfd *output_bfd ATTRIBUTE_UNUSED, sym.st_other = 0; sym.st_info = ELF_ST_INFO (app_regs [reg].bind, STT_REGISTER); sym.st_shndx = app_regs [reg].shndx; - if (! (*func) (finfo, app_regs [reg].name, &sym, - sym.st_shndx == SHN_ABS - ? bfd_abs_section_ptr : bfd_und_section_ptr, - NULL)) + sym.st_target_internal = 0; + if ((*func) (finfo, app_regs [reg].name, &sym, + sym.st_shndx == SHN_ABS + ? bfd_abs_section_ptr : bfd_und_section_ptr, + NULL) != 1) return FALSE; } @@ -798,6 +806,7 @@ const struct elf_size_info elf64_sparc_size_info = EV_CURRENT, bfd_elf64_write_out_phdrs, bfd_elf64_write_shdrs_and_ehdr, + bfd_elf64_checksum_contents, elf64_sparc_write_relocs, bfd_elf64_swap_symbol_in, bfd_elf64_swap_symbol_out, @@ -854,6 +863,8 @@ const struct elf_size_info elf64_sparc_size_info = _bfd_sparc_elf_plt_sym_val #define bfd_elf64_bfd_link_hash_table_create \ _bfd_sparc_elf_link_hash_table_create +#define bfd_elf64_bfd_link_hash_table_free \ + _bfd_sparc_elf_link_hash_table_free #define elf_info_to_howto \ _bfd_sparc_elf_info_to_howto #define elf_backend_copy_indirect_symbol \ @@ -869,6 +880,8 @@ const struct elf_size_info elf64_sparc_size_info = #define elf_backend_create_dynamic_sections \ _bfd_sparc_elf_create_dynamic_sections +#define elf_backend_relocs_compatible \ + _bfd_elf_relocs_compatible #define elf_backend_check_relocs \ _bfd_sparc_elf_check_relocs #define elf_backend_adjust_dynamic_symbol \ @@ -906,6 +919,8 @@ const struct elf_size_info elf64_sparc_size_info = /* Section 5.2.4 of the ABI specifies a 256-byte boundary for the table. */ #define elf_backend_plt_alignment 8 +#define elf_backend_post_process_headers _bfd_elf_set_osabi + #include "elf64-target.h" /* FreeBSD support */ @@ -916,10 +931,28 @@ const struct elf_size_info elf64_sparc_size_info = #undef ELF_OSABI #define ELF_OSABI ELFOSABI_FREEBSD -#undef elf_backend_post_process_headers -#define elf_backend_post_process_headers _bfd_elf_set_osabi #undef elf64_bed #define elf64_bed elf64_sparc_fbsd_bed #include "elf64-target.h" +/* Solaris 2. */ + +#undef TARGET_BIG_SYM +#define TARGET_BIG_SYM bfd_elf64_sparc_sol2_vec +#undef TARGET_BIG_NAME +#define TARGET_BIG_NAME "elf64-sparc-sol2" + +/* Restore default: we cannot use ELFOSABI_SOLARIS, otherwise ELFOSABI_NONE + objects won't be recognized. */ +#undef ELF_OSABI + +#undef elf64_bed +#define elf64_bed elf64_sparc_sol2_bed + +/* The 64-bit static TLS arena size is rounded to the nearest 16-byte + boundary. */ +#undef elf_backend_static_tls_alignment +#define elf_backend_static_tls_alignment 16 + +#include "elf64-target.h"