* dlltool.c: Include <assert.h>.
authorNick Clifton <nickc@redhat.com>
Sat, 23 Oct 2004 17:26:36 +0000 (17:26 +0000)
committerNick Clifton <nickc@redhat.com>
Sat, 23 Oct 2004 17:26:36 +0000 (17:26 +0000)
(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.

* 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.

binutils/ChangeLog
binutils/dlltool.c
binutils/testsuite/ChangeLog
binutils/testsuite/binutils-all/dlltool.exp
binutils/testsuite/config/default.exp
binutils/testsuite/lib/utils-lib.exp

index 39f96c69e830e0c6a43ffd78b8f07a7dcb7a844b..21df2f47dc56a0b75fff404e9ab01a5da5a50774 100644 (file)
@@ -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.
index 9d1d6f2157165f26320886c5bf7a3723b387a7a9..21045b4e55238caecb97bcdf0e45e1595b28a1c3 100644 (file)
 #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));
+           }
        }
     }
 
index 6e1d33d1561db12c53d4e6f87f19e1c3066c710d..8289b23db9efd5f739ff340c2ac980de0ca5c577 100644 (file)
@@ -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
index ba758df81a322fed7bd0348db7dd1d3267676d27..3f6cd315d4e22b80f98b7bac46a946ebd04c1c0e 100644 (file)
@@ -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)"
+}
index 4aa9ab330d69b793407128b824a7365e8b07655e..28c228808c65a6ac81b128854a3419d657363360 100644 (file)
@@ -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
index 1bb760751e349d16de56c5da5fb003be7d068efd..25fa035a2ceae5d3c8439e9feef121f893d338eb 100644 (file)
@@ -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 ""
+    }
+}