diff options
-rw-r--r-- | bfd/ChangeLog | 7 | ||||
-rw-r--r-- | bfd/cofflink.c | 10 | ||||
-rw-r--r-- | bfd/linker.c | 16 |
3 files changed, 30 insertions, 3 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 71208e5..35a2fad 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,10 @@ +2001-08-02 Paul Sokolovsky <paul.sokolovsky@technologist.com> + + * cofflink.c (coff_link_check_ar_symbols): also search for + __imp__symbol as well as _symbol. + * linker.c (_bfd_generic_link_add_archive_symbols): also + search for __imp__symbol as well as _symbol. + 2001-08-01 Adam Nemet <anemet@lnxw.com> * elf.c (elf_sort_sections): Return zero only as the last step. diff --git a/bfd/cofflink.c b/bfd/cofflink.c index 47716ac..e6dcd88 100644 --- a/bfd/cofflink.c +++ b/bfd/cofflink.c @@ -277,6 +277,16 @@ coff_link_check_ar_symbols (abfd, info, pneeded) return false; h = bfd_link_hash_lookup (info->hash, name, false, false, true); + /* auto import */ + if (!h && info->pei386_auto_import) + { + if (!strncmp (name,"__imp_", 6)) + { + h = + bfd_link_hash_lookup (info->hash, name + 6, false, false, + true); + } + } /* We are only interested in symbols that are currently undefined. If a symbol is currently known to be common, COFF linkers do not bring in an object file which defines diff --git a/bfd/linker.c b/bfd/linker.c index 5478186..1144e92 100644 --- a/bfd/linker.c +++ b/bfd/linker.c @@ -1003,10 +1003,20 @@ _bfd_generic_link_add_archive_symbols (abfd, info, checkfn) arh = archive_hash_lookup (&arsym_hash, h->root.string, false, false); if (arh == (struct archive_hash_entry *) NULL) { - pundef = &(*pundef)->next; - continue; + /* If we haven't found the exact symbol we're looking for, + let's look for its import thunk */ + if (info->pei386_auto_import) + { + char *buf = alloca (strlen (h->root.string) + 10); + sprintf (buf, "__imp_%s", h->root.string); + arh = archive_hash_lookup (&arsym_hash, buf, false, false); + } + if (arh == (struct archive_hash_entry *) NULL) + { + pundef = &(*pundef)->next; + continue; + } } - /* Look at all the objects which define this symbol. */ for (l = arh->defs; l != (struct archive_list *) NULL; l = l->next) { |