aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--binutils/ChangeLog10
-rw-r--r--binutils/dlltool.c74
-rw-r--r--binutils/testsuite/ChangeLog11
-rw-r--r--binutils/testsuite/binutils-all/dlltool.exp31
-rw-r--r--binutils/testsuite/config/default.exp19
-rw-r--r--binutils/testsuite/lib/utils-lib.exp12
6 files changed, 109 insertions, 48 deletions
diff --git a/binutils/ChangeLog b/binutils/ChangeLog
index 39f96c6..21df2f4 100644
--- a/binutils/ChangeLog
+++ b/binutils/ChangeLog
@@ -1,3 +1,13 @@
+2004-10-23 Aaron W. LaFramboise <aaron98wiridge9@aaronwl.com>
+
+ * dlltool.c: Include <assert.h>.
+ (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 <hongjiu.lu@intel.com>
* readelf.c (process_section_groups): Free symtab after use.
diff --git a/binutils/dlltool.c b/binutils/dlltool.c
index 9d1d6f2..21045b4 100644
--- a/binutils/dlltool.c
+++ b/binutils/dlltool.c
@@ -261,6 +261,8 @@
#include <varargs.h>
#endif
+#include <assert.h>
+
#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 6e1d33d..8289b23 100644
--- a/binutils/testsuite/ChangeLog
+++ b/binutils/testsuite/ChangeLog
@@ -1,3 +1,14 @@
+2004-10-23 Aaron W. LaFramboise <aaron98wiridge9@aaronwl.com>
+
+ * 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 <nickc@redhat.com>
* 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 ba758df..3f6cd31 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 4aa9ab3..28c2288 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 1bb7607..25fa035 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 ""
+ }
+}