X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=bfd%2Felf64-sparc.c;h=7696d0296d222472ff388957d7d4ae8432eb29af;hb=ab2477e15cbe067ff119f1bb5dea05de3cadbdd5;hp=c4e97a72460e51096ebb021296655f177580c559;hpb=f64b2e8d60f277b705c96d4b4e585f5f7c847cc4;p=deliverable%2Fbinutils-gdb.git diff --git a/bfd/elf64-sparc.c b/bfd/elf64-sparc.c index c4e97a7246..7696d0296d 100644 --- a/bfd/elf64-sparc.c +++ b/bfd/elf64-sparc.c @@ -1,6 +1,5 @@ /* SPARC-specific support for 64-bit ELF - Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, - 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. + Copyright (C) 1993-2017 Free Software Foundation, Inc. This file is part of BFD, the Binary File Descriptor library. @@ -56,7 +55,7 @@ elf64_sparc_slurp_one_reloc_table (bfd *abfd, asection *asect, Elf_Internal_Shdr *rel_hdr, asymbol **symbols, bfd_boolean dynamic) { - PTR allocated = NULL; + void * allocated = NULL; bfd_byte *native_relocs; arelent *relent; unsigned int i; @@ -64,7 +63,7 @@ elf64_sparc_slurp_one_reloc_table (bfd *abfd, asection *asect, bfd_size_type count; arelent *relents; - allocated = (PTR) bfd_malloc (rel_hdr->sh_size); + allocated = bfd_malloc (rel_hdr->sh_size); if (allocated == NULL) goto error_return; @@ -98,7 +97,11 @@ 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) == STN_UNDEF) + if (ELF64_R_SYM (rela.r_info) == STN_UNDEF + /* PR 17512: file: 996185f8. */ + || (!dynamic && ELF64_R_SYM(rela.r_info) > bfd_get_symcount(abfd)) + || (dynamic + && ELF64_R_SYM(rela.r_info) > bfd_get_dynamic_symcount(abfd))) relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr; else { @@ -275,10 +278,22 @@ elf64_sparc_canonicalize_dynamic_reloc (bfd *abfd, arelent **storage, return ret; } +/* Install a new set of internal relocs. */ + +static void +elf64_sparc_set_reloc (bfd *abfd ATTRIBUTE_UNUSED, + asection *asect, + arelent **location, + unsigned int count) +{ + asect->orelocation = location; + canon_reloc_count (asect) = count; +} + /* Write out the relocs. */ static void -elf64_sparc_write_relocs (bfd *abfd, asection *sec, PTR data) +elf64_sparc_write_relocs (bfd *abfd, asection *sec, void * data) { bfd_boolean *failedp = (bfd_boolean *) data; Elf_Internal_Shdr *rela_hdr; @@ -299,14 +314,14 @@ elf64_sparc_write_relocs (bfd *abfd, asection *sec, PTR data) reloc_count field to zero to inhibit writing them here. Also, sometimes the SEC_RELOC flag gets set even when there aren't any relocs. */ - if (sec->reloc_count == 0) + if (canon_reloc_count (sec) == 0) return; /* We can combine two relocs that refer to the same address into R_SPARC_OLO10 if first one is R_SPARC_LO10 and the latter is R_SPARC_13 with no associated symbol. */ count = 0; - for (idx = 0; idx < sec->reloc_count; idx++) + for (idx = 0; idx < canon_reloc_count (sec); idx++) { bfd_vma addr; @@ -314,7 +329,7 @@ elf64_sparc_write_relocs (bfd *abfd, asection *sec, PTR data) addr = sec->orelocation[idx]->address; if (sec->orelocation[idx]->howto->type == R_SPARC_LO10 - && idx < sec->reloc_count - 1) + && idx < canon_reloc_count (sec) - 1) { arelent *r = sec->orelocation[idx + 1]; @@ -329,7 +344,7 @@ elf64_sparc_write_relocs (bfd *abfd, asection *sec, PTR data) 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); + rela_hdr->contents = bfd_alloc (abfd, rela_hdr->sh_size); if (rela_hdr->contents == NULL) { *failedp = TRUE; @@ -351,7 +366,7 @@ elf64_sparc_write_relocs (bfd *abfd, asection *sec, PTR data) outbound_relocas = (Elf64_External_Rela *) rela_hdr->contents; src_rela = outbound_relocas; - for (idx = 0; idx < sec->reloc_count; idx++) + for (idx = 0; idx < canon_reloc_count (sec); idx++) { Elf_Internal_Rela dst_rela; arelent *ptr; @@ -385,7 +400,7 @@ elf64_sparc_write_relocs (bfd *abfd, asection *sec, PTR data) } if (ptr->howto->type == R_SPARC_LO10 - && idx < sec->reloc_count - 1) + && idx < canon_reloc_count (sec) - 1) { arelent *r = sec->orelocation[idx + 1]; @@ -425,10 +440,10 @@ 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_GNU_IFUNC + && (abfd->flags & DYNAMIC) == 0 + && bfd_get_flavour (info->output_bfd) == bfd_target_elf_flavour) + elf_tdata (info->output_bfd)->has_gnu_symbols |= elf_gnu_symbol_ifunc; if (ELF_ST_TYPE (sym->st_info) == STT_REGISTER) { @@ -441,7 +456,7 @@ elf64_sparc_add_symbol_hook (bfd *abfd, struct bfd_link_info *info, case 2: reg -= 2; break; case 6: reg -= 4; break; default: - (*_bfd_error_handler) + _bfd_error_handler (_("%B: Only registers %%g[2367] can be declared using STT_REGISTER"), abfd); return FALSE; @@ -461,11 +476,12 @@ elf64_sparc_add_symbol_hook (bfd *abfd, struct bfd_link_info *info, if (p->name != NULL && strcmp (p->name, *namep)) { - (*_bfd_error_handler) - (_("Register %%g%d used incompatibly: %s in %B, previously %s in %B"), - abfd, p->abfd, (int) sym->st_value, - **namep ? *namep : "#scratch", - *p->name ? p->name : "#scratch"); + _bfd_error_handler + /* xgettext:c-format */ + (_("Register %%g%d used incompatibly: %s in %B," + " previously %s in %B"), + (int) sym->st_value, **namep ? *namep : "#scratch", abfd, + *p->name ? p->name : "#scratch", p->abfd); return FALSE; } @@ -484,9 +500,11 @@ elf64_sparc_add_symbol_hook (bfd *abfd, struct bfd_link_info *info, if (type > STT_FUNC) type = 0; - (*_bfd_error_handler) - (_("Symbol `%s' has differing types: REGISTER in %B, previously %s in %B"), - abfd, p->abfd, *namep, stt_types[type]); + _bfd_error_handler + /* xgettext:c-format */ + (_("Symbol `%s' has differing types: REGISTER in %B," + " previously %s in %B"), + *namep, abfd, stt_types[type], p->abfd); return FALSE; } @@ -529,9 +547,11 @@ elf64_sparc_add_symbol_hook (bfd *abfd, struct bfd_link_info *info, if (type > STT_FUNC) type = 0; - (*_bfd_error_handler) - (_("Symbol `%s' has differing types: %s in %B, previously REGISTER in %B"), - abfd, p->abfd, *namep, stt_types[type]); + _bfd_error_handler + /* xgettext:c-format */ + (_("Symbol `%s' has differing types: %s in %B," + " previously REGISTER in %B"), + *namep, stt_types[type], abfd, p->abfd); return FALSE; } } @@ -544,8 +564,8 @@ 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, - int (*func) (PTR, const char *, + void * flaginfo, + int (*func) (void *, const char *, Elf_Internal_Sym *, asection *, struct elf_link_hash_entry *)) @@ -562,7 +582,7 @@ elf64_sparc_output_arch_syms (bfd *output_bfd ATTRIBUTE_UNUSED, if (elf_hash_table (info)->dynlocal) { bfd * dynobj = elf_hash_table (info)->dynobj; - asection *dynsymsec = bfd_get_section_by_name (dynobj, ".dynsym"); + asection *dynsymsec = bfd_get_linker_section (dynobj, ".dynsym"); struct elf_link_local_dynamic_entry *e; for (e = elf_hash_table (info)->dynlocal; e ; e = e->next) @@ -593,7 +613,7 @@ elf64_sparc_output_arch_syms (bfd *output_bfd ATTRIBUTE_UNUSED, sym.st_info = ELF_ST_INFO (app_regs [reg].bind, STT_REGISTER); sym.st_shndx = app_regs [reg].shndx; sym.st_target_internal = 0; - if ((*func) (finfo, app_regs [reg].name, &sym, + if ((*func) (flaginfo, app_regs [reg].name, &sym, sym.st_shndx == SHN_ABS ? bfd_abs_section_ptr : bfd_und_section_ptr, NULL) != 1) @@ -635,8 +655,9 @@ elf64_sparc_symbol_processing (bfd *abfd ATTRIBUTE_UNUSED, asymbol *asym) object file when linking. */ static bfd_boolean -elf64_sparc_merge_private_bfd_data (bfd *ibfd, bfd *obfd) +elf64_sparc_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info) { + bfd *obfd = info->output_bfd; bfd_boolean error; flagword new_flags, old_flags; int new_mm, old_mm; @@ -682,7 +703,7 @@ elf64_sparc_merge_private_bfd_data (bfd *ibfd, bfd *obfd) && (old_flags & EF_SPARC_HAL_R1)) { error = TRUE; - (*_bfd_error_handler) + _bfd_error_handler (_("%B: linking UltraSPARC specific with HAL specific code"), ibfd); } @@ -701,9 +722,10 @@ elf64_sparc_merge_private_bfd_data (bfd *ibfd, bfd *obfd) if (new_flags != old_flags) { error = TRUE; - (*_bfd_error_handler) - (_("%B: uses different e_flags (0x%lx) fields than previous modules (0x%lx)"), - ibfd, (long) new_flags, (long) old_flags); + _bfd_error_handler + /* xgettext:c-format */ + (_("%B: uses different e_flags (%#x) fields than previous modules (%#x)"), + ibfd, new_flags, old_flags); } elf_elfheader (obfd)->e_flags = old_flags; @@ -714,7 +736,7 @@ elf64_sparc_merge_private_bfd_data (bfd *ibfd, bfd *obfd) return FALSE; } } - return TRUE; + return _bfd_sparc_elf_merge_private_bfd_data (ibfd, info); } /* MARCO: Set the correct entry size for the .stab section. */ @@ -740,7 +762,7 @@ elf64_sparc_fake_sections (bfd *abfd ATTRIBUTE_UNUSED, /* Print a STT_REGISTER symbol to file FILE. */ static const char * -elf64_sparc_print_symbol_all (bfd *abfd ATTRIBUTE_UNUSED, PTR filep, +elf64_sparc_print_symbol_all (bfd *abfd ATTRIBUTE_UNUSED, void * filep, asymbol *symbol) { FILE *file = (FILE *) filep; @@ -764,7 +786,9 @@ elf64_sparc_print_symbol_all (bfd *abfd ATTRIBUTE_UNUSED, PTR filep, } static enum elf_reloc_type_class -elf64_sparc_reloc_type_class (const Elf_Internal_Rela *rela) +elf64_sparc_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSED, + const asection *rel_sec ATTRIBUTE_UNUSED, + const Elf_Internal_Rela *rela) { switch ((int) ELF64_R_TYPE (rela->r_info)) { @@ -820,7 +844,7 @@ const struct elf_size_info elf64_sparc_size_info = bfd_elf64_swap_reloca_out }; -#define TARGET_BIG_SYM bfd_elf64_sparc_vec +#define TARGET_BIG_SYM sparc_elf64_vec #define TARGET_BIG_NAME "elf64-sparc" #define ELF_ARCH bfd_arch_sparc #define ELF_MAXPAGESIZE 0x100000 @@ -842,6 +866,8 @@ const struct elf_size_info elf64_sparc_size_info = elf64_sparc_canonicalize_reloc #define bfd_elf64_canonicalize_dynamic_reloc \ elf64_sparc_canonicalize_dynamic_reloc +#define bfd_elf64_set_reloc \ + elf64_sparc_set_reloc #define elf_backend_add_symbol_hook \ elf64_sparc_add_symbol_hook #define elf_backend_get_symbol_type \ @@ -863,8 +889,6 @@ 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 \ @@ -896,6 +920,8 @@ const struct elf_size_info elf64_sparc_size_info = _bfd_sparc_elf_finish_dynamic_symbol #define elf_backend_finish_dynamic_sections \ _bfd_sparc_elf_finish_dynamic_sections +#define elf_backend_fixup_symbol \ + _bfd_sparc_elf_fixup_symbol #define bfd_elf64_mkobject \ _bfd_sparc_elf_mkobject @@ -903,8 +929,6 @@ const struct elf_size_info elf64_sparc_size_info = _bfd_sparc_elf_object_p #define elf_backend_gc_mark_hook \ _bfd_sparc_elf_gc_mark_hook -#define elf_backend_gc_sweep_hook \ - _bfd_sparc_elf_gc_sweep_hook #define elf_backend_init_index_section \ _bfd_elf_init_1_index_section @@ -914,18 +938,17 @@ const struct elf_size_info elf64_sparc_size_info = #define elf_backend_plt_readonly 0 #define elf_backend_want_plt_sym 1 #define elf_backend_got_header_size 8 +#define elf_backend_want_dynrelro 1 #define elf_backend_rela_normal 1 /* 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 */ #undef TARGET_BIG_SYM -#define TARGET_BIG_SYM bfd_elf64_sparc_freebsd_vec +#define TARGET_BIG_SYM sparc_elf64_fbsd_vec #undef TARGET_BIG_NAME #define TARGET_BIG_NAME "elf64-sparc-freebsd" #undef ELF_OSABI @@ -939,7 +962,7 @@ const struct elf_size_info elf64_sparc_size_info = /* Solaris 2. */ #undef TARGET_BIG_SYM -#define TARGET_BIG_SYM bfd_elf64_sparc_sol2_vec +#define TARGET_BIG_SYM sparc_elf64_sol2_vec #undef TARGET_BIG_NAME #define TARGET_BIG_NAME "elf64-sparc-sol2"