2009-11-05 Kai Tietz <kai.tietz@onevision.com>
authorKai Tietz <kai.tietz@onevision.com>
Thu, 5 Nov 2009 09:49:07 +0000 (09:49 +0000)
committerKai Tietz <kai.tietz@onevision.com>
Thu, 5 Nov 2009 09:49:07 +0000 (09:49 +0000)
        * dllwrap.c (is_leading_underscore): New variable.
        (cpu_type): New enum type.
        (which_cpu): New variable.
        (usage): Add new options --no-leading-underscore
        and --leading-underscore.
        (long_options): Likewise.
        (OPTION_NO_LEADING_UNDERSCORE): New define.
        (OPTION_LEADING_UNDERSCORE): Likewise.
        (main): Initialize which_host, pass new options
        to dlltool, do underscoring dependent on
        is_leading_underscore, and do '@12' decoration
        only for x86.

binutils/ChangeLog
binutils/dllwrap.c

index 393a7235699c0872e95d7b643fd53e55882de413..2250e22abd06f793906321942b96595ae7cef6bd 100644 (file)
@@ -1,3 +1,18 @@
+2009-11-05  Kai Tietz  <kai.tietz@onevision.com>
+
+       * dllwrap.c (is_leading_underscore): New variable.
+       (cpu_type): New enum type.
+       (which_cpu): New variable.
+       (usage): Add new options --no-leading-underscore
+       and --leading-underscore.
+       (long_options): Likewise.
+       (OPTION_NO_LEADING_UNDERSCORE): New define.
+       (OPTION_LEADING_UNDERSCORE): Likewise.
+       (main): Initialize which_host, pass new options
+       to dlltool, do underscoring dependent on
+       is_leading_underscore, and do '@12' decoration
+       only for x86.
+
 2009-11-02  Paul Brook  <paul@codesourcery.com>
 
        * readelf.c (arm_attr_tag_VFP_arch): Add VFPv4 and VFPv4-D16.
index 0ef8361809644fdc4619b2b71469ffc8d26c2f3e..50bbeb5631048e0b6512f49060d464305a305a20 100644 (file)
@@ -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);