PR ld/2218

* elf32-arm.c (allocate_dynrelocs): Ensure undef weak sym in pie
	is dynamic.
	* elf32-hppa.c (allocate_dynrelocs): Likewise.
	* elf32-i386.c (allocate_dynrelocs): Likewise.
	* elf32-s390.c (allocate_dynrelocs): Likewise.
	* elf32-sh.c (allocate_dynrelocs): Likewise.
	* elf64-s390.c (allocate_dynrelocs): Likewise.
	* elf64-x86-64.c (allocate_dynrelocs): Likewise.
	* elf32-m32r.c (allocate_dynrelocs): Likewise.  Discard relocs
	on undef weak with non-default visibility too.
	* elfxx-sparc.c (allocate_dynrelocs): Ditto.
This commit is contained in:
Alan Modra 2006-02-21 01:51:59 +00:00
parent 3168356f3e
commit 22d606e9c2
10 changed files with 158 additions and 22 deletions

View file

@ -1,3 +1,18 @@
2006-02-21 Alan Modra <amodra@bigpond.net.au>
PR ld/2218
* elf32-arm.c (allocate_dynrelocs): Ensure undef weak sym in pie
is dynamic.
* elf32-hppa.c (allocate_dynrelocs): Likewise.
* elf32-i386.c (allocate_dynrelocs): Likewise.
* elf32-s390.c (allocate_dynrelocs): Likewise.
* elf32-sh.c (allocate_dynrelocs): Likewise.
* elf64-s390.c (allocate_dynrelocs): Likewise.
* elf64-x86-64.c (allocate_dynrelocs): Likewise.
* elf32-m32r.c (allocate_dynrelocs): Likewise. Discard relocs
on undef weak with non-default visibility too.
* elfxx-sparc.c (allocate_dynrelocs): Ditto.
2006-02-21 Alan Modra <amodra@bigpond.net.au>
* bfd.c: (_bfd_default_error_handler): Don't call abort on

View file

