*** empty log message ***
[deliverable/binutils-gdb.git] / binutils / dllwrap.c
index 9828a958a73cbabf69a0c7975d1d096f253dc561..50bbeb5631048e0b6512f49060d464305a305a20 100644 (file)
@@ -7,7 +7,7 @@
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
+   the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
@@ -81,6 +81,9 @@ static char *dlltool_name = NULL;
 
 static char *target = TARGET;
 
+/* -1: use default, 0: no underscoring, 1: underscore.  */
+static int is_leading_underscore = -1;
+
 typedef enum {
   UNKNOWN_TARGET,
   CYGWIN_TARGET,
@@ -88,7 +91,16 @@ typedef enum {
 }
 target_type;
 
+typedef enum {
+  UNKNOWN_CPU,
+  X86_CPU,
+  X64_CPU,
+  ARM_CPU
+}
+target_cpu;
+
 static target_type which_target = UNKNOWN_TARGET;
+static target_cpu which_cpu = UNKNOWN_CPU;
 
 static int dontdeltemps = 0;
 static int dry_run = 0;
@@ -504,6 +516,8 @@ usage (FILE *file, int status)
   fprintf (file, _("   --add-stdcall-alias    Add aliases without @<n>\n"));
   fprintf (file, _("   --as <name>            Use <name> for assembler\n"));
   fprintf (file, _("   --nodelete             Keep temp files.\n"));
+  fprintf (file, _("   --no-leading-underscore  Entrypoint without underscore\n"));
+  fprintf (file, _("   --leading-underscore     Entrypoint with underscore.\n"));
   fprintf (file, _("  Rest are passed unmodified to the language driver\n"));
   fprintf (file, "\n\n");
   if (REPORT_BUGS_TO[0] && status == 0)
@@ -527,9 +541,11 @@ usage (FILE *file, int status)
 #define OPTION_IMAGE_BASE      (OPTION_ENTRY + 1)
 #define OPTION_TARGET          (OPTION_IMAGE_BASE + 1)
 #define OPTION_MNO_CYGWIN      (OPTION_TARGET + 1)
+#define OPTION_NO_LEADING_UNDERSCORE (OPTION_MNO_CYGWIN + 1)
+#define OPTION_LEADING_UNDERSCORE (OPTION_NO_LEADING_UNDERSCORE + 1)
 
 /* DLLTOOL options.  */
-#define OPTION_NODELETE                (OPTION_MNO_CYGWIN + 1)
+#define OPTION_NODELETE                (OPTION_LEADING_UNDERSCORE + 1)
 #define OPTION_DLLNAME         (OPTION_NODELETE + 1)
 #define OPTION_NO_IDATA4       (OPTION_DLLNAME + 1)
 #define OPTION_NO_IDATA5       (OPTION_NO_IDATA4 + 1)
@@ -565,6 +581,8 @@ static const struct option long_options[] =
   {"entry", required_argument, NULL, 'e'},
   {"image-base", required_argument, NULL, OPTION_IMAGE_BASE},
   {"target", required_argument, NULL, OPTION_TARGET},
+  {"no-leading-underscore", no_argument, NULL, OPTION_NO_LEADING_UNDERSCORE},
+  {"leading-underscore", no_argument, NULL, OPTION_NO_LEADING_UNDERSCORE},
 
   /* dlltool options.  */
   {"no-delete", no_argument, NULL, 'n'},
@@ -728,6 +746,12 @@ main (int argc, char **argv)
        case OPTION_MNO_CYGWIN:
          target = "i386-mingw32";
          break;
+       case OPTION_NO_LEADING_UNDERSCORE:
+         is_leading_underscore = 0;
+         break;
+       case OPTION_LEADING_UNDERSCORE:
+         is_leading_underscore = 1;
+         break;
        case OPTION_BASE_FILE:
          base_file_name = optarg;
          delete_base_file = 0;
@@ -819,6 +843,18 @@ Creating one, but that may not be what you want"));
   else
     which_target = UNKNOWN_TARGET;
 
+  if (! strncmp (target, "arm", 3))
+    which_cpu = ARM_CPU;
+  else if (!strncmp (target, "x86_64", 6)
+          || !strncmp (target, "athlon64", 8)
+          || !strncmp (target, "amd64", 5))
+    which_cpu = X64_CPU;
+  else if (target[0] == 'i' && (target[1] >= '3' && target[1] <= '6')
+          && target[2] == '8' && target[3] == '6')
+    which_cpu = X86_CPU;
+  else
+    which_cpu = UNKNOWN_CPU;
+
   /* Re-create the command lines as a string, taking care to quote stuff.  */
   dlltool_cmdline = dyn_string_new (cmdline_len);
   if (verbose)
@@ -863,22 +899,38 @@ Creating one, but that may not be what you want"));
   dyn_string_append_cstr (driver_cmdline, " -o ");
   dyn_string_append_cstr (driver_cmdline, dll_file_name);
 
+  if (is_leading_underscore == 0)
+    dyn_string_append_cstr (driver_cmdline, " --no-leading-underscore");
+  else if (is_leading_underscore == 1)
+    dyn_string_append_cstr (driver_cmdline, " --leading-underscore");
+
   if (! entry_point || strlen (entry_point) == 0)
     {
+      const char *prefix = (is_leading_underscore != 0 ? "_" : "");
+      const char *postfix = "";
+      const char *name_entry;
+
+      if (which_cpu == X86_CPU || which_cpu == UNKNOWN_CPU)
+       postfix = "@12";
+
       switch (which_target)
        {
        case CYGWIN_TARGET:
-         entry_point = "__cygwin_dll_entry@12";
+         name_entry = "_cygwin_dll_entry";
          break;
 
        case MINGW_TARGET:
-         entry_point = "_DllMainCRTStartup@12";
+         name_entry = "DllMainCRTStartup";
          break;
 
        default:
-         entry_point = "_DllMain@12";
+         name_entry = "DllMain";
          break;
        }
+      entry_point =
+       (char *) malloc (strlen (name_entry) + strlen (prefix)
+                        + strlen (postfix) + 1);
+      sprintf (entry_point, "%s%s%s", prefix, name_entry, postfix);
     }
   dyn_string_append_cstr (driver_cmdline, " -Wl,-e,");
   dyn_string_append_cstr (driver_cmdline, entry_point);
This page took 0.024735 seconds and 4 git commands to generate.