aboutsummaryrefslogtreecommitdiff
path: root/bfd
diff options
context:
space:
mode:
authorRichard Henderson <rth@redhat.com>2011-06-15 15:04:12 +0000
committerRichard Henderson <rth@redhat.com>2011-06-15 15:04:12 +0000
commit48f4b4f592b16d767bb94b0ce40712f6a04f9f95 (patch)
tree56083d706947c74cc68447e24104a4ba5ada6539 /bfd
parentc2fa21f135a1293e90ab268a9317d29faa3ac47c (diff)
downloadgdb-48f4b4f592b16d767bb94b0ce40712f6a04f9f95.zip
gdb-48f4b4f592b16d767bb94b0ce40712f6a04f9f95.tar.gz
gdb-48f4b4f592b16d767bb94b0ce40712f6a04f9f95.tar.bz2
* elf64-alpha.c (elf64_alpha_copy_indirect_symbol): Rename from
elf64_alpha_merge_ind_symbols; adjust for the generic interface. (elf64_alpha_always_size_sections): Don't call elf64_alpha_merge_ind_symbols. (elf_backend_copy_indirect_symbol): New.
Diffstat (limited to 'bfd')
-rw-r--r--bfd/ChangeLog8
-rw-r--r--bfd/elf64-alpha.c36
2 files changed, 27 insertions, 17 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 0fd8e4f..abe9f72 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,11 @@
+2011-06-14 Richard Henderson <rth@redhat.com>
+
+ * elf64-alpha.c (elf64_alpha_copy_indirect_symbol): Rename from
+ elf64_alpha_merge_ind_symbols; adjust for the generic interface.
+ (elf64_alpha_always_size_sections): Don't call
+ elf64_alpha_merge_ind_symbols.
+ (elf_backend_copy_indirect_symbol): New.
+
2011-06-14 Alan Modra <amodra@gmail.com>
PR ld/12887
diff --git a/bfd/elf64-alpha.c b/bfd/elf64-alpha.c
index 4efe02a..ee8ce5a 100644
--- a/bfd/elf64-alpha.c
+++ b/bfd/elf64-alpha.c
@@ -2148,23 +2148,29 @@ elf64_alpha_merge_symbol_attribute (struct elf_link_hash_entry *h,
indirect to the new ones. Consolidate the got and reloc information
in these situations. */
-static bfd_boolean
-elf64_alpha_merge_ind_symbols (struct alpha_elf_link_hash_entry *hi,
- PTR dummy ATTRIBUTE_UNUSED)
+static void
+elf64_alpha_copy_indirect_symbol (struct bfd_link_info *info,
+ struct elf_link_hash_entry *dir,
+ struct elf_link_hash_entry *ind)
{
- struct alpha_elf_link_hash_entry *hs;
+ struct alpha_elf_link_hash_entry *hi
+ = (struct alpha_elf_link_hash_entry *) ind;
+ struct alpha_elf_link_hash_entry *hs
+ = (struct alpha_elf_link_hash_entry *) dir;
- if (hi->root.root.type != bfd_link_hash_indirect)
- return TRUE;
- hs = hi;
- do {
- hs = (struct alpha_elf_link_hash_entry *)hs->root.root.u.i.link;
- } while (hs->root.root.type == bfd_link_hash_indirect);
+ /* Do the merging in the superclass. */
+ _bfd_elf_link_hash_copy_indirect(info, dir, ind);
/* Merge the flags. Whee. */
-
hs->flags |= hi->flags;
+ /* ??? It's unclear to me what's really supposed to happen when
+ "merging" defweak and defined symbols, given that we don't
+ actually throw away the defweak. This more-or-less copies
+ the logic related to got and plt entries in the superclass. */
+ if (ind->root.type != bfd_link_hash_indirect)
+ return;
+
/* Merge the .got entries. Cannibalize the old symbol's list in
doing so, since we don't need it anymore. */
@@ -2217,8 +2223,6 @@ elf64_alpha_merge_ind_symbols (struct alpha_elf_link_hash_entry *hi,
}
}
hi->reloc_entries = NULL;
-
- return TRUE;
}
/* Is it possible to merge two object file's .got tables? */
@@ -2625,10 +2629,6 @@ elf64_alpha_always_size_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
if (htab == NULL)
return FALSE;
- /* First, take care of the indirect symbols created by versioning. */
- alpha_elf_link_hash_traverse (htab, elf64_alpha_merge_ind_symbols,
- NULL);
-
if (!elf64_alpha_size_got_sections (info))
return FALSE;
@@ -5443,6 +5443,8 @@ static const struct elf_size_info alpha_elf_size_info =
elf64_alpha_adjust_dynamic_symbol
#define elf_backend_merge_symbol_attribute \
elf64_alpha_merge_symbol_attribute
+#define elf_backend_copy_indirect_symbol \
+ elf64_alpha_copy_indirect_symbol
#define elf_backend_always_size_sections \
elf64_alpha_always_size_sections
#define elf_backend_size_dynamic_sections \