* src/ld/emultempl/pe.em (gld_*_open_dynamic_archive): New search
authorDJ Delorie <dj@redhat.com>
Mon, 17 Jul 2000 18:59:58 +0000 (18:59 +0000)
committerDJ Delorie <dj@redhat.com>
Mon, 17 Jul 2000 18:59:58 +0000 (18:59 +0000)
order for dynamic library '-lfoo' on pei386: libfoo.dll.a,
foo.dll.a, libfoo.a, libfoo.dll, foo.dll. This fixes compatibility
errors introduced by the old dynamic lib search order.

ld/ChangeLog
ld/emultempl/pe.em

index 24529c3aae3aae9fefcb2fe126cf38d8f13d8e0f..d25865bd2c60420b2a94f88bacc5f8a3e3f4eea7 100644 (file)
@@ -1,3 +1,10 @@
+2000-07-16  Charles Wilson  <cwilson@ece.gatech.edu>
+
+       * src/ld/emultempl/pe.em (gld_*_open_dynamic_archive): New search
+       order for dynamic library '-lfoo' on pei386: libfoo.dll.a,
+       foo.dll.a, libfoo.a, libfoo.dll, foo.dll. This fixes compatibility
+       errors introduced by the old dynamic lib search order.
+
 2000-07-17  DJ Delorie  <dj@cygnus.com>
 
        * pe-dll.c (process_def_file): auto-export data items also
index 582d541895d3153199f38ac9668220b42dcd5a94..0ffeffc061b4992cd6a2679e55e4194d1afc465c 100644 (file)
@@ -1387,16 +1387,33 @@ gld_${EMULATION_NAME}_open_dynamic_archive (arch, search, entry)
       sprintf (string, "%s/%s.dll.a", search->name, filename);
       if (! ldfile_try_open_bfd (string, entry))
         {
-          /* Try "libfoo.dll" (preferred dll name) */
-          sprintf (string, "%s/lib%s.dll", search->name, filename);
+/*
+   Try libfoo.a next. Normally, this would be interpreted as a static
+   library, but it *could* be an import library. For backwards compatibility,
+   libfoo.a needs to ==precede== libfoo.dll and foo.dll in the search,
+   or sometimes errors occur when building legacy packages.
+
+   Putting libfoo.a here means that in a failure case (i.e. the library
+   -lfoo is not found) we will search for libfoo.a twice before
+   giving up -- once here, and once when searching for a "static" lib.
+   for a "static" lib.
+*/
+          /* Try "libfoo.a" (import lib, or static lib, but must
+             take precedence over dll's) */
+          sprintf (string, "%s/lib%s.a", search->name, filename);
           if (! ldfile_try_open_bfd (string, entry))
-            {
-              /* Finally, try "foo.dll" (alternate dll name) */
-              sprintf (string, "%s/%s.dll", search->name, filename);
+           {
+              /* Try "libfoo.dll" (preferred dll name) */
+              sprintf (string, "%s/lib%s.dll", search->name, filename);
               if (! ldfile_try_open_bfd (string, entry))
                 {
-                  free (string);
-                  return false;
+                  /* Finally, try "foo.dll" (alternate dll name) */
+                  sprintf (string, "%s/%s.dll", search->name, filename);
+                  if (! ldfile_try_open_bfd (string, entry))
+                    {
+                      free (string);
+                      return false;
+                    }
                 }
             }
         }