diff options
author | Ian Lance Taylor <ian@airs.com> | 1999-06-22 20:39:46 +0000 |
---|---|---|
committer | Ian Lance Taylor <ian@airs.com> | 1999-06-22 20:39:46 +0000 |
commit | bb0cb4db08103ccb12840275b162cfe8cc4501ce (patch) | |
tree | 6edf82820de8d712ad4193c914054927f3e77882 /binutils/dlltool.c | |
parent | be2acf275637e78bd900b7cce39af180f5c53cd3 (diff) | |
download | gdb-bb0cb4db08103ccb12840275b162cfe8cc4501ce.zip gdb-bb0cb4db08103ccb12840275b162cfe8cc4501ce.tar.gz gdb-bb0cb4db08103ccb12840275b162cfe8cc4501ce.tar.bz2 |
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.
Diffstat (limited to 'binutils/dlltool.c')
-rw-r--r-- | binutils/dlltool.c | 285 |
1 files changed, 198 insertions, 87 deletions
diff --git a/binutils/dlltool.c b/binutils/dlltool.c index aa596c9..144fd90 100644 --- a/binutils/dlltool.c +++ b/binutils/dlltool.c @@ -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); + + 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); - 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); + run (mcore_elf_linker, ds->s); - run (mcore_elf_linker, outfile); + dyn_string_delete (ds); if (dontdeltemps == 0) unlink (MCORE_ELF_TMP_EXP); |