diff options
author | Alan Modra <amodra@gmail.com> | 2005-01-25 01:40:04 +0000 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2005-01-25 01:40:04 +0000 |
commit | 7e9f086769d3ad7ed3ee0562888fbb72747a02b1 (patch) | |
tree | 950000f8f077c7092c4ef3c2329f2a5f3591df9d /ld | |
parent | 80524dabacf47f34dd5a6e6c5f4efe88c8c04614 (diff) | |
download | gdb-7e9f086769d3ad7ed3ee0562888fbb72747a02b1.zip gdb-7e9f086769d3ad7ed3ee0562888fbb72747a02b1.tar.gz gdb-7e9f086769d3ad7ed3ee0562888fbb72747a02b1.tar.bz2 |
bfd/
* elflink.c (elf_link_add_object_symbols): Don't create link dynamic
sections immediately when linking shared libs. Instead, wait until
we know a lib is needed.
(_bfd_elf_link_create_dynstrtab): Extract from..
(_bfd_elf_link_create_dynamic_sections_): ..here.
(elf_add_dt_needed_tag): Call _bfd_elf_link_create_dynstrtab and
_bfd_elf_link_create_dynamic_sections. Add abfd param. Allow
for non-existent .dynamic.
(elf_link_output_extsym): Don't complain about undefined symbols
in as-needed dynamic libs that aren't actually linked.
ld/
* emultempl/elf32.em (gld${EMULATION_NAME}_try_needed): Formatting.
(gld${EMULATION_NAME}_after_open): Ignore needed libs if they were
only needed by an as-needed lib that didn't get linked.
Diffstat (limited to 'ld')
-rw-r--r-- | ld/ChangeLog | 6 | ||||
-rw-r--r-- | ld/emultempl/elf32.em | 17 |
2 files changed, 18 insertions, 5 deletions
diff --git a/ld/ChangeLog b/ld/ChangeLog index 31c44b5..a178b24 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,9 @@ +2005-01-25 Alan Modra <amodra@bigpond.net.au> + + * emultempl/elf32.em (gld${EMULATION_NAME}_try_needed): Formatting. + (gld${EMULATION_NAME}_after_open): Ignore needed libs if they were + only needed by an as-needed lib that didn't get linked. + 2005-01-23 Alan Modra <amodra@bigpond.net.au> * ld.texinfo (Output Section Keywords <CONSTRUCTORS>): Correct diff --git a/ld/emultempl/elf32.em b/ld/emultempl/elf32.em index c6bc7c2..fd35938 100644 --- a/ld/emultempl/elf32.em +++ b/ld/emultempl/elf32.em @@ -13,7 +13,7 @@ cat >e${EMULATION_NAME}.c <<EOF /* ${ELFSIZE} bit ELF emulation code for ${EMULATION_NAME} Copyright 1991, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, - 2002, 2003, 2004 Free Software Foundation, Inc. + 2002, 2003, 2004, 2005 Free Software Foundation, Inc. Written by Steve Chamberlain <sac@cygnus.com> ELF support by Ian Lance Taylor <ian@cygnus.com> @@ -398,9 +398,8 @@ cat >>e${EMULATION_NAME}.c <<EOF /* Tell the ELF linker that we don't want the output file to have a DT_NEEDED entry for this file at all if the entry is from a file with DYN_NO_ADD_NEEDED. */ - if (needed->by - && (bfd_elf_get_dyn_lib_class (needed->by) - & DYN_NO_ADD_NEEDED) != 0) + if (needed->by != NULL + && (bfd_elf_get_dyn_lib_class (needed->by) & DYN_NO_ADD_NEEDED) != 0) class |= DYN_NO_NEEDED | DYN_NO_ADD_NEEDED; bfd_elf_set_dyn_lib_class (abfd, class); @@ -785,9 +784,17 @@ gld${EMULATION_NAME}_after_open (void) struct dt_needed n, nn; int force; + /* If the lib that needs this one was --as-needed and wasn't + found to be needed, then this lib isn't needed either. */ + if (l->by != NULL + && (bfd_elf_get_dyn_lib_class (l->by) & DYN_AS_NEEDED) != 0) + continue; + /* If we've already seen this file, skip it. */ for (ll = needed; ll != l; ll = ll->next) - if (strcmp (ll->name, l->name) == 0) + if ((ll->by == NULL + || (bfd_elf_get_dyn_lib_class (ll->by) & DYN_AS_NEEDED) == 0) + && strcmp (ll->name, l->name) == 0) break; if (ll != l) continue; |