diff options
-rw-r--r-- | binutils/ChangeLog | 15 | ||||
-rw-r--r-- | binutils/dllwrap.c | 60 |
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); |