Based on patches from Mumit Khan <khan@xraylith.wisc.EDU>:

* configure.in: Define EXECUTABLE_SUFFIX.
	* dlltool.c: Include "dyn-string.h".  Include <stdarg.h> based on
	ANSI_PROTOTYPES, not __STDC__.
	(outfile): Remove.
	(gen_exp_file): Change uses of outfile to use alloca.
	(make_one_lib_file, make_head, make_tail): Likewise.
	(gen_lib_file): Likewise.
	(look_for_prog): New static function.
	(deduce_name): Rewrite to use look_for_prog.
	(mcore_elf_gen_out_file): Use dyn_string_t rather than outfile.
	* dllwrap.c: Don't include <stdio.h>, <errno.h>, <string.h>,
	<stdlib.h>, or <unistd.h>.  Include <sys/stat.h> and either
	<stdarg.h> or <varargs.h>.
	(driver_name): Initialize to NULL, not "gcc".
	(dlltool_name): Initialize to NULL, not "dlltool".
	(display, inform, look_for_prog, deduce_name): New static
	functions.
	(usage): Mention -mno-cygwin.
	(OPTION_MNO_CYGWIN): Define.
	(main): Handle -mno-cygwin.  Deduce driver_name and dlltool_name.
	* resrc.c (look_for_default): Make static.  Remove unused local
	path.  Check using EXECUTABLE_SUFFIX.
	(read_rc_file): Allocate enough space to hold EXECUTABLE_SUFFIX.
	* Makefile.am: Rebuild dependencies.
	(dllwrap_LDADD): Add $(INTLLIBS).
	* configure, Makefile.in, config.in: Rebuild.
This commit is contained in:
Ian Lance Taylor
1999-06-22 20:39:46 +00:00
parent be2acf2756
commit bb0cb4db08
9 changed files with 523 additions and 181 deletions

View File