@ -6333,9 +6333,22 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void * inf)
/* Also discard relocs on undefined weak syms with non-default
visibility. */
if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
if (eh->relocs_copied != NULL
&& h->root.type == bfd_link_hash_undefweak)
eh->relocs_copied = NULL;
{
if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
eh->relocs_copied = NULL;
/* Make sure undefined weak symbols are output as a dynamic
symbol in PIEs. */
else if (h->dynindx == -1
&& !h->forced_local)
{
if (! bfd_elf_link_record_dynamic_symbol (info, h))
return FALSE;
}
}
else if (htab->root.is_relocatable_executable && h->dynindx == -1
&& h->root.type == bfd_link_hash_new)
{

View file

@ -1,6 +1,6 @@
/* BFD back-end for HP PA-RISC ELF files.
Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1999, 2000, 2001,
2002, 2003, 2004, 2005 Free Software Foundation, Inc.
2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
Original code by
Center for Software Science
@ -2020,9 +2020,21 @@ allocate_dynrelocs (struct elf_link_hash_entry *eh, void *inf)
/* Also discard relocs on undefined weak syms with non-default
visibility. */
if (ELF_ST_VISIBILITY (eh->other) != STV_DEFAULT
if (hh->dyn_relocs != NULL
&& eh->root.type == bfd_link_hash_undefweak)
hh->dyn_relocs = NULL;
{
if (ELF_ST_VISIBILITY (eh->other) != STV_DEFAULT)
hh->dyn_relocs = NULL;
/* Make sure undefined weak symbols are output as a dynamic
symbol in PIEs. */
else if (eh->dynindx == -1
&& !eh->forced_local)
{
if (! bfd_elf_link_record_dynamic_symbol (info, eh))
return FALSE;
}
}
}
else
{

View file

@ -1779,9 +1779,21 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
/* Also discard relocs on undefined weak syms with non-default
visibility. */
if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
if (eh->dyn_relocs != NULL
&& h->root.type == bfd_link_hash_undefweak)
eh->dyn_relocs = NULL;
{
if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
eh->dyn_relocs = NULL;
/* Make sure undefined weak symbols are output as a dynamic
symbol in PIEs. */
else if (h->dynindx == -1
&& !h->forced_local)
{
if (! bfd_elf_link_record_dynamic_symbol (info, h))
return FALSE;
}
}
}
else if (ELIMINATE_COPY_RELOCS)
{

View file

@ -1,6 +1,6 @@
/* M32R-specific support for 32-bit ELF.
Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
Free Software Foundation, Inc.
Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
2006 Free Software Foundation, Inc.
This file is part of BFD, the Binary File Descriptor library.
@ -2101,6 +2101,24 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void * inf)
pp = &p->next;
}
}
/* Also discard relocs on undefined weak syms with non-default
visibility. */
if (eh->dyn_relocs != NULL
&& h->root.type == bfd_link_hash_undefweak)
{
if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
eh->dyn_relocs = NULL;
/* Make sure undefined weak symbols are output as a dynamic
symbol in PIEs. */
else if (h->dynindx == -1
&& !h->forced_local)
{
if (! bfd_elf_link_record_dynamic_symbol (info, h))
return FALSE;
}
}
}
else
{

View file

@ -1,5 +1,5 @@
/* IBM S/390-specific support for 32-bit ELF
Copyright 2000, 2001, 2002, 2003, 2004, 2005
Copyright 2000, 2001, 2002, 2003, 2004, 2005, 2006
Free Software Foundation, Inc.
Contributed by Carl B. Pedersen and Martin Schwidefsky.
@ -1908,9 +1908,21 @@ allocate_dynrelocs (h, inf)
/* Also discard relocs on undefined weak syms with non-default
visibility. */
if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
if (eh->dyn_relocs != NULL
&& h->root.type == bfd_link_hash_undefweak)
eh->dyn_relocs = NULL;
{
if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
eh->dyn_relocs = NULL;
/* Make sure undefined weak symbols are output as a dynamic
symbol in PIEs. */
else if (h->dynindx == -1
&& !h->forced_local)
{
if (! bfd_elf_link_record_dynamic_symbol (info, h))
return FALSE;
}
}
}
else if (ELIMINATE_COPY_RELOCS)
{

View file

@ -1,6 +1,6 @@
/* Renesas / SuperH SH specific support for 32-bit ELF
Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
Free Software Foundation, Inc.
Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
2006 Free Software Foundation, Inc.
Contributed by Ian Lance Taylor, Cygnus Support.
This file is part of BFD, the Binary File Descriptor library.
@ -4160,9 +4160,21 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
/* Also discard relocs on undefined weak syms with non-default
visibility. */
if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
if (eh->dyn_relocs != NULL
&& h->root.type == bfd_link_hash_undefweak)
eh->dyn_relocs = NULL;
{
if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
eh->dyn_relocs = NULL;
/* Make sure undefined weak symbols are output as a dynamic
symbol in PIEs. */
else if (h->dynindx == -1
&& !h->forced_local)
{
if (! bfd_elf_link_record_dynamic_symbol (info, h))
return FALSE;
}
}
}
else
{

View file

@ -1,5 +1,5 @@
/* IBM S/390-specific support for 64-bit ELF
Copyright 2000, 2001, 2002, 2003, 2004, 2005
Copyright 2000, 2001, 2002, 2003, 2004, 2005, 2006
Free Software Foundation, Inc.
Contributed Martin Schwidefsky (schwidefsky@de.ibm.com).
@ -1881,9 +1881,21 @@ allocate_dynrelocs (h, inf)
/* Also discard relocs on undefined weak syms with non-default
visibility. */
if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
if (eh->dyn_relocs != NULL
&& h->root.type == bfd_link_hash_undefweak)
eh->dyn_relocs = NULL;
{
if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
eh->dyn_relocs = NULL;
/* Make sure undefined weak symbols are output as a dynamic
symbol in PIEs. */
else if (h->dynindx == -1
&& !h->forced_local)
{
if (! bfd_elf_link_record_dynamic_symbol (info, h))
return FALSE;
}
}
}
else if (ELIMINATE_COPY_RELOCS)
{

View file

@ -1565,9 +1565,21 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void * inf)
/* Also discard relocs on undefined weak syms with non-default
visibility. */
if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
if (eh->dyn_relocs != NULL
&& h->root.type == bfd_link_hash_undefweak)
eh->dyn_relocs = NULL;
{
if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
eh->dyn_relocs = NULL;
/* Make sure undefined weak symbols are output as a dynamic
symbol in PIEs. */
else if (h->dynindx == -1
&& !h->forced_local)
{
if (! bfd_elf_link_record_dynamic_symbol (info, h))
return FALSE;
}
}
}
else if (ELIMINATE_COPY_RELOCS)
{

View file

@ -1,5 +1,5 @@
/* SPARC-specific support for ELF
Copyright 2005 Free Software Foundation, Inc.
Copyright 2005, 2006 Free Software Foundation, Inc.
This file is part of BFD, the Binary File Descriptor library.
@ -1935,6 +1935,24 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, PTR inf)
pp = &p->next;
}
}
/* Also discard relocs on undefined weak syms with non-default
visibility. */
if (eh->dyn_relocs != NULL
&& h->root.type == bfd_link_hash_undefweak)
{
if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
eh->dyn_relocs = NULL;
/* Make sure undefined weak symbols are output as a dynamic
symbol in PIEs. */
else if (h->dynindx == -1
&& !h->forced_local)
{
if (! bfd_elf_link_record_dynamic_symbol (info, h))
return FALSE;
}
}
}
else
{