dlltool.c (ext_prefix_alias): New global variable.
authorNick Clifton <nickc@redhat.com>
Mon, 12 Jul 2004 17:07:55 +0000 (17:07 +0000)
committerNick Clifton <nickc@redhat.com>
Mon, 12 Jul 2004 17:07:55 +0000 (17:07 +0000)
 (make_one_lib_file): Add aliases with prefixes for external and import
 definitions.
 (usage): Document -p option.
 (long_options): Add --ext-prefix-alias option.
 (main): Handle -p.
* doc/binutils.texi: Document new switch.
* NEWS: Mention new switch.

binutils/ChangeLog
binutils/NEWS
binutils/dlltool.c
binutils/doc/binutils.texi
binutils/testsuite/ChangeLog
binutils/testsuite/binutils-all/dlltool.exp

index b54692e19e3cc1c01f506b31b9877387e1919985..2f1b7337eaa9cacb5faf4b7930b9b7dab3c072c1 100644 (file)
@@ -1,3 +1,14 @@
+2004-07-12  Aaron W. LaFramboise  <aaron98wiridge9@aaronwl.com>
+
+       * dlltool.c (ext_prefix_alias): New global variable.
+       (make_one_lib_file): Add aliases with prefixes for external
+       and import definitions.
+       (usage): Document -p option.
+       (long_options): Add --ext-prefix-alias option.
+       (main): Handle -p.
+       * doc/binutils.texi: Document new switch.
+       * NEWS: Mention new switch.
+
 2004-07-09  Aaron W. LaFramboise <aaron98wiridge9@aaronwl.com>
 
        * binutils/dlltool.c (asm_prefix): Add parameter: name.
index a72826ef873433e2ad43407196040cd2df2223ef..a753312c57ab367bdd25ccd27dcb5fb60abab29d 100644 (file)
@@ -1,5 +1,10 @@
 -*- text -*-
 
+* dlltool has a switch "--ext-prefix-alias <prefix>" to generate additional
+  import and export symbols with <preifx> prepended to them.
+
+Changes in 2.15:
+
 * objcopy and strip can now take wildcard patterns in symbol names specified on
   the command line provided that the --wildcard switch is used to enable them.
 
index 91539102daf48f6b679f01e647a50c04b95666a9..2f829287b9a2eae221a88c06ae6718ca5033a216 100644 (file)
@@ -382,6 +382,7 @@ extern char * program_name;
 static int machine;
 static int killat;
 static int add_stdcall_alias;
+static const char *ext_prefix_alias;
 static int verbose;
 static FILE *output_def;
 static FILE *base_file;
@@ -2247,6 +2248,7 @@ 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;
@@ -2260,7 +2262,6 @@ make_one_lib_file (export_type *exp, int i)
 #endif
       asymbol *  ptrs[NSECS + 4 + EXTRA + 1];
       flagword   applicable;
-
       char *     outname = xmalloc (strlen (TMP_STUB) + 10);
       int        oidx = 0;
 