@@ -221,11 +221,14 @@
#include "bucomm.h"
#include "getopt.h"
#include "demangle.h"
#include "dyn-string.h"
#include "dlltool.h"
#include <ctype.h>
#include <time.h>
#ifdef __STDC__
#include <sys/stat.h>
#ifdef ANSI_PROTOTYPES
#include <stdarg.h>
#else
#include <varargs.h>
@@ -236,9 +239,9 @@
#include "coff/internal.h"
#endif
/* Forward references. */
static char * deduce_name (char *);
static char *look_for_prog PARAMS ((const char *, const char *, int));
static char *deduce_name PARAMS ((const char *));
#ifdef DLLTOOL_MCORE_ELF
static void mcore_elf_cache_filename (char *);
@@ -456,12 +459,6 @@ static const unsigned char ppc_jtab[] =
static bfd_vma ppc_glue_insn = 0x80410004;
#endif
/* The outfile array must be big enough to contain a fully
qualified path name, plus an arbitary series of command
line switches. We hope that PATH_MAX times two will be
enough. */
static char outfile [PATHMAX * 2];
struct mac
{
const char *type;
@@ -1686,6 +1683,7 @@ gen_exp_file ()
int i;
export_type *exp;
dlist_type *dl;
char *cmd;
/* xgettext:c-format */
inform (_("Generating export file: %s\n"), exp_name);
@@ -1903,15 +1901,17 @@ gen_exp_file ()
fclose (f);
/* assemble the file */
sprintf (outfile, "%s -o %s %s", as_flags, exp_name, TMP_ASM);
cmd = (char *) alloca (strlen (as_flags) + strlen (exp_name)
+ sizeof TMP_ASM + 50);
sprintf (cmd, "%s -o %s %s", as_flags, exp_name, TMP_ASM);
#ifdef DLLTOOL_ARM
if (machine == MARM_INTERWORK || machine == MTHUMB)
strcat (outfile, " -mthumb-interwork");
strcat (cmd, " -mthumb-interwork");
#endif
run (as_name, outfile);
run (as_name, cmd);
if (dontdeltemps == 0)
unlink (TMP_ASM);
@@ -2091,10 +2091,14 @@ make_one_lib_file (exp, i)
{
#if 0
{
char *name;
FILE *f;
char *prefix="d";
sprintf (outfile, "%ss%05d.s", prefix, i);
f = fopen (outfile, FOPEN_WT);
const char *prefix = "d";
char *cmd;
name = (char *) alloca (strlen (prefix) + 10);
sprintf (name, "%ss%05d.s", prefix, i);
f = fopen (name, FOPEN_WT);
fprintf (f, "\t.text\n");
fprintf (f, "\t%s\t%s%s\n", ASM_GLOBAL, ASM_PREFIX, exp->name);
fprintf (f, "\t%s\t__imp_%s\n", ASM_GLOBAL, exp->name);
@@ -2129,15 +2133,16 @@ make_one_lib_file (exp, i)
fclose (f);
sprintf (outfile, "%s -o %ss%05d.o %ss%d.s",
cmd = (char *) alloca (strlen (as_flags) + 2 * strlen (prefix) + 50);
sprintf (cmd, "%s -o %ss%05d.o %ss%d.s",
as_flags, prefix, i, prefix, i);
#ifdef DLLTOOL_ARM
if (machine == MARM_INTERWORK || machine == MTHUMB)
strcat (outfile, " -mthumb-interwork");
strcat (cmd, " -mthumb-interwork");
#endif
run (as_name, outfile);
run (as_name, cmd);
}
#else /* if 0 */
{
@@ -2550,7 +2555,8 @@ make_one_lib_file (exp, i)
static bfd *
make_head ()
{
FILE * f = fopen (TMP_HEAD_S, FOPEN_WT);
FILE *f = fopen (TMP_HEAD_S, FOPEN_WT);
char *cmd;
if (f == NULL)
{
@@ -2601,22 +2607,25 @@ make_head ()
fclose (f);
sprintf (outfile, "%s -o %s %s", as_flags, TMP_HEAD_O, TMP_HEAD_S);
cmd = (char *) alloca (strlen (as_flags) + sizeof TMP_HEAD_O
+ sizeof TMP_HEAD_S + 50);
sprintf (cmd, "%s -o %s %s", as_flags, TMP_HEAD_O, TMP_HEAD_S);
#ifdef DLLTOOL_ARM
if (machine == MARM_INTERWORK || machine == MTHUMB)
strcat (outfile, " -mthumb-interwork");
strcat (cmd, " -mthumb-interwork");
#endif
run (as_name, outfile);
run (as_name, cmd);
return bfd_openr (TMP_HEAD_O, HOW_BFD_TARGET);
return bfd_openr (TMP_HEAD_O, HOW_BFD_TARGET);
}
static bfd *
make_tail ()
{
FILE * f = fopen (TMP_TAIL_S, FOPEN_WT);
FILE *f = fopen (TMP_TAIL_S, FOPEN_WT);
char *cmd;
if (f == NULL)
{
@@ -2667,14 +2676,16 @@ make_tail ()
fclose (f);
sprintf (outfile, "%s -o %s %s", as_flags, TMP_TAIL_O, TMP_TAIL_S);
cmd = (char *) alloca (strlen (as_flags) + sizeof TMP_TAIL_O
+ sizeof TMP_TAIL_S + 50);
sprintf (cmd, "%s -o %s %s", as_flags, TMP_TAIL_O, TMP_TAIL_S);
#ifdef DLLTOOL_ARM
if (machine == MARM_INTERWORK || MTHUMB)
strcat (outfile, " -mthumb-interwork");
strcat (cmd, " -mthumb-interwork");
#endif
run (as_name, outfile);
run (as_name, cmd);
return bfd_openr (TMP_TAIL_O, HOW_BFD_TARGET);
}
@@ -2749,12 +2760,15 @@ gen_lib_file ()
if (dontdeltemps < 2)
{
char *name;
name = (char *) alloca (sizeof TMP_STUB + 10);
for (i = 0, exp = d_exports; exp; i++, exp = exp->next)
{
sprintf (outfile, "%s%05d.o", TMP_STUB, i);
if (unlink (outfile) < 0)
sprintf (name, "%s%05d.o", TMP_STUB, i);
if (unlink (name) < 0)
/* xgettext:c-format */
warn (_("cannot delete %s: %s\n"), outfile, strerror (errno));
warn (_("cannot delete %s: %s\n"), name, strerror (errno));
}
}
@@ -3305,36 +3319,127 @@ main (ac, av)
return 0;
}
/* Look for the program formed by concatenating PROG_NAME and the
string running from PREFIX to END_PREFIX. If the concatenated
string contains a '/', try appending EXECUTABLE_SUFFIX if it is
defined. */
static char *
look_for_prog (prog_name, prefix, end_prefix)
const char *prog_name;
const char *prefix;
int end_prefix;
{
struct stat s;
char *cmd;
cmd = xmalloc (strlen (prefix)
+ strlen (prog_name)
#ifdef EXECUTABLE_SUFFIX
+ strlen (EXECUTABLE_SUFFIX)
#endif
+ 10);
strcpy (cmd, prefix);
sprintf (cmd + end_prefix, "%s", prog_name);
if (strchr (cmd, '/') != NULL)
{
int found;
found = (stat (cmd, &s) == 0
#ifdef EXECUTABLE_SUFFIX
|| stat (strcat (cmd, EXECUTABLE_SUFFIX), &s) == 0
#endif
);
if (! found)
{
/* xgettext:c-format */
inform (_("Tried file: %s"), cmd);
free (cmd);
return NULL;
}
}
/* xgettext:c-format */
inform (_("Using file: %s"), cmd);
return cmd;
}
/* Deduce the name of the program we are want to invoke.
PROG_NAME is the basic name of the program we want to run,
eg "as" or "ld". The catch is that we might want actually
run "i386-pe-as" or "ppc-pe-ld". We detect this case by
examining the name used to invoke dlltool itself. If
dlltool is actually called <foo>-<bar>-dlltool then we
prepend <foo>-<bar> to the default name. */
run "i386-pe-as" or "ppc-pe-ld".
If argv[0] contains the full path, then try to find the program
in the same place, with and then without a target-like prefix.
Given, argv[0] = /usr/local/bin/i586-cygwin32-dlltool,
deduce_name("as") uses the following search order:
/usr/local/bin/i586-cygwin32-as
/usr/local/bin/as
as
If there's an EXECUTABLE_SUFFIX, it'll use that as well; for each
name, it'll try without and then with EXECUTABLE_SUFFIX.
Given, argv[0] = i586-cygwin32-dlltool, it will not even try "as"
as the fallback, but rather return i586-cygwin32-as.
Oh, and given, argv[0] = dlltool, it'll return "as".
Returns a dynamically allocated string. */
static char *
deduce_name (char * prog_name)
deduce_name (prog_name)
const char *prog_name;
{
/* Use our own static array to hold the constructed name
rather than the outfile[] array, as that array may
already be in use. */
static char new_name[32];
char * p;
char *cmd;
char *dash, *slash, *cp;
p = strrchr (program_name, '-');
if (p == NULL)
return prog_name;
dash = NULL;
slash = NULL;
for (cp = program_name; *cp != '\0'; ++cp)
{
if (*cp == '-')
dash = cp;
if (
#if defined(__DJGPP__) || defined (__CYGWIN__) || defined(__WIN32__)
*cp == ':' || *cp == '\\' ||
#endif
*cp == '/')
{
slash = cp;
dash = NULL;
}
}
/* assert (strlen (program_name) < 32); */
strcpy (new_name, program_name);
new_name [(p - program_name) + 1] = 0;
cmd = NULL;
strcat (new_name, prog_name);
if (dash != NULL)
{
/* First, try looking for a prefixed PROG_NAME in the
PROGRAM_NAME directory, with the same prefix as PROGRAM_NAME. */
cmd = look_for_prog (prog_name, program_name, dash - program_name + 1);
}
return new_name;
if (slash != NULL && cmd == NULL)
{
/* Next, try looking for a PROG_NAME in the same directory as
that of this program. */
cmd = look_for_prog (prog_name, program_name, slash - program_name + 1);
}
if (cmd == NULL)
{
/* Just return PROG_NAME as is. */
cmd = xstrdup (prog_name);
}
return cmd;
}
#ifdef DLLTOOL_MCORE_ELF
@@ -3371,79 +3476,85 @@ static void
mcore_elf_gen_out_file (void)
{
fname_cache * ptr;
dyn_string_t ds;
/* Step one. Run 'ld -r' on the input object files in order to resolve
any internal references and to generate a single .exports section. */
ptr = & fnames;
strcpy (outfile, "-r ");
ds = dyn_string_new (100);
dyn_string_append (ds, "-r ");
if (mcore_elf_linker_flags != NULL)
strcat (outfile, mcore_elf_linker_flags);
dyn_string_append (ds, mcore_elf_linker_flags);
while (ptr->next != NULL)
{
/* Check for overrun: what the hell, it's only cpu cycles... */
if (strlen (outfile) + strlen (ptr->filename) + 2 >= sizeof (outfile))
{
fatal (_("buffer overflow\n"));
return;
}
strcat (outfile, ptr->filename);
strcat (outfile, " ");
dyn_string_append (ds, ptr->filename);
dyn_string_append (ds, " ");
ptr = ptr->next;
}
strcat (outfile, "-o ");
strcat (outfile, MCORE_ELF_TMP_OBJ);
dyn_string_append (ds, "-o ");
dyn_string_append (ds, MCORE_ELF_TMP_OBJ);
if (mcore_elf_linker == NULL)
mcore_elf_linker = deduce_name ("ld");
run (mcore_elf_linker, outfile);
run (mcore_elf_linker, ds->s);
dyn_string_delete (ds);
/* Step two. Create a .exp file and a .lib file from the temporary file.
Do this by recursively invoking dlltool....*/
sprintf (outfile, "-S %s", as_name);
ds = dyn_string_new (100);
dyn_string_append (ds, "-S ");
dyn_string_append (ds, as_name);
strcat (outfile, " -e ");
strcat (outfile, MCORE_ELF_TMP_EXP);
strcat (outfile, " -l ");
strcat (outfile, MCORE_ELF_TMP_LIB);
strcat (outfile, " " );
strcat (outfile, MCORE_ELF_TMP_OBJ);
dyn_string_append (ds, " -e ");
dyn_string_append (ds, MCORE_ELF_TMP_EXP);
dyn_string_append (ds, " -l ");
dyn_string_append (ds, MCORE_ELF_TMP_LIB);
dyn_string_append (ds, " " );
dyn_string_append (ds, MCORE_ELF_TMP_OBJ);
if (verbose)
strcat (outfile, " -v");
dyn_string_append (ds, " -v");
if (dontdeltemps)
{
strcat (outfile, " -n");
dyn_string_append (ds, " -n");
if (dontdeltemps > 1)
strcat (outfile, " -n");
dyn_string_append (ds, " -n");
}
/* XXX - FIME: ought to check/copy other command line options as well. */
run (program_name, outfile);
run (program_name, ds->s);
dyn_string_delete (ds);
/* Step four. Feed the .exp and object files to ld -shared to create the dll. */
strcpy (outfile, "-shared ");
ds = dyn_string_new (100);
dyn_string_append (ds, "-shared ");
if (mcore_elf_linker_flags)
strcat (outfile, mcore_elf_linker_flags);
dyn_string_append (ds, mcore_elf_linker_flags);
strcat (outfile, " ");
strcat (outfile, MCORE_ELF_TMP_EXP);
strcat (outfile, " ");
strcat (outfile, MCORE_ELF_TMP_OBJ);
strcat (outfile, " -o ");
strcat (outfile, mcore_elf_out_file);
dyn_string_append (ds, " ");
dyn_string_append (ds, MCORE_ELF_TMP_EXP);
dyn_string_append (ds, " ");
dyn_string_append (ds, MCORE_ELF_TMP_OBJ);
dyn_string_append (ds, " -o ");
dyn_string_append (ds, mcore_elf_out_file);
run (mcore_elf_linker, outfile);
run (mcore_elf_linker, ds->s);
dyn_string_delete (ds);
if (dontdeltemps == 0)
unlink (MCORE_ELF_TMP_EXP);