Index: bfd/elf64-ia64-vms.c |
diff --git a/bfd/elf64-ia64-vms.c b/bfd/elf64-ia64-vms.c |
index ef7837409bec86af9c5bddf33d8d899b8ac1b392..58a05af845b2852ed0aaf43f0a792ae4f8f93d4f 100644 |
--- a/bfd/elf64-ia64-vms.c |
+++ b/bfd/elf64-ia64-vms.c |
@@ -539,7 +539,7 @@ elf64_ia64_relax_section (bfd *abfd, asection *sec, |
.plt section. After the first relaxation pass, linker may |
increase the gap between the .plt and .text sections up |
to 32byte. We assume linker will always insert 32byte |
- between the .plt and .text sections after the the first |
+ between the .plt and .text sections after the first |
relaxation pass. */ |
if (tsec == ia64_info->root.splt) |
offset = -0x1000000 + 32; |
@@ -1072,7 +1072,7 @@ elf64_ia64_hash_table_free (struct bfd_link_hash_table *hash) |
objalloc_free ((struct objalloc *) ia64_info->loc_hash_memory); |
elf_link_hash_traverse (&ia64_info->root, |
elf64_ia64_global_dyn_info_free, NULL); |
- _bfd_generic_link_hash_table_free (hash); |
+ _bfd_elf_link_hash_table_free (hash); |
} |
/* Traverse both local and global hash tables. */ |
@@ -2095,6 +2095,9 @@ elf64_ia64_check_relocs (bfd *abfd, struct bfd_link_info *info, |
|| h->root.type == bfd_link_hash_warning) |
h = (struct elf_link_hash_entry *) h->root.u.i.link; |
+ /* PR15323, ref flags aren't set for references in the same |
+ object. */ |
+ h->root.non_ir_ref = 1; |
h->ref_regular = 1; |
} |
else |
@@ -3492,13 +3495,13 @@ elf64_ia64_relocate_section (bfd *output_bfd, |
else |
{ |
bfd_boolean unresolved_reloc; |
- bfd_boolean warned; |
+ bfd_boolean warned, ignored; |
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, |
h, sym_sec, value, |
- unresolved_reloc, warned); |
+ unresolved_reloc, warned, ignored); |
if (h->root.type == bfd_link_hash_undefweak) |
undef_weak_ref = TRUE; |
@@ -4030,7 +4033,7 @@ elf64_ia64_finish_dynamic_symbol (bfd *output_bfd, |
} |
/* Mark some specially defined symbols as absolute. */ |
- if (strcmp (h->root.root.string, "_DYNAMIC") == 0 |
+ if (h == ia64_info->root.hdynamic |
|| h == ia64_info->root.hgot |
|| h == ia64_info->root.hplt) |
sym->st_shndx = SHN_ABS; |
@@ -4310,7 +4313,9 @@ elf64_ia64_print_private_bfd_data (bfd *abfd, void * ptr) |
} |
static enum elf_reloc_type_class |
-elf64_ia64_reloc_type_class (const Elf_Internal_Rela *rela) |
+elf64_ia64_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)) |
{ |
@@ -5046,7 +5051,8 @@ error_free_dyn: |
h = (struct elf_link_hash_entry *) h->root.u.i.link; |
*sym_hash = h; |
- h->unique_global = (flags & BSF_GNU_UNIQUE) != 0; |
+ if (definition) |
+ h->unique_global = (flags & BSF_GNU_UNIQUE) != 0; |
/* Set the alignment of a common symbol. */ |
if ((common || bfd_is_com_section (sec)) |