Index: bfd/elfnn-ia64.c |
diff --git a/bfd/elfnn-ia64.c b/bfd/elfnn-ia64.c |
index 7021ff5355907263eac116b34256eacb81cfb98d..ef340cf9855a4f820dfe6aabe52f24ddf2407c62 100644 |
--- a/bfd/elfnn-ia64.c |
+++ b/bfd/elfnn-ia64.c |
@@ -1,6 +1,5 @@ |
/* IA-64 support for 64-bit ELF |
- Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, |
- 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc. |
+ Copyright 1998-2013 Free Software Foundation, Inc. |
Contributed by David Mosberger-Tang <davidm@hpl.hp.com> |
This file is part of BFD, the Binary File Descriptor library. |
@@ -570,7 +569,7 @@ elfNN_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; |
@@ -1094,7 +1093,7 @@ elfNN_ia64_modify_segment_map (bfd *abfd, |
s = bfd_get_section_by_name (abfd, ELF_STRING_ia64_archext); |
if (s && (s->flags & SEC_LOAD)) |
{ |
- for (m = elf_tdata (abfd)->segment_map; m != NULL; m = m->next) |
+ for (m = elf_seg_map (abfd); m != NULL; m = m->next) |
if (m->p_type == PT_IA_64_ARCHEXT) |
break; |
if (m == NULL) |
@@ -1109,7 +1108,7 @@ elfNN_ia64_modify_segment_map (bfd *abfd, |
m->sections[0] = s; |
/* We want to put it after the PHDR and INTERP segments. */ |
- pm = &elf_tdata (abfd)->segment_map; |
+ pm = &elf_seg_map (abfd); |
while (*pm != NULL |
&& ((*pm)->p_type == PT_PHDR |
|| (*pm)->p_type == PT_INTERP)) |
@@ -1129,7 +1128,7 @@ elfNN_ia64_modify_segment_map (bfd *abfd, |
if (s && (s->flags & SEC_LOAD)) |
{ |
- for (m = elf_tdata (abfd)->segment_map; m != NULL; m = m->next) |
+ for (m = elf_seg_map (abfd); m != NULL; m = m->next) |
if (m->p_type == PT_IA_64_UNWIND) |
{ |
int i; |
@@ -1158,7 +1157,7 @@ elfNN_ia64_modify_segment_map (bfd *abfd, |
m->next = NULL; |
/* We want to put it last. */ |
- pm = &elf_tdata (abfd)->segment_map; |
+ pm = &elf_seg_map (abfd); |
while (*pm != NULL) |
pm = &(*pm)->next; |
*pm = m; |
@@ -1181,7 +1180,7 @@ elfNN_ia64_modify_program_headers (bfd *abfd, |
struct elf_segment_map *m; |
Elf_Internal_Phdr *p; |
- for (p = tdata->phdr, m = tdata->segment_map; m != NULL; m = m->next, p++) |
+ for (p = tdata->phdr, m = elf_seg_map (abfd); m != NULL; m = m->next, p++) |
if (m->p_type == PT_LOAD) |
{ |
int i; |
@@ -1463,7 +1462,7 @@ elfNN_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, |
elfNN_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. */ |
@@ -1546,7 +1545,8 @@ elfNN_ia64_create_dynamic_sections (bfd *abfd, |
bfd_set_section_flags (abfd, ia64_info->root.sgot, |
SEC_SMALL_DATA | flags); |
/* The .got section is always aligned at 8 bytes. */ |
- bfd_set_section_alignment (abfd, ia64_info->root.sgot, 3); |
+ if (! bfd_set_section_alignment (abfd, ia64_info->root.sgot, 3)) |
+ return FALSE; |
} |
if (!get_pltoff (abfd, info, ia64_info)) |
@@ -1952,16 +1952,17 @@ get_got (bfd *abfd, struct bfd_link_info *info, |
if (!dynobj) |
ia64_info->root.dynobj = dynobj = abfd; |
if (!_bfd_elf_create_got_section (dynobj, info)) |
- return 0; |
+ return NULL; |
got = ia64_info->root.sgot; |
/* The .got section is always aligned at 8 bytes. */ |
if (!bfd_set_section_alignment (abfd, got, 3)) |
- return 0; |
+ return NULL; |
flags = bfd_get_section_flags (abfd, got); |
- bfd_set_section_flags (abfd, got, SEC_SMALL_DATA | flags); |
+ if (! bfd_set_section_flags (abfd, got, SEC_SMALL_DATA | flags)) |
+ return NULL; |
} |
return got; |
@@ -2352,6 +2353,9 @@ elfNN_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 |
@@ -3898,17 +3902,17 @@ elfNN_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; |
- else if (warned) |
+ else if (warned || (ignored && info->executable)) |
continue; |
} |
@@ -4586,7 +4590,7 @@ elfNN_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; |
@@ -4808,7 +4812,9 @@ elfNN_ia64_print_private_bfd_data (bfd *abfd, void * ptr) |
} |
static enum elf_reloc_type_class |
-elfNN_ia64_reloc_type_class (const Elf_Internal_Rela *rela) |
+elfNN_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) ELFNN_R_TYPE (rela->r_info)) |
{ |