diff --git a/binutils/ChangeLog b/binutils/ChangeLog index 39f96c69e8..21df2f47dc 100644 --- a/binutils/ChangeLog +++ b/binutils/ChangeLog @@ -1,3 +1,13 @@ +2004-10-23 Aaron W. LaFramboise + + * dlltool.c: Include . + (PREFIX_ALIAS_BASE): Define. + (struct export): Add member import_name; + (def_exports): Set import_name. + (make_one_lib_file): Remove prefix alias code, use import_name + in .idata$6. + (gen_lib_file): Create and delete aliases. + 2004-10-19 H.J. Lu * readelf.c (process_section_groups): Free symtab after use. diff --git a/binutils/dlltool.c b/binutils/dlltool.c index 9d1d6f2157..21045b4e55 100644 --- a/binutils/dlltool.c +++ b/binutils/dlltool.c @@ -261,6 +261,8 @@ #include #endif +#include + #ifdef DLLTOOL_ARM #include "coff/arm.h" #include "coff/internal.h" @@ -428,7 +430,11 @@ static char * mcore_elf_linker_flags = NULL; #define DRECTVE_SECTION_NAME ".drectve" #endif -#define PATHMAX 250 /* What's the right name for this ? */ +/* What's the right name for this ? */ +#define PATHMAX 250 + +/* External name alias numbering starts here. */ +#define PREFIX_ALIAS_BASE 20000 char *tmp_asm_buf; char *tmp_head_s_buf; @@ -642,6 +648,7 @@ typedef struct export { const char *name; const char *internal_name; + const char *import_name; int ordinal; int constant; int noname; /* Don't put name in image file. */ @@ -901,6 +908,7 @@ def_exports (const char *name, const char *internal_name, int ordinal, p->name = name; p->internal_name = internal_name ? internal_name : name; + p->import_name = name; p->ordinal = ordinal; p->constant = constant; p->noname = noname; @@ -2248,7 +2256,6 @@ make_one_lib_file (export_type *exp, int i) asymbol * exp_label; asymbol * iname = 0; asymbol * iname2; - asymbol * iname2_pre = 0; asymbol * iname_lab; asymbol ** iname_lab_pp; asymbol ** iname_pp; @@ -2338,23 +2345,6 @@ make_one_lib_file (export_type *exp, int i) bfd_coff_set_symbol_class (abfd, exp_label, C_THUMBEXTFUNC); #endif ptrs[oidx++] = exp_label; - - if (ext_prefix_alias) - { - asymbol * exp_label_pre; - - exp_label_pre = bfd_make_empty_symbol (abfd); - exp_label_pre->name - = make_imp_label (ext_prefix_alias, exp->name); - exp_label_pre->section = exp_label->section; - exp_label_pre->flags = exp_label->flags; - exp_label_pre->value = exp_label->value; -#ifdef DLLTOOL_ARM - if (machine == MTHUMB) - bfd_coff_set_symbol_class (abfd, exp_label, C_THUMBEXTFUNC); -#endif - ptrs[oidx++] = exp_label_pre; - } } /* Generate imp symbols with one underscore for Microsoft @@ -2375,19 +2365,6 @@ make_one_lib_file (export_type *exp, int i) iname2->flags = BSF_GLOBAL; iname2->value = 0; - if (ext_prefix_alias) - { - char *pre_name; - - iname2_pre = bfd_make_empty_symbol (abfd); - pre_name = xmalloc (strlen (ext_prefix_alias) + 7); - sprintf(pre_name, "__imp_%s", ext_prefix_alias); - iname2_pre->name = make_imp_label (pre_name, exp->name); - iname2_pre->section = iname2->section; - iname2_pre->flags = iname2->flags; - iname2_pre->value = iname2->value; - } - iname_lab = bfd_make_empty_symbol (abfd); iname_lab->name = head_label; @@ -2399,8 +2376,6 @@ make_one_lib_file (export_type *exp, int i) if (create_compat_implib) ptrs[oidx++] = iname; ptrs[oidx++] = iname2; - if (ext_prefix_alias) - ptrs[oidx++] = iname2_pre; iname_lab_pp = ptrs + oidx; ptrs[oidx++] = iname_lab; @@ -2517,11 +2492,11 @@ make_one_lib_file (export_type *exp, int i) why it did that, and it does not match what I see in programs compiled with the MS tools. */ int idx = exp->hint; - si->size = strlen (xlate (exp->name)) + 3; + si->size = strlen (xlate (exp->import_name)) + 3; si->data = xmalloc (si->size); si->data[0] = idx & 0xff; si->data[1] = idx >> 8; - strcpy (si->data + 2, xlate (exp->name)); + strcpy (si->data + 2, xlate (exp->import_name)); } break; case IDATA7: @@ -2843,6 +2818,26 @@ gen_lib_file (void) n = make_one_lib_file (exp, i); n->next = head; head = n; + if (ext_prefix_alias) + { + export_type alias_exp; + + assert (i < PREFIX_ALIAS_BASE); + alias_exp.name = make_imp_label (ext_prefix_alias, exp->name); + alias_exp.internal_name = exp->internal_name; + alias_exp.import_name = exp->name; + alias_exp.ordinal = exp->ordinal; + alias_exp.constant = exp->constant; + alias_exp.noname = exp->noname; + alias_exp.private = exp->private; + alias_exp.data = exp->data; + alias_exp.hint = exp->hint; + alias_exp.forward = exp->forward; + alias_exp.next = exp->next; + n = make_one_lib_file (&alias_exp, i + PREFIX_ALIAS_BASE); + n->next = head; + head = n; + } } /* Now stick them all into the archive. */ @@ -2886,6 +2881,13 @@ gen_lib_file (void) if (unlink (name) < 0) /* xgettext:c-format */ non_fatal (_("cannot delete %s: %s"), name, strerror (errno)); + if (ext_prefix_alias) + { + sprintf (name, "%s%05d.o", TMP_STUB, i + PREFIX_ALIAS_BASE); + if (unlink (name) < 0) + /* xgettext:c-format */ + non_fatal (_("cannot delete %s: %s"), name, strerror (errno)); + } } } diff --git a/binutils/testsuite/ChangeLog b/binutils/testsuite/ChangeLog index 6e1d33d156..8289b23db9 100644 --- a/binutils/testsuite/ChangeLog +++ b/binutils/testsuite/ChangeLog @@ -1,3 +1,14 @@ +2004-10-23 Aaron W. LaFramboise + + * binutils-all/alias.def: New file. + * binutils-all/dlltool.exp: Two new -p tests. + * config/default.exp (dlltool_gas_flag): New variable. + Copy gas and lds executables into tmpdir/gas directory rather than + making symlinks which might not be supported by the host OS. + Attempt to handle the case where the host OS does not use the .exe + extension but the target OS does. + * lib/utils-lib.exp (exe_ext): New procedure. + 2004-07-12 Nick Clifton * binutils-all/dlltool.exp: Check that the -p switch is not diff --git a/binutils/testsuite/binutils-all/dlltool.exp b/binutils/testsuite/binutils-all/dlltool.exp index ba758df81a..3f6cd315d4 100644 --- a/binutils/testsuite/binutils-all/dlltool.exp +++ b/binutils/testsuite/binutils-all/dlltool.exp @@ -41,19 +41,36 @@ if ![string match "" $err] then { send_log "$err\n" verbose "$err" 1 fail "dlltool (fastcall export)" - continue +} else { + pass "dlltool (fastcall export)" } -pass "dlltool (fastcall export)" - -verbose "$DLLTOOL -p foo -d $srcdir/$subdir/fastcall.def" 1 -catch "exec $DLLTOOL -p foo -d $srcdir/$subdir/fastcall.def" err +verbose "$DLLTOOL -p prefix -l tmpdir/libalias.a -d $srcdir/$subdir/alias.def $dlltool_gas_flag" 1 +catch "exec $DLLTOOL -p prefix -l tmpdir/libalias.a -d $srcdir/$subdir/alias.def $dlltool_gas_flag" err if ![string match "" $err] then { send_log "$err\n" verbose "$err" 1 - fail "dlltool (aliased export)" + fail "dlltool -p (execution)" continue } -pass "dlltool (aliased export)" +pass "dlltool -p (execution)" + +set got [binutils_run $NM "tmpdir/libalias.a"] +set want "00000000 I __imp__prefix_symbol.*00000000 T _prefix_symbol.*00000000 I __imp__symbol.*00000000 T _symbol" + +if [regexp $want $got] then { + pass "dlltool -p (symbol names)" +} else { + fail "dlltool -p (symbol names)" +} + +set got [binutils_run $OBJDUMP "-s -j .idata\$6 tmpdir/libalias.a"] +set want "(Contents of section .idata\\\$6:.*\\.\\.symbol\\.\\..*){2,2}" + +if [regexp $want $got] then { + pass "dlltool -p (import name)" +} else { + fail "dlltool -p (import name)" +} diff --git a/binutils/testsuite/config/default.exp b/binutils/testsuite/config/default.exp index 4aa9ab330d..28c228808c 100644 --- a/binutils/testsuite/config/default.exp +++ b/binutils/testsuite/config/default.exp @@ -71,19 +71,28 @@ if ![info exists DLLTOOL] then { if ![file isdirectory tmpdir] {catch "exec mkdir tmpdir" status} -# Make a symlink from tmpdir/gas/as and tmpdir/gas/ld to the assembler +# Make a copy from tmpdir/gas/as and tmpdir/gas/ld to the assembler # and linker in the build tree, so that we can use a -B option to gcc # to force it to use the newly built assembler/linker. if {![file isdirectory tmpdir/gas]} then { catch "exec mkdir tmpdir/gas" status - if {[file isfile ../gas/as-new]} then { - catch "exec ln -s ../../../gas/as-new tmpdir/gas/as" status + send_user "file isfile ../gas/as-new[exe_ext]: [file isfile ../gas/as-new[exe_ext]]\n" + if {[file isfile ../gas/as-new[exe_ext]]} then { + catch "exec cp ../gas/as-new[exe_ext] tmpdir/gas/as[exe_ext]" status + } else { + # For non-Windows hosts there may be an executable + # without a .exe suffix, so try copying that instead. + catch "exec cp ../gas/as-new tmpdir/gas/as[exe_ext]" status } - if {[file isfile ../ld/ld-new]} then { - catch "exec ln -s ../../../ld/ld-new tmpdir/gas/ld" status + # This may not be needed any more... + if {[file isfile ../ld/ld-new[exe_ext]]} then { + catch "exec cp ../ld/ld-new[exe_ext] tmpdir/gas/ld[exe_ext]" status + } else { + catch "exec cp ../ld/ld-new tmpdir/gas/ld[exe_ext]" status } } set gcc_gas_flag "-B[pwd]/tmpdir/gas/" +set dlltool_gas_flag "-S [pwd]/tmpdir/gas/as[exe_ext]" # # binutils_run diff --git a/binutils/testsuite/lib/utils-lib.exp b/binutils/testsuite/lib/utils-lib.exp index 1bb760751e..25fa035a2c 100644 --- a/binutils/testsuite/lib/utils-lib.exp +++ b/binutils/testsuite/lib/utils-lib.exp @@ -149,3 +149,15 @@ proc is_elf_format {} { } return 1 } + +# +# exe_ext +# Returns target executable extension, if any. +# +proc exe_ext {} { + if { [istarget *-*-mingw32] || [istarget *-*-cygwin*] } { + return ".exe" + } else { + return "" + } +}