summaryrefslogtreecommitdiff
path: root/bfd
diff options
context:
space:
mode:
authorAlan Modra <amodra@bigpond.net.au>2011-04-24 10:02:10 +0000
committerAlan Modra <amodra@bigpond.net.au>2011-04-24 10:02:10 +0000
commit71b09b5e7cfe43eac367b5cf1218ae1f988c18c3 (patch)
treedd889e705be917630f4c1a1d72fd98f854de2ab2 /bfd
parent28544dfcd23ab3ea3159f421978c0c5155c1136e (diff)
downloadbinutils-redhat-71b09b5e7cfe43eac367b5cf1218ae1f988c18c3.tar.gz
PR ld/12365
PR ld/12696 include/ * bfdlink.h (ENUM_BITFIELD): Define. (struct bfd_link_hash_entry): Make "type" a bitfield. Add "non_ir_ref". (struct bfd_link_callbacks <notice>): Pass bfd_link_hash_entry pointer rather than "name". bfd/ * coff-aux.c (coff_m68k_aux_link_add_one_symbol): Update "notice" call. * linker.c (_bfd_link_hash_newfunc): Clear bitfields. (_bfd_generic_link_add_one_symbol): Update "notice" call. * elflink.c (_bfd_elf_merge_symbol): Don't skip weak redefs when it is a redef of an IR symbol in a real BFD. ld/ * ldmain.c (notice): Delete "name" param, add "h". * plugin.c (plugin_notice): Likewise. Set non_ir_ref. Handle redefinitions of IR symbols in real BFDs. (plugin_multiple_definition, plugin_multiple_common): Delete. (non_ironly_hash, init_non_ironly_hash): Delete. (is_visible_from_outside): Traverse entry_symbol chain. (get_symbols): Use non_ir_ref flag rather than hash lookup.
Diffstat (limited to 'bfd')
-rw-r--r--bfd/ChangeLog10
-rw-r--r--bfd/coff-aux.c4
-rw-r--r--bfd/elflink.c5
-rw-r--r--bfd/linker.c9
4 files changed, 19 insertions, 9 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index cc10c522ff..ad71e254cc 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,13 @@
+2011-04-24 Alan Modra <amodra@gmail.com>
+
+ PR ld/12365
+ PR ld/12696
+ * coff-aux.c (coff_m68k_aux_link_add_one_symbol): Update "notice" call.
+ * linker.c (_bfd_link_hash_newfunc): Clear bitfields.
+ (_bfd_generic_link_add_one_symbol): Update "notice" call.
+ * elflink.c (_bfd_elf_merge_symbol): Don't skip weak redefs when
+ it is a redef of an IR symbol in a real BFD.
+
2011-04-22 H.J. Lu <hongjiu.lu@intel.com>
* elf32-i386.c (elf_i386_readonly_dynrelocs): Warn relocation
diff --git a/bfd/coff-aux.c b/bfd/coff-aux.c
index af1db03836..20a680ca4d 100644
--- a/bfd/coff-aux.c
+++ b/bfd/coff-aux.c
@@ -1,5 +1,5 @@
/* BFD back-end for Apple M68K COFF A/UX 3.x files.
- Copyright 1996, 1997, 2000, 2002, 2005, 2007, 2008
+ Copyright 1996, 1997, 2000, 2002, 2005, 2007, 2008, 2011
Free Software Foundation, Inc.
Written by Richard Henderson <rth@tamu.edu>.
@@ -105,7 +105,7 @@ coff_m68k_aux_link_add_one_symbol (info, abfd, name, flags, section, value,
&& (bfd_hash_lookup (info->notice_hash, name, FALSE, FALSE)
!= (struct bfd_hash_entry *) NULL))
{
- if (! (*info->callbacks->notice) (info, name, abfd, section, value))
+ if (! (*info->callbacks->notice) (info, h, abfd, section, value))
return FALSE;
}
diff --git a/bfd/elflink.c b/bfd/elflink.c
index 3a4d22c4cf..082355d72e 100644
--- a/bfd/elflink.c
+++ b/bfd/elflink.c
@@ -1427,7 +1427,10 @@ _bfd_elf_merge_symbol (bfd *abfd,
/* Skip weak definitions of symbols that are already defined. */
if (newdef && olddef && newweak)
{
- *skip = TRUE;
+ /* Don't skip new non-IR weak syms. */
+ if (!((oldbfd->flags & BFD_PLUGIN) != 0
+ && (abfd->flags & BFD_PLUGIN) == 0))
+ *skip = TRUE;
/* Merge st_other. If the symbol already has a dynamic index,
but visibility says it should not be visible, turn it into a
diff --git a/bfd/linker.c b/bfd/linker.c
index 9f2bac3c44..d7ac067824 100644
--- a/bfd/linker.c
+++ b/bfd/linker.c
@@ -465,10 +465,8 @@ _bfd_link_hash_newfunc (struct bfd_hash_entry *entry,
struct bfd_link_hash_entry *h = (struct bfd_link_hash_entry *) entry;
/* Initialize the local fields. */
- h->type = bfd_link_hash_new;
- memset (&h->u.undef.next, 0,
- (sizeof (struct bfd_link_hash_entry)
- - offsetof (struct bfd_link_hash_entry, u.undef.next)));
+ memset ((char *) &h->root + sizeof (h->root), 0,
+ sizeof (*h) - sizeof (h->root));
}
return entry;
@@ -1609,8 +1607,7 @@ _bfd_generic_link_add_one_symbol (struct bfd_link_info *info,
|| (info->notice_hash != NULL
&& bfd_hash_lookup (info->notice_hash, name, FALSE, FALSE) != NULL))
{
- if (! (*info->callbacks->notice) (info, h->root.string, abfd, section,
- value))
+ if (! (*info->callbacks->notice) (info, h, abfd, section, value))
return FALSE;
}