PATCH pecoff mingw32 dlltool: Add option to create external aliases of DLL imports.

Aaron W. LaFramboise aaronrabiddog51@aaronwl.com
Sun Jul 11 07:49:00 GMT 2004


This patch adds an option --ext-prefix-alias that creates aliases of DLL
imports in an import library, with a specified prefix.

The ability to create aliases in this fashion is useful where one wants
to override the functionality in a DLL while still allowing access to
the original function.

I initially considered adding this as an extension to the DEF format,
but decided that that would cause more portability problems compared to
just adding an option.  In addition, its much easier to just specify an
option on the command line than to have to add an alias for each export.

Build and tested on i686-pc-mingw32.

Aaron W. LaFramboise


2004-07-09  Aaron W. LaFramboise <aaron98wiridge9@aaronwl.com>

	* binutils/doc/binutils.texi
	(--ext-prefix-alias): Document.
	* binutils/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.

Index: src/binutils/doc/binutils.texi
===================================================================
RCS file: /cvs/src/src/binutils/doc/binutils.texi,v
retrieving revision 1.53
diff -c -3 -p -r1.53 binutils.texi
*** src/binutils/doc/binutils.texi	3 Jul 2004 16:07:48 -0000	1.53
--- src/binutils/doc/binutils.texi	11 Jul 2004 07:35:44 -0000
*************** dlltool [@option{-d}|@option{--input-def
*** 2866,2871 ****
--- 2866,2872 ----
          [@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}]
*************** Specifies that when @command{dlltool} is
*** 3055,3060 ****
--- 3056,3067 ----
  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 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: src/binutils/dlltool.c
===================================================================
RCS file: /cvs/src/src/binutils/dlltool.c,v
retrieving revision 1.50
diff -c -3 -p -r1.50 dlltool.c
*** src/binutils/dlltool.c	9 Jul 2004 16:20:05 -0000	1.50
--- src/binutils/dlltool.c	11 Jul 2004 02:53:01 -0000
*************** extern char * program_name;
*** 382,387 ****
--- 382,388 ----
  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;
*************** make_one_lib_file (export_type *exp, int
*** 2245,2252 ****
--- 2246,2255 ----
      {
        bfd *      abfd;
        asymbol *  exp_label;
+       asymbol *  exp_label_pre;
        asymbol *  iname = 0;
        asymbol *  iname2;
+       asymbol *  iname2_pre = 0;
        asymbol *  iname_lab;
        asymbol ** iname_lab_pp;
        asymbol ** iname_pp;
*************** make_one_lib_file (export_type *exp, int
*** 2336,2341 ****
--- 2339,2360 ----
  	    bfd_coff_set_symbol_class (abfd, exp_label, C_THUMBEXTFUNC);
  #endif
  	  ptrs[oidx++] = exp_label;
+
+ 	  if (ext_prefix_alias)
+ 	    {
+ 	      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
*************** make_one_lib_file (export_type *exp, int
*** 2356,2361 ****
--- 2375,2392 ----
        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;
*************** make_one_lib_file (export_type *exp, int
*** 2367,2372 ****
--- 2398,2405 ----
        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;
*************** usage (FILE *file, int status)
*** 3129,3134 ****
--- 3162,3168 ----
    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"));
*************** static const struct option long_options[
*** 3168,3173 ****
--- 3202,3208 ----
    {"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'},
*************** main (int ac, char **av)
*** 3281,3286 ****
--- 3316,3324 ----
  	case 'A':
  	  add_stdcall_alias = 1;
  	  break;
+ 	case 'p':
+ 	  ext_prefix_alias = optarg;
+ 	  break;
  	case 'd':
  	  def_file = optarg;
  	  break;



More information about the Binutils mailing list