binutils/
[deliverable/binutils-gdb.git] / binutils / dlltool.c
index b9d717fb210259a21aa51bca789b996aa6915723..80aac996fca06cfa54dd09e76ab99c11b2493754 100644 (file)
@@ -399,6 +399,7 @@ typedef struct identify_data_t
 static char *head_label;
 static char *imp_name_lab;
 static char *dll_name;
+static int dll_name_set_by_exp_name;
 static int add_indirect = 0;
 static int add_underscore = 0;
 static int add_stdcall_underscore = 0;
@@ -879,9 +880,9 @@ inform VPARAMS ((const char * message, ...))
 }
 
 static const char *
-rvaafter (int machine)
+rvaafter (int mach)
 {
-  switch (machine)
+  switch (mach)
     {
     case MARM:
     case M386:
@@ -898,16 +899,16 @@ rvaafter (int machine)
       break;
     default:
       /* xgettext:c-format */
-      fatal (_("Internal error: Unknown machine type: %d"), machine);
+      fatal (_("Internal error: Unknown machine type: %d"), mach);
       break;
     }
   return "";
 }
 
 static const char *
-rvabefore (int machine)
+rvabefore (int mach)
 {
-  switch (machine)
+  switch (mach)
     {
     case MARM:
     case M386:
@@ -924,16 +925,16 @@ rvabefore (int machine)
       return ".rva\t";
     default:
       /* xgettext:c-format */
-      fatal (_("Internal error: Unknown machine type: %d"), machine);
+      fatal (_("Internal error: Unknown machine type: %d"), mach);
       break;
     }
   return "";
 }
 
 static const char *
-asm_prefix (int machine, const char *name)
+asm_prefix (int mach, const char *name)
 {
-  switch (machine)
+  switch (mach)
     {
     case MARM:
     case MPPC:
@@ -955,7 +956,7 @@ asm_prefix (int machine, const char *name)
         return "_";
     default:
       /* xgettext:c-format */
-      fatal (_("Internal error: Unknown machine type: %d"), machine);
+      fatal (_("Internal error: Unknown machine type: %d"), mach);
       break;
     }
   return "";
@@ -1089,6 +1090,11 @@ def_name (const char *name, int base)
   if (d_is_dll)
     non_fatal (_("Can't have LIBRARY and NAME"));
 
+  if (dll_name_set_by_exp_name && name && *name != 0)
+    {
+      dll_name = NULL;
+      dll_name_set_by_exp_name = 0;
+    }
   /* If --dllname not provided, use the one in the DEF file.
      FIXME: Is this appropriate for executables?  */
   if (!dll_name)
@@ -1105,6 +1111,12 @@ def_library (const char *name, int base)
   if (d_is_exe)
     non_fatal (_("Can't have LIBRARY and NAME"));
 
+  if (dll_name_set_by_exp_name && name && *name != 0)
+    {
+      dll_name = NULL;
+      dll_name_set_by_exp_name = 0;
+    }
+
   /* If --dllname not provided, use the one in the DEF file.  */
   if (!dll_name)
     set_dll_name_from_def (name, 1);
@@ -1155,7 +1167,7 @@ def_stacksize (int reserve, int commit)
    import_list.  It is used by def_import.  */
 
 static void
-append_import (const char *symbol_name, const char *dll_name, int func_ordinal,
+append_import (const char *symbol_name, const char *dllname, int func_ordinal,
               const char *its_name)
 {
   iheadtype **pq;
@@ -1163,7 +1175,7 @@ append_import (const char *symbol_name, const char *dll_name, int func_ordinal,
 
   for (pq = &import_list; *pq != NULL; pq = &(*pq)->next)
     {
-      if (strcmp ((*pq)->dllname, dll_name) == 0)
+      if (strcmp ((*pq)->dllname, dllname) == 0)
        {
          q = *pq;
          q->functail->next = xmalloc (sizeof (ifunctype));
@@ -1178,7 +1190,7 @@ append_import (const char *symbol_name, const char *dll_name, int func_ordinal,
     }
 
   q = xmalloc (sizeof (iheadtype));
-  q->dllname = xstrdup (dll_name);
+  q->dllname = xstrdup (dllname);
   q->nfuncs = 1;
   q->funchead = xmalloc (sizeof (ifunctype));
   q->functail = q->funchead;
@@ -1399,12 +1411,26 @@ scan_drectve_symbols (bfd *abfd)
          flagword flags = BSF_FUNCTION;
 
          p += 8;
-         name = p;
-         while (p < e && *p != ',' && *p != ' ' && *p != '-')
-           p++;
+         /* Do we have a quoted export?  */
+         if (*p == '"')
+           {
+             p++;
+             name = p;
+             while (p < e && *p != '"')
+               ++p;
+           }
+         else
+           {
+             name = p;
+             while (p < e && *p != ',' && *p != ' ' && *p != '-')
+               p++;
+           }
          c = xmalloc (p - name + 1);
          memcpy (c, name, p - name);
          c[p - name] = 0;
+         /* Advance over trailing quote.  */
+         if (p < e && *p == '"')
+           ++p;
          if (p < e && *p == ',')       /* found type tag.  */
            {
              char *tag_start = ++p;
@@ -4143,6 +4169,16 @@ main (int ac, char **av)
   /* Check if we generated PE+.  */
   create_for_pep = strcmp (mname, "i386:x86-64") == 0;
 
+  {
+    /* Check the default underscore */
+    int u = leading_underscore; /* Underscoring mode. -1 for use default.  */
+    if (u == -1)
+      bfd_get_target_info (mtable[machine].how_bfd_target, NULL,
+                           NULL, &u, NULL);
+    if (u != -1)
+      leading_underscore = (u != 0 ? TRUE : FALSE);
+  }
+
   if (!dll_name && exp_name)
     {
       /* If we are inferring dll_name from exp_name,
@@ -4153,6 +4189,7 @@ main (int ac, char **av)
       dll_name = xmalloc (len);
       strcpy (dll_name, exp_basename);
       strcat (dll_name, ".dll");
+      dll_name_set_by_exp_name = 1;
     }
 
   if (as_name == NULL)
This page took 0.025053 seconds and 4 git commands to generate.