aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--binutils/ChangeLog15
-rw-r--r--binutils/dllwrap.c60
2 files changed, 71 insertions, 4 deletions
diff --git a/binutils/ChangeLog b/binutils/ChangeLog
index 393a723..2250e22 100644
--- a/binutils/ChangeLog
+++ b/binutils/ChangeLog
@@ -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.
diff --git a/binutils/dllwrap.c b/binutils/dllwrap.c
index 0ef8361..50bbeb5 100644
--- a/binutils/dllwrap.c
+++ b/binutils/dllwrap.c
@@ -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);