| Index: bfd/elf64-alpha.c
|
| diff --git a/bfd/elf64-alpha.c b/bfd/elf64-alpha.c
|
| index 40e4bfb318c5abc31fb19f5b9786cc0a98bd7cf5..3dbdab73f36862651f16fe5fb23a3c5f1afee745 100644
|
| --- a/bfd/elf64-alpha.c
|
| +++ b/bfd/elf64-alpha.c
|
| @@ -1,6 +1,6 @@
|
| /* Alpha specific support for 64-bit ELF
|
| Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
|
| - 2006, 2007, 2008, 2009, 2010, 2011, 2012
|
| + 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013
|
| Free Software Foundation, Inc.
|
| Contributed by Richard Henderson <rth@tamu.edu>.
|
|
|
| @@ -225,7 +225,7 @@ struct alpha_elf_link_hash_table
|
| #define alpha_elf_sym_hashes(abfd) \
|
| ((struct alpha_elf_link_hash_entry **)elf_sym_hashes(abfd))
|
|
|
| -/* Should we do dynamic things to this symbol? This differs from the
|
| +/* Should we do dynamic things to this symbol? This differs from the
|
| generic version in that we never need to consider function pointer
|
| equality wrt PLT entries -- we don't create a PLT entry if a symbol's
|
| address is ever taken. */
|
| @@ -299,6 +299,15 @@ elf64_alpha_bfd_link_hash_table_create (bfd *abfd)
|
| return &ret->root.root;
|
| }
|
|
|
| +/* Alpha ELF follows MIPS ELF in using a special find_nearest_line
|
| + routine in order to handle the ECOFF debugging information. */
|
| +
|
| +struct alpha_elf_find_line
|
| +{
|
| + struct ecoff_debug_info d;
|
| + struct ecoff_find_line i;
|
| +};
|
| +
|
| /* We have some private fields hanging off of the elf_tdata structure. */
|
|
|
| struct alpha_elf_obj_tdata
|
| @@ -328,6 +337,10 @@ struct alpha_elf_obj_tdata
|
| /* For every got, this is the sum of the number of words required
|
| to hold all of the member object's local got. */
|
| int local_got_size;
|
| +
|
| + /* Used by elf64_alpha_find_nearest_line entry point. */
|
| + struct alpha_elf_find_line *find_line_info;
|
| +
|
| };
|
|
|
| #define alpha_elf_tdata(abfd) \
|
| @@ -1430,17 +1443,6 @@ elf64_alpha_is_local_label_name (bfd *abfd ATTRIBUTE_UNUSED, const char *name)
|
| return name[0] == '$';
|
| }
|
|
|
| -/* Alpha ELF follows MIPS ELF in using a special find_nearest_line
|
| - routine in order to handle the ECOFF debugging information. We
|
| - still call this mips_elf_find_line because of the slot
|
| - find_line_info in elf_obj_tdata is declared that way. */
|
| -
|
| -struct mips_elf_find_line
|
| -{
|
| - struct ecoff_debug_info d;
|
| - struct ecoff_find_line i;
|
| -};
|
| -
|
| static bfd_boolean
|
| elf64_alpha_find_nearest_line (bfd *abfd, asection *section, asymbol **symbols,
|
| bfd_vma offset, const char **filename_ptr,
|
| @@ -1452,7 +1454,7 @@ elf64_alpha_find_nearest_line (bfd *abfd, asection *section, asymbol **symbols,
|
| if (_bfd_dwarf2_find_nearest_line (abfd, dwarf_debug_sections,
|
| section, symbols, offset,
|
| filename_ptr, functionname_ptr,
|
| - line_ptr, 0,
|
| + line_ptr, NULL, 0,
|
| &elf_tdata (abfd)->dwarf2_find_line_info))
|
| return TRUE;
|
|
|
| @@ -1460,7 +1462,7 @@ elf64_alpha_find_nearest_line (bfd *abfd, asection *section, asymbol **symbols,
|
| if (msec != NULL)
|
| {
|
| flagword origflags;
|
| - struct mips_elf_find_line *fi;
|
| + struct alpha_elf_find_line *fi;
|
| const struct ecoff_debug_swap * const swap =
|
| get_elf_backend_data (abfd)->elf_backend_ecoff_debug_swap;
|
|
|
| @@ -1471,16 +1473,16 @@ elf64_alpha_find_nearest_line (bfd *abfd, asection *section, asymbol **symbols,
|
| if (elf_section_data (msec)->this_hdr.sh_type != SHT_NOBITS)
|
| msec->flags |= SEC_HAS_CONTENTS;
|
|
|
| - fi = elf_tdata (abfd)->find_line_info;
|
| + fi = alpha_elf_tdata (abfd)->find_line_info;
|
| if (fi == NULL)
|
| {
|
| bfd_size_type external_fdr_size;
|
| char *fraw_src;
|
| char *fraw_end;
|
| struct fdr *fdr_ptr;
|
| - bfd_size_type amt = sizeof (struct mips_elf_find_line);
|
| + bfd_size_type amt = sizeof (struct alpha_elf_find_line);
|
|
|
| - fi = (struct mips_elf_find_line *) bfd_zalloc (abfd, amt);
|
| + fi = (struct alpha_elf_find_line *) bfd_zalloc (abfd, amt);
|
| if (fi == NULL)
|
| {
|
| msec->flags = origflags;
|
| @@ -1509,7 +1511,7 @@ elf64_alpha_find_nearest_line (bfd *abfd, asection *section, asymbol **symbols,
|
| for (; fraw_src < fraw_end; fraw_src += external_fdr_size, fdr_ptr++)
|
| (*swap->swap_fdr_in) (abfd, fraw_src, fdr_ptr);
|
|
|
| - elf_tdata (abfd)->find_line_info = fi;
|
| + alpha_elf_tdata (abfd)->find_line_info = fi;
|
|
|
| /* Note that we don't bother to ever free this information.
|
| find_nearest_line is either called all the time, as in
|
| @@ -1810,6 +1812,9 @@ elf64_alpha_check_relocs (bfd *abfd, struct bfd_link_info *info,
|
| || h->root.root.type == bfd_link_hash_warning)
|
| h = (struct alpha_elf_link_hash_entry *)h->root.root.u.i.link;
|
|
|
| + /* PR15323, ref flags aren't set for references in the same
|
| + object. */
|
| + h->root.root.non_ir_ref = 1;
|
| h->root.ref_regular = 1;
|
| }
|
|
|
| @@ -3585,7 +3590,9 @@ elf64_alpha_relax_tls_get_addr (struct alpha_relax_info *info, bfd_vma symval,
|
| use_gottprel = FALSE;
|
| new_symndx = is_gd ? ELF64_R_SYM (irel->r_info) : STN_UNDEF;
|
|
|
| - switch (!dynamic && !info->link_info->shared)
|
| + /* Some compilers warn about a Boolean-looking expression being
|
| + used in a switch. The explicit cast silences them. */
|
| + switch ((int) (!dynamic && !info->link_info->shared))
|
| {
|
| case 1:
|
| {
|
| @@ -4141,7 +4148,7 @@ elf64_alpha_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
|
| bfd_boolean ret_val;
|
|
|
| BFD_ASSERT (is_alpha_elf (input_bfd));
|
| -
|
| +
|
| /* Handle relocatable links with a smaller loop. */
|
| if (info->relocatable)
|
| return elf64_alpha_relocate_section_r (output_bfd, info, input_bfd,
|
| @@ -4296,14 +4303,14 @@ elf64_alpha_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
|
| }
|
| else
|
| {
|
| - bfd_boolean warned;
|
| + bfd_boolean warned, ignored;
|
| struct elf_link_hash_entry *hh;
|
| struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (input_bfd);
|
|
|
| RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
|
| r_symndx, symtab_hdr, sym_hashes,
|
| hh, sec, value,
|
| - unresolved_reloc, warned);
|
| + unresolved_reloc, warned, ignored);
|
|
|
| if (warned)
|
| continue;
|
| @@ -4890,19 +4897,19 @@ elf64_alpha_finish_dynamic_symbol (bfd *output_bfd, struct bfd_link_info *info,
|
| abort ();
|
| }
|
|
|
| - elf64_alpha_emit_dynrel (output_bfd, info, sgot, srel,
|
| + elf64_alpha_emit_dynrel (output_bfd, info, sgot, srel,
|
| gotent->got_offset, h->dynindx,
|
| r_type, gotent->addend);
|
|
|
| if (gotent->reloc_type == R_ALPHA_TLSGD)
|
| - elf64_alpha_emit_dynrel (output_bfd, info, sgot, srel,
|
| + elf64_alpha_emit_dynrel (output_bfd, info, sgot, srel,
|
| gotent->got_offset + 8, h->dynindx,
|
| R_ALPHA_DTPREL64, gotent->addend);
|
| }
|
| }
|
|
|
| /* Mark some specially defined symbols as absolute. */
|
| - if (strcmp (h->root.root.string, "_DYNAMIC") == 0
|
| + if (h == elf_hash_table (info)->hdynamic
|
| || h == elf_hash_table (info)->hgot
|
| || h == elf_hash_table (info)->hplt)
|
| sym->st_shndx = SHN_ABS;
|
| @@ -5313,7 +5320,9 @@ elf64_alpha_final_link (bfd *abfd, struct bfd_link_info *info)
|
| }
|
|
|
| static enum elf_reloc_type_class
|
| -elf64_alpha_reloc_type_class (const Elf_Internal_Rela *rela)
|
| +elf64_alpha_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))
|
| {
|
|
|