opcodes/
[deliverable/binutils-gdb.git] / binutils / dlltool.c
index 4c9d2ecc396a2277e735288d75434eb304de16ba..3a91221c45e93268f7c4f56e373bde5eaeae22fb 100644 (file)
 
 #define show_allnames 0
 
-#define PAGE_SIZE ((bfd_vma) 4096)
-#define PAGE_MASK ((bfd_vma) (-4096))
-
 #include "sysdep.h"
 #include "bfd.h"
 #include "libiberty.h"
 #include "coff/arm.h"
 #include "coff/internal.h"
 #endif
-#ifdef DLLTOOL_MX86_64
+#ifdef DLLTOOL_DEFAULT_MX86_64
 #include "coff/x86_64.h"
 #endif
+#ifdef DLLTOOL_DEFAULT_I386
+#include "coff/i386.h"
+#endif
+
+#ifndef COFF_PAGE_SIZE
+#define COFF_PAGE_SIZE ((bfd_vma) 4096)
+#endif
 
-/* get current BFD error message */
+#ifndef PAGE_MASK
+#define PAGE_MASK ((bfd_vma) (- COFF_PAGE_SIZE))
+#endif
+
+/* Get current BFD error message.  */
 #define bfd_get_errmsg() (bfd_errmsg (bfd_get_error ()))
 
 /* Forward references.  */
@@ -394,6 +402,11 @@ static char *dll_name;
 static int add_indirect = 0;
 static int add_underscore = 0;
 static int add_stdcall_underscore = 0;
+/* This variable can hold three different values. The value
+   -1 (default) means that default underscoring should be used,
+   zero means that no underscoring should be done, and one
+   indicates that underscoring should be done.  */
+static int leading_underscore = -1;
 static int dontdeltemps = 0;
 
 /* TRUE if we should export all symbols.  Otherwise, we only export
@@ -866,9 +879,9 @@ inform VPARAMS ((const char * message, ...))
 }
 
 static const char *
-rvaafter (int machine)
+rvaafter (int mach)
 {
-  switch (machine)
+  switch (mach)
     {
     case MARM:
     case M386:
@@ -885,16 +898,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:
@@ -911,16 +924,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:
@@ -936,13 +949,13 @@ asm_prefix (int machine, const char *name)
     case M386:
     case MX86:
       /* Symbol names starting with ? do not have a leading underscore. */
-      if (name && *name == '?')
+      if ((name && *name == '?') || leading_underscore == 0)
         break;
       else
         return "_";
     default:
       /* xgettext:c-format */
-      fatal (_("Internal error: Unknown machine type: %d"), machine);
+      fatal (_("Internal error: Unknown machine type: %d"), mach);
       break;
     }
   return "";
@@ -1142,7 +1155,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;
@@ -1150,7 +1163,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));
@@ -1165,7 +1178,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;
@@ -1488,7 +1501,8 @@ add_excludes (const char *new_excludes)
       if (*exclude_string == '@')
        sprintf (new_exclude->string, "%s", exclude_string);
       else
-       sprintf (new_exclude->string, "_%s", exclude_string);
+       sprintf (new_exclude->string, "%s%s", (!leading_underscore ? "" : "_"),
+                exclude_string);
       new_exclude->next = excludes;
       excludes = new_exclude;
 
@@ -2100,10 +2114,11 @@ gen_exp_file (void)
                cygwin releases.  */
            if (create_compat_implib)
              fprintf (f, "\t%s\t__imp_%s\n", ASM_GLOBAL, exp->name);
-           fprintf (f, "\t%s\t_imp__%s\n", ASM_GLOBAL, exp->name);
+           fprintf (f, "\t%s\t_imp_%s%s\n", ASM_GLOBAL,
+                    (!leading_underscore ? "" : "_"), exp->name);
            if (create_compat_implib)
              fprintf (f, "__imp_%s:\n", exp->name);
