* elflink.c (_bfd_elf_merge_symbol): Treat old definitions from
as-needed dynamic libs as undefined. (elf_link_add_object_symbols): Remove DYN_AS_NEEDED from as-needed libs when finding they are needed.
This commit is contained in:
parent
15dafedca8
commit
a5db907e36
2 changed files with 21 additions and 3 deletions
|
@ -1,3 +1,10 @@
|
||||||
|
2004-12-22 Alan Modra <amodra@bigpond.net.au>
|
||||||
|
|
||||||
|
* elflink.c (_bfd_elf_merge_symbol): Treat old definitions from
|
||||||
|
as-needed dynamic libs as undefined.
|
||||||
|
(elf_link_add_object_symbols): Remove DYN_AS_NEEDED from as-needed
|
||||||
|
libs when finding they are needed.
|
||||||
|
|
||||||
2004-12-20 Alan Modra <amodra@bigpond.net.au>
|
2004-12-20 Alan Modra <amodra@bigpond.net.au>
|
||||||
|
|
||||||
* elf64-ppc.c (struct ppc64_elf_obj_tdata): Add opd_relocs.
|
* elf64-ppc.c (struct ppc64_elf_obj_tdata): Add opd_relocs.
|
||||||
|
|
|
@ -719,7 +719,7 @@ _bfd_elf_merge_symbol (bfd *abfd,
|
||||||
int bind;
|
int bind;
|
||||||
bfd *oldbfd;
|
bfd *oldbfd;
|
||||||
bfd_boolean newdyn, olddyn, olddef, newdef, newdyncommon, olddyncommon;
|
bfd_boolean newdyn, olddyn, olddef, newdef, newdyncommon, olddyncommon;
|
||||||
bfd_boolean newweak, oldweak;
|
bfd_boolean newweak, oldweak, old_asneeded;
|
||||||
|
|
||||||
*skip = FALSE;
|
*skip = FALSE;
|
||||||
*override = FALSE;
|
*override = FALSE;
|
||||||
|
@ -849,6 +849,14 @@ _bfd_elf_merge_symbol (bfd *abfd,
|
||||||
else
|
else
|
||||||
olddef = TRUE;
|
olddef = TRUE;
|
||||||
|
|
||||||
|
/* If the old definition came from an as-needed dynamic library which
|
||||||
|
wasn't found to be needed, treat the sym as undefined. */
|
||||||
|
old_asneeded = FALSE;
|
||||||
|
if (newdyn
|
||||||
|
&& olddyn
|
||||||
|
&& (elf_dyn_lib_class (oldbfd) & DYN_AS_NEEDED) != 0)
|
||||||
|
old_asneeded = TRUE;
|
||||||
|
|
||||||
/* Check TLS symbol. */
|
/* Check TLS symbol. */
|
||||||
if ((ELF_ST_TYPE (sym->st_info) == STT_TLS || h->type == STT_TLS)
|
if ((ELF_ST_TYPE (sym->st_info) == STT_TLS || h->type == STT_TLS)
|
||||||
&& ELF_ST_TYPE (sym->st_info) != h->type)
|
&& ELF_ST_TYPE (sym->st_info) != h->type)
|
||||||
|
@ -1051,6 +1059,7 @@ _bfd_elf_merge_symbol (bfd *abfd,
|
||||||
|
|
||||||
if (olddyn
|
if (olddyn
|
||||||
&& olddef
|
&& olddef
|
||||||
|
&& !old_asneeded
|
||||||
&& h->root.type == bfd_link_hash_defined
|
&& h->root.type == bfd_link_hash_defined
|
||||||
&& h->def_dynamic
|
&& h->def_dynamic
|
||||||
&& (h->root.u.def.section->flags & SEC_ALLOC) != 0
|
&& (h->root.u.def.section->flags & SEC_ALLOC) != 0
|
||||||
|
@ -1102,7 +1111,7 @@ _bfd_elf_merge_symbol (bfd *abfd,
|
||||||
|
|
||||||
if (newdyn
|
if (newdyn
|
||||||
&& newdef
|
&& newdef
|
||||||
&& (olddef
|
&& ((olddef && !old_asneeded)
|
||||||
|| (h->root.type == bfd_link_hash_common
|
|| (h->root.type == bfd_link_hash_common
|
||||||
&& (newweak
|
&& (newweak
|
||||||
|| ELF_ST_TYPE (sym->st_info) == STT_FUNC))))
|
|| ELF_ST_TYPE (sym->st_info) == STT_FUNC))))
|
||||||
|
@ -1152,7 +1161,7 @@ _bfd_elf_merge_symbol (bfd *abfd,
|
||||||
symbol is a function or is weak. */
|
symbol is a function or is weak. */
|
||||||
|
|
||||||
flip = NULL;
|
flip = NULL;
|
||||||
if (! newdyn
|
if ((!newdyn || old_asneeded)
|
||||||
&& (newdef
|
&& (newdef
|
||||||
|| (bfd_is_com_section (sec)
|
|| (bfd_is_com_section (sec)
|
||||||
&& (oldweak
|
&& (oldweak
|
||||||
|
@ -3937,6 +3946,8 @@ elf_link_add_object_symbols (bfd *abfd, struct bfd_link_info *info)
|
||||||
goto error_free_vers;
|
goto error_free_vers;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
elf_dyn_lib_class (abfd) &= ~DYN_AS_NEEDED;
|
||||||
|
|
||||||
add_needed = TRUE;
|
add_needed = TRUE;
|
||||||
ret = elf_add_dt_needed_tag (info, soname, add_needed);
|
ret = elf_add_dt_needed_tag (info, soname, add_needed);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue