Don't search for data import when auto-import is disabled.
authorNick Clifton <nickc@redhat.com>
Tue, 17 Dec 2002 12:16:38 +0000 (12:16 +0000)
committerNick Clifton <nickc@redhat.com>
Tue, 17 Dec 2002 12:16:38 +0000 (12:16 +0000)
ld/ChangeLog
ld/emultempl/pe.em

index 2a84e62..ca5ae1d 100644 (file)
@@ -1,3 +1,8 @@
+2002-12-17  Ralf Habacker  <ralf.habacker@freenet.de>
+
+       * ld/emultempl/pe.em (pe_find_data_imports): Don't search for data
+       import when auto-import is disabled.
+
 2002-12-17  Danny Smith  <dannysmith@users.sourceforge.net>
 
        * emultempl/pe.em (..._recognized_file): Use LD_PATHMAX+1 to
index 27a059d..87a5bc2 100644 (file)
@@ -132,7 +132,7 @@ static int make_import_fixup PARAMS ((arelent *, asection *));
 static void pe_find_data_imports PARAMS ((void));
 #endif
 
-static bfd_boolean pr_sym PARAMS ((struct bfd_hash_entry *, PTR string));
+static bfd_boolean pr_sym PARAMS ((struct bfd_hash_entry *, PTR));
 static bfd_boolean gld_${EMULATION_NAME}_unrecognized_file
   PARAMS ((lang_input_statement_type *));
 static bfd_boolean gld_${EMULATION_NAME}_recognized_file
@@ -148,7 +148,7 @@ static char * thumb_entry_symbol = NULL;
 static lang_assignment_statement_type *image_base_statement = 0;
 
 #ifdef DLL_SUPPORT
-static int pe_enable_stdcall_fixup = -1; /* 0=disable 1=enable */
+static int pe_enable_stdcall_fixup = -1; /* 0=disable 1=enable */
 static char *pe_out_def_filename = NULL;
 static char *pe_implib_filename = NULL;
 static int pe_enable_auto_image_base = 0;
@@ -188,7 +188,7 @@ gld_${EMULATION_NAME}_before_parse()
 \f
 /* PE format extra command line options.  */
 
-/* Used for setting flags in the PE header. */
+/* Used for setting flags in the PE header.  */
 #define OPTION_BASE_FILE               (300  + 1)
 #define OPTION_DLL                     (OPTION_BASE_FILE + 1)
 #define OPTION_FILE_ALIGNMENT          (OPTION_DLL + 1)
@@ -279,7 +279,7 @@ static struct option longopts[] = {
 
 
 /* PE/WIN32; added routines to get the subsystem type, heap and/or stack
-   parameters which may be input from the command line */
+   parameters which may be input from the command line */
 
 typedef struct
 {
@@ -320,6 +320,7 @@ static definfo init[] =
   { NULL, 0, 0, NULL, 0 }
 };
 
+
 static void
 gld_${EMULATION_NAME}_list_options (file)
      FILE * file;
@@ -371,13 +372,15 @@ gld_${EMULATION_NAME}_list_options (file)
 #endif
 }
 
+
 static void
 set_pe_name (name, val)
      char *name;
      long val;
 {
   int i;
-  /* Find the name and set it. */
+
+  /* Find the name and set it.  */
   for (i = 0; init[i].ptr; i++)
     {
       if (strcmp (name, init[i].symbol) == 0)
@@ -475,7 +478,6 @@ set_pe_subsystem ()
 }
 
 
-
 static void
 set_pe_value (name)
      char *name;
@@ -491,6 +493,7 @@ set_pe_value (name)
   optarg = end;
 }
 
+
 static void
 set_pe_stack_heap (resname, comname)
      char *resname;
@@ -508,7 +511,6 @@ set_pe_stack_heap (resname, comname)
 }
 
 
-
 static int
 gld_${EMULATION_NAME}_parse_args (argc, argv)
      int argc;
@@ -549,7 +551,7 @@ gld_${EMULATION_NAME}_parse_args (argc, argv)
        }
       break;
 
-      /* PE options */
+      /* PE options */
     case OPTION_HEAP:
       set_pe_stack_heap ("__size_of_heap_reserve__", "__size_of_heap_commit__");
       break;
@@ -686,7 +688,8 @@ strhash (const char *str)
   return hash;
 }
 
-/* Use the output file to create a image base for relocatable DLLs. */
+/* Use the output file to create a image base for relocatable DLLs.  */
+
 static unsigned long
 compute_dll_image_base (const char *ofile)
 {
@@ -702,7 +705,7 @@ static void
 gld_${EMULATION_NAME}_set_symbols ()
 {
   /* Run through and invent symbols for all the
-     names and insert the defaults. */
+     names and insert the defaults.  */
   int j;
   lang_statement_list_type *save;
 
@@ -725,7 +728,7 @@ gld_${EMULATION_NAME}_set_symbols ()
   if (link_info.relocateable)
     return;
 
-  /* Glue the assignments into the abs section */
+  /* Glue the assignments into the abs section */
   save = stat_ptr;
 
   stat_ptr = &(abs_output_section->children);
@@ -749,7 +752,7 @@ gld_${EMULATION_NAME}_set_symbols ()
       if (j == IMAGEBASEOFF)
        image_base_statement = rv;
     }
-  /* Restore the pointer. */
+  /* Restore the pointer.  */
   stat_ptr = save;
 
   if (pe.FileAlignment >
@@ -798,7 +801,8 @@ pe_undef_cdecl_match (h, string)
   PTR string;
 {
   int sl;
-  sl = strlen (string); /* silence compiler warning */
+
+  sl = strlen (string); /* Silence compiler warning.  */
   if (h->type == bfd_link_hash_defined
       && strncmp (h->root.string, string, sl) == 0
       && h->root.string[sl] == '@')
@@ -839,6 +843,7 @@ pe_fixup_stdcalls ()
                undef->type = bfd_link_hash_defined;
                undef->u.def.value = sym->u.def.value;
                undef->u.def.section = sym->u.def.section;
+
                if (pe_enable_stdcall_fixup == -1)
                  {
                    einfo (_("Warning: resolving %s by linking to %s\n"),
@@ -855,7 +860,7 @@ pe_fixup_stdcalls ()
        else
          {
            /* The symbol is a cdecl symbol, so we look for stdcall
-              symbols - which means scanning the whole symbol table */
+              symbols - which means scanning the whole symbol table */
            pe_undef_found_sym = 0;
            bfd_link_hash_traverse (link_info.hash, pe_undef_cdecl_match,
                                    (PTR) undef->root.string);
@@ -865,6 +870,7 @@ pe_fixup_stdcalls ()
                undef->type = bfd_link_hash_defined;
                undef->u.def.value = sym->u.def.value;
                undef->u.def.section = sym->u.def.section;
+
                if (pe_enable_stdcall_fixup == -1)
                  {
                    einfo (_("Warning: resolving %s by linking to %s\n"),
@@ -907,11 +913,14 @@ pe_find_data_imports ()
 {
   struct bfd_link_hash_entry *undef, *sym;
 
+  if (link_info.pei386_auto_import == 0)
+    return;
+
   for (undef = link_info.hash->undefs; undef; undef=undef->next)
     {
       if (undef->type == bfd_link_hash_undefined)
         {
-          /* C++ symbols are *long* */
+          /* C++ symbols are *long* */
           char buf[4096];
 
          if (pe_dll_extra_pe_debug)
@@ -923,45 +932,43 @@ pe_find_data_imports ()
 
           if (sym && sym->type == bfd_link_hash_defined)
             {
-             if (link_info.pei386_auto_import == -1)
-               info_msg (_("Info: resolving %s by linking to %s (auto-import)\n"),
-                        undef->root.string, buf);
-
-            {
-              bfd *b = sym->u.def.section->owner;
-              asymbol **symbols;
-              int nsyms, symsize, i;
-
-              symsize = bfd_get_symtab_upper_bound (b);
-              symbols = (asymbol **) xmalloc (symsize);
-              nsyms = bfd_canonicalize_symtab (b, symbols);
-
-              for (i = 0; i < nsyms; i++)
-                {
-                  if (memcmp (symbols[i]->name, "__head_",
-                              sizeof ("__head_") - 1))
-                    continue;
-
-                  if (pe_dll_extra_pe_debug)
-                    printf ("->%s\n", symbols[i]->name);
-
-                  pe_data_import_dll = (char*) (symbols[i]->name +
-                                                sizeof ("__head_") - 1);
-                  break;
-                }
-            }
-
-            pe_walk_relocs_of_symbol (&link_info, undef->root.string,
-                                      make_import_fixup);
-
-            /* Let's differentiate it somehow from defined.  */
-            undef->type = bfd_link_hash_defweak;
-            /* We replace original name with __imp_ prefixed, this
-               1) may trash memory 2) leads to duplicate symbol generation.
-               Still, IMHO it's better than having name poluted.  */
-            undef->root.string = sym->root.string;
-            undef->u.def.value = sym->u.def.value;
-            undef->u.def.section = sym->u.def.section;
+             bfd *b = sym->u.def.section->owner;
+             asymbol **symbols;
+             int nsyms, symsize, i;
+
+             if (link_info.pei386_auto_import == -1)
+               info_msg (_("Info: resolving %s by linking to %s (auto-import)\n"),
+                         undef->root.string, buf);
+
+             symsize = bfd_get_symtab_upper_bound (b);
+             symbols = (asymbol **) xmalloc (symsize);
+             nsyms = bfd_canonicalize_symtab (b, symbols);
+
+             for (i = 0; i < nsyms; i++)
+               {
+                 if (memcmp (symbols[i]->name, "__head_",
+                             sizeof ("__head_") - 1))
+                   continue;
+
+                 if (pe_dll_extra_pe_debug)
+                   printf ("->%s\n", symbols[i]->name);
+
+                 pe_data_import_dll = (char*) (symbols[i]->name +
+                                               sizeof ("__head_") - 1);
+                 break;
+               }
+
+             pe_walk_relocs_of_symbol (&link_info, undef->root.string,
+                                       make_import_fixup);
+
+             /* Let's differentiate it somehow from defined.  */
+             undef->type = bfd_link_hash_defweak;
+             /* We replace original name with __imp_ prefixed, this
+                1) may trash memory 2) leads to duplicate symbol generation.
+                Still, IMHO it's better than having name poluted.  */
+             undef->root.string = sym->root.string;
+             undef->u.def.value = sym->u.def.value;
+             undef->u.def.section = sym->u.def.section;
             }
         }
     }
@@ -1056,7 +1063,7 @@ gld_${EMULATION_NAME}_after_open ()
        head/tail objects, causing an improper import table.  We detect
        those cases and rename the "other" import libraries to match
        the one the head/tail come from, so that the linker will sort
-       things nicely and produce a valid import table. */
+       things nicely and produce a valid import table.  */
 
     LANG_FOR_EACH_INPUT_STATEMENT (is)
       {
@@ -1345,7 +1352,7 @@ gld_${EMULATION_NAME}_unrecognized_file (entry)
            }
 
 #if 0
-         /* Not sure if these *should* be set */
+         /* Not sure if these *should* be set */
          if (pe_def_file->version_major != -1)
            {
              pe.MajorImageVersion = pe_def_file->version_major;
@@ -1854,22 +1861,22 @@ gld_${EMULATION_NAME}_open_dynamic_archive (arch, search, entry)
             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) */
+             take precedence over dll's) */
           sprintf (string, "%s/lib%s.a", search->name, filename);
           if (! ldfile_try_open_bfd (string, entry))
             {
 #ifdef DLL_SUPPORT
               if (pe_dll_search_prefix)
                 {
-                  /* Try "<prefix>foo.dll" (preferred dll name, if specified) */
+                  /* Try "<prefix>foo.dll" (preferred dll name, if specified) */
                   sprintf (string, "%s/%s%s.dll", search->name, pe_dll_search_prefix, filename);
                   if (! ldfile_try_open_bfd (string, entry))
                     {
-                      /* Try "libfoo.dll" (default preferred dll name) */
+                      /* Try "libfoo.dll" (default preferred dll name) */
                       sprintf (string, "%s/lib%s.dll", search->name, filename);
                       if (! ldfile_try_open_bfd (string, entry))
                         {
-                          /* Finally, try "foo.dll" (alternate dll name) */
+                          /* Finally, try "foo.dll" (alternate dll name) */
                           sprintf (string, "%s/%s.dll", search->name, filename);
                           if (! ldfile_try_open_bfd (string, entry))
                             {
@@ -1955,8 +1962,8 @@ struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation =
   gld_${EMULATION_NAME}_get_script,
   "${EMULATION_NAME}",
   "${OUTPUT_FORMAT}",
-  gld_${EMULATION_NAME}_finish, /* finish */
-  NULL, /* create output section statements */
+  gld_${EMULATION_NAME}_finish,
+  NULL, /* Create output section statements.  */
   gld_${EMULATION_NAME}_open_dynamic_archive,
   gld_${EMULATION_NAME}_place_orphan,
   gld_${EMULATION_NAME}_set_symbols,
@@ -1965,6 +1972,6 @@ struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation =
   gld_${EMULATION_NAME}_list_options,
   gld_${EMULATION_NAME}_recognized_file,
   gld_${EMULATION_NAME}_find_potential_libraries,
-  NULL /* new_vers_pattern */
+  NULL /* new_vers_pattern */
 };
 EOF