summaryrefslogtreecommitdiff
path: root/binutils
diff options
context:
space:
mode:
Diffstat (limited to 'binutils')
-rw-r--r--binutils/ChangeLog30
-rw-r--r--binutils/Makefile.am9
-rw-r--r--binutils/Makefile.in12
-rw-r--r--binutils/config.in3
-rwxr-xr-xbinutils/configure114
-rw-r--r--binutils/configure.in2
-rw-r--r--binutils/dlltool.c285
-rw-r--r--binutils/dllwrap.c215
-rw-r--r--binutils/resrc.c34
9 files changed, 523 insertions, 181 deletions
diff --git a/binutils/ChangeLog b/binutils/ChangeLog
index 75a6a79970..94daa90f76 100644
--- a/binutils/ChangeLog
+++ b/binutils/ChangeLog
@@ -1,3 +1,33 @@
+1999-06-22 Ian Lance Taylor <ian@zembu.com>
+
+ 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.
+
Mon Jun 21 16:49:11 1999 Jeffrey A Law (law@cygnus.com)
* readelf.c (dump_relocations): Use elf_hppa_reloc_type instead of
diff --git a/binutils/Makefile.am b/binutils/Makefile.am
index f24ad920bc..4d9940ad0b 100644
--- a/binutils/Makefile.am
+++ b/binutils/Makefile.am
@@ -260,7 +260,7 @@ windres_SOURCES = windres.c resrc.c rescoff.c resbin.c rcparse.y rclex.l \
windres_LDADD = $(BFDLIB) $(LIBIBERTY) @LEXLIB@ $(INTLLIBS)
dllwrap_SOURCES = dllwrap.c dyn-string.c
-dllwrap_LDADD = $(LIBIBERTY)
+dllwrap_LDADD = $(LIBIBERTY) $(INTLLIBS)
DISTSTUFF = arparse.c arparse.h arlex.c nlmheader.c sysinfo.c sysinfo.h \
@@ -381,7 +381,8 @@ debug.o: debug.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \
debug.h
dlltool.o: dlltool.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \
$(INCDIR)/libiberty.h bucomm.h config.h $(INCDIR)/fopen-same.h \
- $(INCDIR)/getopt.h $(INCDIR)/demangle.h dlltool.h
+ $(INCDIR)/getopt.h $(INCDIR)/demangle.h dyn-string.h \
+ dlltool.h
filemode.o: filemode.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \
bucomm.h config.h $(INCDIR)/fopen-same.h
ieee.o: ieee.c ../bfd/bfd.h $(INCDIR)/ansidecl.h $(INCDIR)/ieee.h \
@@ -462,8 +463,8 @@ readelf.o: readelf.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \
$(INCDIR)/elf/sparc.h $(INCDIR)/elf/m32r.h $(INCDIR)/elf/d10v.h \
$(INCDIR)/elf/d30v.h $(INCDIR)/elf/sh.h $(INCDIR)/elf/mn10200.h \
$(INCDIR)/elf/mn10300.h $(INCDIR)/elf/hppa.h $(INCDIR)/elf/arc.h \
- $(INCDIR)/elf/fr30.h bucomm.h config.h $(INCDIR)/fopen-same.h \
- $(INCDIR)/getopt.h
+ $(INCDIR)/elf/fr30.h $(INCDIR)/elf/mcore.h $(INCDIR)/elf/i960.h \
+ bucomm.h config.h $(INCDIR)/fopen-same.h $(INCDIR)/getopt.h
resres.o: resres.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \
bucomm.h config.h $(INCDIR)/fopen-same.h $(INCDIR)/libiberty.h \
windres.h winduni.h
diff --git a/binutils/Makefile.in b/binutils/Makefile.in
index 54796164a3..f90f4878cd 100644
--- a/binutils/Makefile.in
+++ b/binutils/Makefile.in
@@ -282,7 +282,7 @@ windres_SOURCES = windres.c resrc.c rescoff.c resbin.c rcparse.y rclex.l \
windres_LDADD = $(BFDLIB) $(LIBIBERTY) @LEXLIB@ $(INTLLIBS)
dllwrap_SOURCES = dllwrap.c dyn-string.c
-dllwrap_LDADD = $(LIBIBERTY)
+dllwrap_LDADD = $(LIBIBERTY) $(INTLLIBS)
DISTSTUFF = arparse.c arparse.h arlex.c nlmheader.c sysinfo.c sysinfo.h \
syslex.c deflex.c defparse.h defparse.c rclex.c rcparse.h rcparse.c
@@ -412,7 +412,7 @@ configure.in deflex.c defparse.c nlmheader.c rclex.c rcparse.c
DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
-TAR = tar
+TAR = gtar
GZIP_ENV = --best
SOURCES = $(nlmconv_SOURCES) $(srconv_SOURCES) $(sysdump_SOURCES) $(coffdump_SOURCES) $(dlltool_SOURCES) $(windres_SOURCES) $(dllwrap_SOURCES) $(size_SOURCES) $(objdump_SOURCES) $(ar_SOURCES) $(strings_SOURCES) $(ranlib_SOURCES) $(c__filt_SOURCES) $(objcopy_SOURCES) $(addr2line_SOURCES) $(readelf_SOURCES) $(nm_new_SOURCES) $(strip_new_SOURCES)
OBJECTS = $(nlmconv_OBJECTS) $(srconv_OBJECTS) $(sysdump_OBJECTS) $(coffdump_OBJECTS) $(dlltool_OBJECTS) $(windres_OBJECTS) $(dllwrap_OBJECTS) $(size_OBJECTS) $(objdump_OBJECTS) $(ar_OBJECTS) $(strings_OBJECTS) $(ranlib_OBJECTS) $(c__filt_OBJECTS) $(objcopy_OBJECTS) $(addr2line_OBJECTS) $(readelf_OBJECTS) $(nm_new_OBJECTS) $(strip_new_OBJECTS)
@@ -1134,7 +1134,6 @@ nlmconv.o: nlmconv.c $(INCDIR)/coff/sym.h $(INCDIR)/coff/ecoff.h
ldname=`echo ld | sed '$(transform)'`; \
$(COMPILE) -c -DLD_NAME="\"$${ldname}\"" @NLMCONV_DEFS@ $(srcdir)/nlmconv.c
-
diststuff: $(DISTSTUFF) info
# Targets to rebuild dependencies in this Makefile.
@@ -1240,7 +1239,8 @@ debug.o: debug.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \
debug.h
dlltool.o: dlltool.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \
$(INCDIR)/libiberty.h bucomm.h config.h $(INCDIR)/fopen-same.h \
- $(INCDIR)/getopt.h $(INCDIR)/demangle.h dlltool.h
+ $(INCDIR)/getopt.h $(INCDIR)/demangle.h dyn-string.h \
+ dlltool.h
filemode.o: filemode.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \
bucomm.h config.h $(INCDIR)/fopen-same.h
ieee.o: ieee.c ../bfd/bfd.h $(INCDIR)/ansidecl.h $(INCDIR)/ieee.h \
@@ -1321,8 +1321,8 @@ readelf.o: readelf.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \
$(INCDIR)/elf/sparc.h $(INCDIR)/elf/m32r.h $(INCDIR)/elf/d10v.h \
$(INCDIR)/elf/d30v.h $(INCDIR)/elf/sh.h $(INCDIR)/elf/mn10200.h \
$(INCDIR)/elf/mn10300.h $(INCDIR)/elf/hppa.h $(INCDIR)/elf/arc.h \
- $(INCDIR)/elf/fr30.h bucomm.h config.h $(INCDIR)/fopen-same.h \
- $(INCDIR)/getopt.h
+ $(INCDIR)/elf/fr30.h $(INCDIR)/elf/mcore.h $(INCDIR)/elf/i960.h \
+ bucomm.h config.h $(INCDIR)/fopen-same.h $(INCDIR)/getopt.h
resres.o: resres.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \
bucomm.h config.h $(INCDIR)/fopen-same.h $(INCDIR)/libiberty.h \
windres.h winduni.h
diff --git a/binutils/config.in b/binutils/config.in
index 38272ddfa5..4f630b82de 100644
--- a/binutils/config.in
+++ b/binutils/config.in
@@ -151,6 +151,9 @@
/* Define as 1 if you have gettext and don't want to use GNU gettext. */
#undef HAVE_GETTEXT
+/* Suffix used for executables, if any. */
+#undef EXECUTABLE_SUFFIX
+
/* Is the type time_t defined in <time.h>? */
#undef HAVE_TIME_T_IN_TIME_H
diff --git a/binutils/configure b/binutils/configure
index a8469fff34..d441fffbc4 100755
--- a/binutils/configure
+++ b/binutils/configure
@@ -4174,6 +4174,10 @@ test x"${ac_cv_exeext}" != xno && EXEEXT=${ac_cv_exeext}
echo "$ac_t""${ac_cv_exeext}" 1>&6
ac_exeext=$EXEEXT
+cat >> confdefs.h <<EOF
+#define EXECUTABLE_SUFFIX "${EXEEXT}"
+EOF
+
# host-specific stuff:
@@ -4187,7 +4191,7 @@ AR=${AR-ar}
# Extract the first word of "ranlib", so it can be a program name with args.
set dummy ranlib; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:4191: checking for $ac_word" >&5
+echo "configure:4195: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -4226,7 +4230,7 @@ fi
# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
# ./install, which can be erroneously created by make from ./install.sh.
echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6
-echo "configure:4230: checking for a BSD compatible install" >&5
+echo "configure:4234: checking for a BSD compatible install" >&5
if test -z "$INSTALL"; then
if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -4293,7 +4297,7 @@ if test "x$cross_compiling" = "xno"; then
EXEEXT_FOR_BUILD='$(EXEEXT)'
else
echo $ac_n "checking for build system executable suffix""... $ac_c" 1>&6
-echo "configure:4297: checking for build system executable suffix" >&5
+echo "configure:4301: checking for build system executable suffix" >&5
if eval "test \"`echo '$''{'bfd_cv_build_exeext'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -4318,17 +4322,17 @@ for ac_hdr in string.h strings.h stdlib.h unistd.h fcntl.h sys/file.h
do
ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:4322: checking for $ac_hdr" >&5
+echo "configure:4326: checking for $ac_hdr" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 4327 "configure"
+#line 4331 "configure"
#include "confdefs.h"
#include <$ac_hdr>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:4332: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:4336: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
@@ -4355,12 +4359,12 @@ fi
done
echo $ac_n "checking for sys/wait.h that is POSIX.1 compatible""... $ac_c" 1>&6
-echo "configure:4359: checking for sys/wait.h that is POSIX.1 compatible" >&5
+echo "configure:4363: checking for sys/wait.h that is POSIX.1 compatible" >&5
if eval "test \"`echo '$''{'ac_cv_header_sys_wait_h'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 4364 "configure"
+#line 4368 "configure"
#include "confdefs.h"
#include <sys/types.h>
#include <sys/wait.h>
@@ -4376,7 +4380,7 @@ wait (&s);
s = WIFEXITED (s) ? WEXITSTATUS (s) : 1;
; return 0; }
EOF
-if { (eval echo configure:4380: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:4384: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
ac_cv_header_sys_wait_h=yes
else
@@ -4399,19 +4403,19 @@ fi
# The Ultrix 4.2 mips builtin alloca declared by alloca.h only works
# for constant arguments. Useless!
echo $ac_n "checking for working alloca.h""... $ac_c" 1>&6
-echo "configure:4403: checking for working alloca.h" >&5
+echo "configure:4407: checking for working alloca.h" >&5
if eval "test \"`echo '$''{'ac_cv_header_alloca_h'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 4408 "configure"
+#line 4412 "configure"
#include "confdefs.h"
#include <alloca.h>
int main() {
char *p = alloca(2 * sizeof(int));
; return 0; }
EOF
-if { (eval echo configure:4415: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:4419: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
ac_cv_header_alloca_h=yes
else
@@ -4432,12 +4436,12 @@ EOF
fi
echo $ac_n "checking for alloca""... $ac_c" 1>&6
-echo "configure:4436: checking for alloca" >&5
+echo "configure:4440: checking for alloca" >&5
if eval "test \"`echo '$''{'ac_cv_func_alloca_works'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 4441 "configure"
+#line 4445 "configure"
#include "confdefs.h"
#ifdef __GNUC__
@@ -4465,7 +4469,7 @@ int main() {
char *p = (char *) alloca(1);
; return 0; }
EOF
-if { (eval echo configure:4469: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:4473: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
ac_cv_func_alloca_works=yes
else
@@ -4497,12 +4501,12 @@ EOF
echo $ac_n "checking whether alloca needs Cray hooks""... $ac_c" 1>&6
-echo "configure:4501: checking whether alloca needs Cray hooks" >&5
+echo "configure:4505: checking whether alloca needs Cray hooks" >&5
if eval "test \"`echo '$''{'ac_cv_os_cray'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 4506 "configure"
+#line 4510 "configure"
#include "confdefs.h"
#if defined(CRAY) && ! defined(CRAY2)
webecray
@@ -4527,12 +4531,12 @@ echo "$ac_t""$ac_cv_os_cray" 1>&6
if test $ac_cv_os_cray = yes; then
for ac_func in _getb67 GETB67 getb67; do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:4531: checking for $ac_func" >&5
+echo "configure:4535: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 4536 "configure"
+#line 4540 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -4555,7 +4559,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:4559: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:4563: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -4582,7 +4586,7 @@ done
fi
echo $ac_n "checking stack direction for C alloca""... $ac_c" 1>&6
-echo "configure:4586: checking stack direction for C alloca" >&5
+echo "configure:4590: checking stack direction for C alloca" >&5
if eval "test \"`echo '$''{'ac_cv_c_stack_direction'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -4590,7 +4594,7 @@ else
ac_cv_c_stack_direction=0
else
cat > conftest.$ac_ext <<EOF
-#line 4594 "configure"
+#line 4598 "configure"
#include "confdefs.h"
find_stack_direction ()
{
@@ -4609,7 +4613,7 @@ main ()
exit (find_stack_direction() < 0);
}
EOF
-if { (eval echo configure:4613: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:4617: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
then
ac_cv_c_stack_direction=1
else
@@ -4633,12 +4637,12 @@ fi
for ac_func in sbrk utimes
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:4637: checking for $ac_func" >&5
+echo "configure:4641: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 4642 "configure"
+#line 4646 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -4661,7 +4665,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:4665: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:4669: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -4689,14 +4693,14 @@ done
# Some systems have frexp only in -lm, not in -lc.
echo $ac_n "checking for library containing frexp""... $ac_c" 1>&6
-echo "configure:4693: checking for library containing frexp" >&5
+echo "configure:4697: checking for library containing frexp" >&5
if eval "test \"`echo '$''{'ac_cv_search_frexp'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
ac_func_search_save_LIBS="$LIBS"
ac_cv_search_frexp="no"
cat > conftest.$ac_ext <<EOF
-#line 4700 "configure"
+#line 4704 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
@@ -4707,7 +4711,7 @@ int main() {
frexp()
; return 0; }
EOF
-if { (eval echo configure:4711: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:4715: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
ac_cv_search_frexp="none required"
else
@@ -4718,7 +4722,7 @@ rm -f conftest*
test "$ac_cv_search_frexp" = "no" && for i in -lm; do
LIBS="-l$i $ac_func_search_save_LIBS"
cat > conftest.$ac_ext <<EOF
-#line 4722 "configure"
+#line 4726 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
@@ -4729,7 +4733,7 @@ int main() {
frexp()
; return 0; }
EOF
-if { (eval echo configure:4733: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:4737: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
ac_cv_search_frexp="-l$i"
break
@@ -4751,19 +4755,19 @@ else :
fi
echo $ac_n "checking for time_t in time.h""... $ac_c" 1>&6
-echo "configure:4755: checking for time_t in time.h" >&5
+echo "configure:4759: checking for time_t in time.h" >&5
if eval "test \"`echo '$''{'bu_cv_decl_time_t_time_h'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 4760 "configure"
+#line 4764 "configure"
#include "confdefs.h"
#include <time.h>
int main() {
time_t i;
; return 0; }
EOF
-if { (eval echo configure:4767: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:4771: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
bu_cv_decl_time_t_time_h=yes
else
@@ -4784,19 +4788,19 @@ EOF
fi
echo $ac_n "checking for time_t in sys/types.h""... $ac_c" 1>&6
-echo "configure:4788: checking for time_t in sys/types.h" >&5
+echo "configure:4792: checking for time_t in sys/types.h" >&5
if eval "test \"`echo '$''{'bu_cv_decl_time_t_types_h'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 4793 "configure"
+#line 4797 "configure"
#include "confdefs.h"
#include <sys/types.h>
int main() {
time_t i;
; return 0; }
EOF
-if { (eval echo configure:4800: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:4804: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
bu_cv_decl_time_t_types_h=yes
else
@@ -4819,12 +4823,12 @@ fi
# Under Next 3.2 <utime.h> apparently does not define struct utimbuf
# by default.
echo $ac_n "checking for utime.h""... $ac_c" 1>&6
-echo "configure:4823: checking for utime.h" >&5
+echo "configure:4827: checking for utime.h" >&5
if eval "test \"`echo '$''{'bu_cv_header_utime_h'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 4828 "configure"
+#line 4832 "configure"
#include "confdefs.h"
#include <sys/types.h>
#ifdef HAVE_TIME_H
@@ -4835,7 +4839,7 @@ int main() {
struct utimbuf s;
; return 0; }
EOF
-if { (eval echo configure:4839: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:4843: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
bu_cv_header_utime_h=yes
else
@@ -4856,12 +4860,12 @@ EOF
fi
echo $ac_n "checking whether fprintf must be declared""... $ac_c" 1>&6
-echo "configure:4860: checking whether fprintf must be declared" >&5
+echo "configure:4864: checking whether fprintf must be declared" >&5
if eval "test \"`echo '$''{'bfd_cv_decl_needed_fprintf'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 4865 "configure"
+#line 4869 "configure"
#include "confdefs.h"
#include <stdio.h>
@@ -4882,7 +4886,7 @@ int main() {
char *(*pfn) = (char *(*)) fprintf
; return 0; }
EOF
-if { (eval echo configure:4886: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:4890: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
bfd_cv_decl_needed_fprintf=no
else
@@ -4903,12 +4907,12 @@ EOF
fi
echo $ac_n "checking whether strstr must be declared""... $ac_c" 1>&6
-echo "configure:4907: checking whether strstr must be declared" >&5
+echo "configure:4911: checking whether strstr must be declared" >&5
if eval "test \"`echo '$''{'bfd_cv_decl_needed_strstr'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 4912 "configure"
+#line 4916 "configure"
#include "confdefs.h"
#include <stdio.h>
@@ -4929,7 +4933,7 @@ int main() {
char *(*pfn) = (char *(*)) strstr
; return 0; }
EOF
-if { (eval echo configure:4933: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:4937: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
bfd_cv_decl_needed_strstr=no
else
@@ -4950,12 +4954,12 @@ EOF
fi
echo $ac_n "checking whether sbrk must be declared""... $ac_c" 1>&6
-echo "configure:4954: checking whether sbrk must be declared" >&5
+echo "configure:4958: checking whether sbrk must be declared" >&5
if eval "test \"`echo '$''{'bfd_cv_decl_needed_sbrk'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 4959 "configure"
+#line 4963 "configure"
#include "confdefs.h"
#include <stdio.h>
@@ -4976,7 +4980,7 @@ int main() {
char *(*pfn) = (char *(*)) sbrk
; return 0; }
EOF
-if { (eval echo configure:4980: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:4984: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
bfd_cv_decl_needed_sbrk=no
else
@@ -4997,12 +5001,12 @@ EOF
fi
echo $ac_n "checking whether getenv must be declared""... $ac_c" 1>&6
-echo "configure:5001: checking whether getenv must be declared" >&5
+echo "configure:5005: checking whether getenv must be declared" >&5
if eval "test \"`echo '$''{'bfd_cv_decl_needed_getenv'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 5006 "configure"
+#line 5010 "configure"
#include "confdefs.h"
#include <stdio.h>
@@ -5023,7 +5027,7 @@ int main() {
char *(*pfn) = (char *(*)) getenv
; return 0; }
EOF
-if { (eval echo configure:5027: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:5031: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
bfd_cv_decl_needed_getenv=no
else
@@ -5044,12 +5048,12 @@ EOF
fi
echo $ac_n "checking whether environ must be declared""... $ac_c" 1>&6
-echo "configure:5048: checking whether environ must be declared" >&5
+echo "configure:5052: checking whether environ must be declared" >&5
if eval "test \"`echo '$''{'bfd_cv_decl_needed_environ'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 5053 "configure"
+#line 5057 "configure"
#include "confdefs.h"
#include <stdio.h>
@@ -5070,7 +5074,7 @@ int main() {
char *(*pfn) = (char *(*)) environ
; return 0; }
EOF
-if { (eval echo configure:5074: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:5078: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
bfd_cv_decl_needed_environ=no
else
diff --git a/binutils/configure.in b/binutils/configure.in
index 7da8ab6cc4..5e7bd3ff82 100644
--- a/binutils/configure.in
+++ b/binutils/configure.in
@@ -44,6 +44,8 @@ CY_GNU_GETTEXT
AM_MAINTAINER_MODE
AC_EXEEXT
+AC_DEFINE_UNQUOTED(EXECUTABLE_SUFFIX, "${EXEEXT}",
+ [Suffix used for executables, if any.])
# host-specific stuff:
diff --git a/binutils/dlltool.c b/binutils/dlltool.c
index aa596c9145..144fd90cb4 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);
diff --git a/binutils/dllwrap.c b/binutils/dllwrap.c
index 574611b3dd..235b5dad5c 100644
--- a/binutils/dllwrap.c
+++ b/binutils/dllwrap.c
@@ -26,21 +26,10 @@
#endif
#endif
-
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
-#include <stdio.h>
-#include <errno.h>
-#include <string.h>
-#ifdef HAVE_STDLIB_H
-#include <stdlib.h>
-#endif
-#ifdef HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-
#include "bfd.h"
#include "libiberty.h"
#include "bucomm.h"
@@ -49,6 +38,13 @@
#include <ctype.h>
#include <time.h>
+#include <sys/stat.h>
+
+#ifdef ANSI_PROTOTYPES
+#include <stdarg.h>
+#else
+#include <varargs.h>
+#endif
#ifdef HAVE_SYS_WAIT_H
#include <sys/wait.h>
@@ -83,7 +79,7 @@
#endif /* ! HAVE_SYS_WAIT_H */
static char *program_version = "0.2.4";
-static char *driver_name = "gcc";
+static char *driver_name = NULL;
static char *cygwin_driver_flags =
"-Wl,--dll -nostartfiles";
static char *mingw32_driver_flags = "-mdll";
@@ -91,7 +87,7 @@ static char *generic_driver_flags = "-Wl,--dll";
static char *entry_point;
-static char *dlltool_name = "dlltool";
+static char *dlltool_name = NULL;
static char *target = TARGET;
@@ -122,11 +118,186 @@ static int delete_def_file = 1;
static int run PARAMS ((const char *, char *));
static void usage PARAMS ((FILE *, int));
+static void display PARAMS ((const char *, va_list));
+static void inform PARAMS ((const char *, ...));
+static char *look_for_prog PARAMS ((const char *, const char *, int));
+static char *deduce_name PARAMS ((const char *));
static void delete_temp_files PARAMS ((void));
static void cleanup_and_exit PARAMS ((int status));
/**********************************************************************/
+/* Please keep the following 4 routines in sync with dlltool.c:
+ display ()
+ inform ()
+ look_for_prog ()
+ deduce_name ()
+ It's not worth the hassle to break these out since dllwrap will
+ (hopefully) soon be retired in favor of `ld --shared. */
+
+static void
+display (message, args)
+ const char * message;
+ va_list args;
+{
+ if (program_name != NULL)
+ fprintf (stderr, "%s: ", program_name);
+
+ vfprintf (stderr, message, args);
+
+ if (message [strlen (message) - 1] != '\n')
+ fputc ('\n', stderr);
+}
+
+
+static void
+#ifdef __STDC__
+inform (const char * message, ...)
+#else
+inform (message, va_alist)
+ const char * message;
+ va_dcl
+#endif
+{
+ va_list args;
+
+ if (!verbose)
+ return;
+
+#ifdef __STDC__
+ va_start (args, message);
+#else
+ va_start (args);
+#endif
+
+ display (message, args);
+
+ va_end (args);
+}
+
+/* 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".
+
+ 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 (prog_name)
+ const char *prog_name;
+{
+ char *cmd;
+ char *dash, *slash, *cp;
+
+ 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;
+ }
+ }
+
+ cmd = NULL;
+
+ 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);
+ }
+
+ 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;
+}
+
static void
delete_temp_files ()
{
@@ -341,6 +512,7 @@ usage (file, status)
fprintf (file, " --image-base <base> Specify image base address\n");
fprintf (file, " --target <machine> i386-cygwin32 or i386-mingw32\n");
fprintf (file, " --dry-run Show what needs to be run\n");
+ fprintf (file, " --mno-cygwin Create Mingw DLL\n");
fprintf (file, " Options passed to DLLTOOL:\n");
fprintf (file, " --machine <machine>\n");
fprintf (file, " --output-exp <outname> Generate export file.\n");
@@ -381,9 +553,10 @@ usage (file, status)
#define OPTION_ENTRY (OPTION_DLLTOOL_NAME + 1)
#define OPTION_IMAGE_BASE (OPTION_ENTRY + 1)
#define OPTION_TARGET (OPTION_IMAGE_BASE + 1)
+#define OPTION_MNO_CYGWIN (OPTION_TARGET + 1)
/* DLLTOOL options. */
-#define OPTION_NODELETE (OPTION_TARGET + 1)
+#define OPTION_NODELETE (OPTION_MNO_CYGWIN + 1)
#define OPTION_DLLNAME (OPTION_NODELETE + 1)
#define OPTION_NO_IDATA4 (OPTION_DLLNAME + 1)
#define OPTION_NO_IDATA5 (OPTION_NO_IDATA4 + 1)
@@ -568,6 +741,9 @@ main (argc, argv)
case OPTION_TARGET:
target = optarg;
break;
+ case OPTION_MNO_CYGWIN:
+ target = "i386-mingw32";
+ break;
case OPTION_BASE_FILE:
base_file_name = optarg;
delete_base_file = 0;
@@ -614,7 +790,7 @@ main (argc, argv)
}
}
}
-
+
/* sanity checks. */
if (! dll_name && ! dll_file_name)
{
@@ -631,7 +807,14 @@ main (argc, argv)
{
dll_file_name = xstrdup (dll_name);
}
-
+
+ /* Deduce driver-name and dlltool-name from our own. */
+ if (driver_name == NULL)
+ driver_name = deduce_name ("gcc");
+
+ if (dlltool_name == NULL)
+ dlltool_name = deduce_name ("dlltool");
+
if (! def_file_seen)
{
char *fileprefix = choose_temp_base ();
diff --git a/binutils/resrc.c b/binutils/resrc.c
index 41c9ccacfb..ed6a36a4f7 100644
--- a/binutils/resrc.c
+++ b/binutils/resrc.c
@@ -1,5 +1,5 @@
/* resrc.c -- read and write Windows rc files.
- Copyright 1997, 1998 Free Software Foundation, Inc.
+ Copyright 1997, 1998, 1999 Free Software Foundation, Inc.
Written by Ian Lance Taylor, Cygnus Support.
This file is part of GNU Binutils.
@@ -112,6 +112,8 @@ static int icons;
/* Local functions. */
+static FILE *look_for_default PARAMS ((char *, const char *, int,
+ const char *, const char *));
static void close_pipe PARAMS ((void));
static void unexpected_eof PARAMS ((const char *));
static int get_word PARAMS ((FILE *, const char *));
@@ -122,41 +124,44 @@ static void define_fontdirs PARAMS ((void));
/* look for the preprocessor program */
-FILE *
+static FILE *
look_for_default (cmd, prefix, end_prefix, preprocargs, filename)
char *cmd;
- char *prefix;
+ const char *prefix;
int end_prefix;
- char *preprocargs;
- char *filename;
+ const char *preprocargs;
+ const char *filename;
{
- char *path = getenv ("PATH");
char *space;
int found;
struct stat s;
strcpy (cmd, prefix);
- sprintf (cmd+end_prefix, "%s", DEFAULT_PREPROCESSOR);
- space = strchr (cmd+end_prefix, ' ');
+ sprintf (cmd + end_prefix, "%s", DEFAULT_PREPROCESSOR);
+ space = strchr (cmd + end_prefix, ' ');
if (space)
*space = 0;
if (strchr (cmd, '/'))
{
- found = stat (cmd, &s);
+ found = (stat (cmd, &s) == 0
+#ifdef EXECUTABLE_SUFFIX
+ || stat (strcat (cmd, EXECUTABLE_SUFFIX), &s) == 0
+#endif
+ );
- if (found < 0)
+ if (! found)
{
if (verbose)
fprintf (stderr, "Tried `%s'\n", cmd);
- return 0;
+ return NULL;
}
}
strcpy (cmd, prefix);
- sprintf (cmd+end_prefix, "%s %s %s",
+ sprintf (cmd + end_prefix, "%s %s %s",
DEFAULT_PREPROCESSOR, preprocargs, filename);
if (verbose)
@@ -202,11 +207,14 @@ read_rc_file (filename, preprocessor, preprocargs, language)
+ strlen (preprocessor)
+ strlen (preprocargs)
+ strlen (filename)
+#ifdef EXECUTABLE_SUFFIX
+ + strlen (EXECUTABLE_SUFFIX)
+#endif
+ 10);
dash = slash = 0;
- for (cp=program_name; *cp; cp++)
+ for (cp = program_name; *cp; cp++)
{
if (*cp == '-')
dash = cp;