2000-08-03 H.J. Lu (hjl@gnu.org)
[binutils-gdb.git] / ld / pe-dll.c
index 6b8b1af007de0e7cf4a8032076e543fa9739b340..cbd0c495a44ee2eb93c816fdc881c06c97a64ef4 100644 (file)
@@ -34,6 +34,7 @@
 #include "ldmisc.h"
 #include "ldgram.h"
 #include "ldmain.h"
+#include "ldfile.h"
 #include "ldemul.h"
 #include "coff/internal.h"
 #include "../bfd/libcoff.h"
@@ -136,7 +137,8 @@ pe_dll_id_target (target)
 {
   int i;
   for (i=0; pe_detail_list[i].target_name; i++)
-    if (strcmp (pe_detail_list[i].target_name, target) == 0)
+    if (strcmp (pe_detail_list[i].target_name, target) == 0
+       || strcmp (pe_detail_list[i].object_target, target) == 0)
       {
        pe_details = pe_detail_list+i;
        return;
@@ -300,8 +302,7 @@ process_def_file (abfd, info)
 
          for (j = 0; j < nsyms; j++)
            {
-             if ((symbols[j]->flags & (BSF_FUNCTION | BSF_GLOBAL))
-                 == (BSF_FUNCTION | BSF_GLOBAL))
+             if (symbols[j]->flags & BSF_GLOBAL)
                {
                  const char *sn = symbols[j]->name;
                  if (*sn == '_')
@@ -1443,7 +1444,7 @@ make_one (exp, parent)
   if (! exp->flag_data)
     quick_symbol (abfd, U(""), exp->internal_name, "", tx, BSF_GLOBAL, 0);
   quick_symbol (abfd, U("_head_"), dll_symname, "", UNDSEC, BSF_GLOBAL, 0);
-  quick_symbol (abfd, U("__imp_"), exp->internal_name, "", id5, BSF_GLOBAL, 0);
+  quick_symbol (abfd, U("_imp__"), exp->internal_name, "", id5, BSF_GLOBAL, 0);
   if (pe_dll_compat_implib)
     quick_symbol (abfd, U("__imp_"), exp->internal_name, "", 
                   id5, BSF_GLOBAL, 0);
@@ -1660,10 +1661,17 @@ pe_process_import_defs (output_bfd, link_info)
            struct bfd_link_hash_entry *blhe;
 
            /* see if we need this import */
-           char *name = (char *) xmalloc (strlen (pe_def_file->imports[i].internal_name) + 2);
+           char *name = (char *) xmalloc (strlen (pe_def_file->imports[i].internal_name) + 2 + 6);
            sprintf (name, "%s%s", U(""), pe_def_file->imports[i].internal_name);
            blhe = bfd_link_hash_lookup (link_info->hash, name,
                                         false, false, false);
+           if (!blhe || (blhe && blhe->type != bfd_link_hash_undefined))
+             {
+               sprintf (name, "%s%s", U("_imp__"),
+                        pe_def_file->imports[i].internal_name);
+               blhe = bfd_link_hash_lookup (link_info->hash, name,
+                                            false, false, false);
+             }
            free (name);
            if (blhe && blhe->type == bfd_link_hash_undefined)
              {