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.
This commit is contained in:
Kai Tietz 2009-11-05 09:49:07 +00:00
parent 594c8e5ede
commit fa0d16bebf
2 changed files with 71 additions and 4 deletions

View 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.

View 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);