@@ -2290,6 +2291,7 @@ make_one_lib_file (export_type *exp, int i)
       for (i = 0; i < NSECS; i++)
        {
          sinfo *si = secdata + i;
+
          if (si->id != i)
            abort();
          si->sec = bfd_make_section_old_way (abfd, si->name);
@@ -2336,6 +2338,23 @@ 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
@@ -2356,10 +2375,23 @@ make_one_lib_file (export_type *exp, int i)
       iname2->flags = BSF_GLOBAL;
       iname2->value = 0;
 
-      iname_lab = bfd_make_empty_symbol(abfd);
+      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;
-      iname_lab->section = (asection *)&bfd_und_section;
+      iname_lab->section = (asection *) &bfd_und_section;
       iname_lab->flags = 0;
       iname_lab->value = 0;
 
@@ -2367,6 +2399,8 @@ 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;
@@ -3129,6 +3163,7 @@ usage (FILE *file, int status)
   fprintf (file, _("   -U --add-underscore       Add underscores to symbols in interface library.\n"));
   fprintf (file, _("   -k --kill-at              Kill @<n> from exported names.\n"));
   fprintf (file, _("   -A --add-stdcall-alias    Add aliases without @<n>.\n"));
+  fprintf (file, _("   -p --ext-prefix-alias <prefix> Add aliases with <prefix>.\n"));
   fprintf (file, _("   -S --as <name>            Use <name> for assembler.\n"));
   fprintf (file, _("   -f --as-flags <flags>     Pass <flags> to the assembler.\n"));
   fprintf (file, _("   -C --compat-implib        Create backward compatible import library.\n"));
@@ -3168,6 +3203,7 @@ static const struct option long_options[] =
   {"add-underscore", no_argument, NULL, 'U'},
   {"kill-at", no_argument, NULL, 'k'},
   {"add-stdcall-alias", no_argument, NULL, 'A'},
+  {"ext-prefix-alias", required_argument, NULL, 'p'},
   {"verbose", no_argument, NULL, 'v'},
   {"version", no_argument, NULL, 'V'},
   {"help", no_argument, NULL, 'h'},
@@ -3204,9 +3240,9 @@ main (int ac, char **av)
 
   while ((c = getopt_long (ac, av,
 #ifdef DLLTOOL_MCORE_ELF
-                          "m:e:l:aD:d:z:b:xcCuUkAS:f:nvVHhM:L:F:",
+                          "m:e:l:aD:d:z:b:xp:cCuUkAS:f:nvVHhM:L:F:",
 #else
-                          "m:e:l:aD:d:z:b:xcCuUkAS:f:nvVHh",
+                          "m:e:l:aD:d:z:b:xp:cCuUkAS:f:nvVHh",
 #endif
                           long_options, 0))
         != EOF)
@@ -3281,6 +3317,9 @@ main (int ac, char **av)
        case 'A':
          add_stdcall_alias = 1;
          break;
+       case 'p':
+         ext_prefix_alias = optarg;
+         break;
        case 'd':
          def_file = optarg;
          break;
index c27c627094a360978b4c68c7026af18911366fa4..f92252d2f6f1a261bd40db40d19f7aaf0835b88a 100644 (file)
@@ -1,6 +1,6 @@
 \input texinfo       @c                    -*- Texinfo -*-
 @setfilename binutils.info
-@c Copyright 2001, 2002, 2003 Free Software Foundation, Inc.
+@c Copyright 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
 
 @include config.texi
 
@@ -30,7 +30,7 @@ END-INFO-DIR-ENTRY
 @ifinfo
 @c man begin COPYRIGHT
 Copyright @copyright{} 1991, 92, 93, 94, 95, 96, 97, 98, 99, 2000,
-2001, 2002, 2003 Free Software Foundation, Inc.
+2001, 2002, 2003, 2004 Free Software Foundation, Inc.
 
 Permission is granted to copy, distribute and/or modify this document
 under the terms of the GNU Free Documentation License, Version 1.1
@@ -55,7 +55,7 @@ notice identical to this one except for the removal of this paragraph
 @c  "objdump", "nm", "size", "strings", "strip", "readelf" and "ranlib".
 @c
 @c Copyright (C) 1991, 92, 93, 94, 95, 96, 97, 98, 99, 2000, 2001,
-@c 2002, 2003 Free Software Foundation, Inc.
+@c 2002, 2003, 2004 Free Software Foundation, Inc.
 @c 
 @c This text may be freely distributed under the terms of the GNU
 @c Free Documentation License.
@@ -81,7 +81,7 @@ notice identical to this one except for the removal of this paragraph
 
 @vskip 0pt plus 1filll
 Copyright @copyright{} 1991, 92, 93, 94, 95, 96, 97, 1998, 2000, 2001,
-2002, 2003 Free Software Foundation, Inc.
+2002, 2003, 2004 Free Software Foundation, Inc.
 
       Permission is granted to copy, distribute and/or modify this document
       under the terms of the GNU Free Documentation License, Version 1.1
@@ -2866,6 +2866,7 @@ dlltool [@option{-d}|@option{--input-def} @var{def-file-name}]
         [@option{-D}|@option{--dllname} @var{name}] [@option{-m}|@option{--machine} @var{machine}]
         [@option{-a}|@option{--add-indirect}] [@option{-U}|@option{--add-underscore}] [@option{-k}|@option{--kill-at}]
         [@option{-A}|@option{--add-stdcall-alias}]
+        [@option{-p}|@option{--ext-prefix-alias} @var{prefix}]
         [@option{-x}|@option{--no-idata4}] [@option{-c}|@option{--no-idata5}] [@option{-i}|@option{--interwork}]
         [@option{-n}|@option{--nodelete}] [@option{-t}|@option{--temp-prefix} @var{prefix}]
         [@option{-v}|@option{--verbose}] 
@@ -3055,6 +3056,12 @@ Specifies that when @command{dlltool} is creating the exports file it
 should add aliases for stdcall symbols without @samp{@@ <number>}
 in addition to the symbols with @samp{@@ <number>}.
 
+@item -p
+@itemx --ext-prefix-alias @var{prefix}
+Causes @command{dlltool} to create external aliases for all DLL
+imports with the specified prefix.  The aliases are created for both
+external and import symbols with no leading underscore.
+
 @item -x
 @itemx --no-idata4
 Specifies that when @command{dlltool} is creating the exports and library
index 8f3473a061b99ff19cdb7be5023020b486df705c..6e1d33d1561db12c53d4e6f87f19e1c3066c710d 100644 (file)
@@ -1,3 +1,8 @@
+2004-07-12  Nick Clifton  <nickc@redhat.com>
+
+       * binutils-all/dlltool.exp: Check that the -p switch is not
+       rejected.
+
 2004-07-09  Andreas Schwab  <schwab@suse.de>
 
        * binutils-all/m68k/movem.s: New file.
index f061ab8d3acbf6d83e932280095be081787c5596..ba758df81a322fed7bd0348db7dd1d3267676d27 100644 (file)
@@ -45,3 +45,15 @@ if ![string match "" $err] then {
 }
 
 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
+
+if ![string match "" $err] then {
+    send_log "$err\n"
+    verbose "$err" 1
+    fail "dlltool (aliased export)"
+    continue
+}
+
+pass "dlltool (aliased export)"