-           fprintf (f, "_imp__%s:\n", exp->name);
+           fprintf (f, "_imp_%s%s:\n", (!leading_underscore ? "" : "_"), exp->name);
            fprintf (f, "\t%s\t%s\n", ASM_LONG, exp->name);
          }
     }
@@ -2112,7 +2127,7 @@ gen_exp_file (void)
   if (base_file)
     {
       bfd_vma addr;
-      bfd_vma need[PAGE_SIZE];
+      bfd_vma need[COFF_PAGE_SIZE];
       bfd_vma page_addr;
       bfd_size_type numbytes;
       int num_entries;
@@ -2182,10 +2197,10 @@ static const char *
 xlate (const char *name)
 {
   int lead_at = (*name == '@');
+  int is_stdcall = (!lead_at && strchr (name, '@') != NULL);
 
   if (!lead_at && (add_underscore
-                  || (add_stdcall_underscore
-                      && strchr (name, '@'))))
+                  || (add_stdcall_underscore && is_stdcall)))
     {
       char *copy = xmalloc (strlen (name) + 2);
 
@@ -3872,6 +3887,8 @@ usage (FILE *file, int status)
   fprintf (file, _("      --use-nul-prefixed-import-tables Use zero prefixed idata$4 and idata$5.\n"));
   fprintf (file, _("   -U --add-underscore       Add underscores to all symbols in interface library.\n"));
   fprintf (file, _("      --add-stdcall-underscore Add underscores to stdcall symbols in interface library.\n"));
+  fprintf (file, _("      --no-leading-underscore All symbols shouldn't be prefixed by an underscore.\n"));
+  fprintf (file, _("      --leading-underscore   All symbols should be prefixed by an underscore.\n"));
   fprintf (file, _("   -k --kill-at              Kill @<n> from exported names.\n"));
   fprintf (file, _("   -A --add-stdcall-alias    Add aliases without @<n>.\n"));
   fprintf (file, _("   -p --ext-prefix-alias <prefix> Add aliases with <prefix>.\n"));
@@ -3904,6 +3921,8 @@ usage (FILE *file, int status)
 #define OPTION_USE_NUL_PREFIXED_IMPORT_TABLES \
   (OPTION_ADD_STDCALL_UNDERSCORE + 1)
 #define OPTION_IDENTIFY_STRICT         (OPTION_USE_NUL_PREFIXED_IMPORT_TABLES + 1)
+#define OPTION_NO_LEADING_UNDERSCORE   (OPTION_IDENTIFY_STRICT + 1)
+#define OPTION_LEADING_UNDERSCORE      (OPTION_NO_LEADING_UNDERSCORE + 1)
 
 static const struct option long_options[] =
 {
@@ -3924,6 +3943,8 @@ static const struct option long_options[] =
   {"input-def", required_argument, NULL, 'd'},
   {"add-underscore", no_argument, NULL, 'U'},
   {"add-stdcall-underscore", no_argument, NULL, OPTION_ADD_STDCALL_UNDERSCORE},
+  {"no-leading-underscore", no_argument, NULL, OPTION_NO_LEADING_UNDERSCORE},
+  {"leading-underscore", no_argument, NULL, OPTION_LEADING_UNDERSCORE},
   {"kill-at", no_argument, NULL, 'k'},
   {"add-stdcall-alias", no_argument, NULL, 'A'},
   {"ext-prefix-alias", required_argument, NULL, 'p'},
@@ -3995,6 +4016,12 @@ main (int ac, char **av)
        case OPTION_ADD_STDCALL_UNDERSCORE:
          add_stdcall_underscore = 1;
          break;
+       case OPTION_NO_LEADING_UNDERSCORE:
+         leading_underscore = 0;
+         break;
+       case OPTION_LEADING_UNDERSCORE:
+         leading_underscore = 1;
+         break;
        case OPTION_IDENTIFY_STRICT:
          identify_strict = 1;
          break;
@@ -4116,6 +4143,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,
This page took 0.065337 seconds and 4 git commands to generate.