diff --git a/bfd/ChangeLog b/bfd/ChangeLog index d47fbe25b01..ba070189e00 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,9 @@ +2009-01-31 Alan Modra + + * elflink.c (on_needed_list): New function. + (elf_link_add_object_symbols): Link in --as-needed libs if they + satisfy undefined symbols in other libs. + 2009-01-30 Julian Brown * elf32-arm.c (bfd_elf32_arm_vfp11_erratum_scan): Skip BFDs with diff --git a/bfd/elflink.c b/bfd/elflink.c index 927f1c481a4..8685a2fe182 100644 --- a/bfd/elflink.c +++ b/bfd/elflink.c @@ -3199,6 +3199,16 @@ elf_add_dt_needed_tag (bfd *abfd, return 0; } +static bfd_boolean +on_needed_list (const char *soname, struct bfd_link_needed_list *needed) +{ + for (; needed != NULL; needed = needed->next) + if (strcmp (soname, needed->name) == 0) + return TRUE; + + return FALSE; +} + /* Sort symbol by value and section. */ static int elf_sort_symbol (const void *arg1, const void *arg2) @@ -4434,8 +4444,11 @@ elf_link_add_object_symbols (bfd *abfd, struct bfd_link_info *info) if (!add_needed && definition - && dynsym - && h->ref_regular) + && ((dynsym + && h->ref_regular) + || (h->ref_dynamic + && (elf_dyn_lib_class (abfd) & DYN_AS_NEEDED) != 0 + && !on_needed_list (elf_dt_name (abfd), htab->needed)))) { int ret; const char *soname = elf_dt_name (abfd); diff --git a/binutils/ChangeLog b/binutils/ChangeLog index b61784efd47..c18aa008fa6 100644 --- a/binutils/ChangeLog +++ b/binutils/ChangeLog @@ -1,3 +1,7 @@ +2009-01-31 Alan Modra + + * NEWS: Mention --as-needed change. + 2009-01-29 Alan Modra PR 9798 diff --git a/binutils/NEWS b/binutils/NEWS index 4cc89e1dff7..60ea0cd7a1f 100644 --- a/binutils/NEWS +++ b/binutils/NEWS @@ -1,5 +1,10 @@ -*- text -*- +* --as-needed now links in a dynamic library if it satisfies undefined + symbols in regular objects, or in other dynamic libraries. In the + latter case the library is not linked if it is found in a DT_NEEDED + entry of one of the libraries already linked. + * Add new option --use-nul-prefixed-import-tables to dlltool to allow fall- back to old import table generation with null element prefix. diff --git a/ld/ChangeLog b/ld/ChangeLog index 6333383cd3d..13c05c6cf07 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,7 @@ +2009-01-31 Alan Modra + + * ld.texinfo (--as-needed): Update. + 2009-01-29 Andrew Jenner * emultempl/armelf.em: Correct formatting of help text for diff --git a/ld/ld.texinfo b/ld/ld.texinfo index 1d909897c93..ae8e2b7df5e 100644 --- a/ld/ld.texinfo +++ b/ld/ld.texinfo @@ -1093,9 +1093,11 @@ This option affects ELF DT_NEEDED tags for dynamic libraries mentioned on the command line after the @option{--as-needed} option. Normally, the linker will add a DT_NEEDED tag for each dynamic library mentioned on the command line, regardless of whether the library is actually -needed. @option{--as-needed} causes DT_NEEDED tags to only be emitted -for libraries that satisfy some symbol reference from regular objects -which is undefined at the point that the library was linked. +needed. @option{--as-needed} causes a DT_NEEDED tag to only be emitted +for a library that satisfies a symbol reference from regular objects +which is undefined at the point that the library was linked, or, if +the library is not found in the DT_NEEDED lists of other libraries +linked up to that point, a reference from another dynamic library. @option{--no-as-needed} restores the default behaviour. @kindex --add-needed