This is the mail archive of the binutils@sources.redhat.com mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[patch] dlltool


Hi!

I discovered a bug in dlltool that causes the export names in DLLs to be incorrectly sorted when fastcall and non-fastcall functions are mixed and --kill-at option is used. It causes the resulting binaries to be unloadable since Windows loader uses binary search for the exports. Attached is a test case and proposed fix.

Best regards,
Filip
2005-08-01  Filip Navara  <navaraf@reactos.com>

	* dlltool.c (alphafunc): Remove and replace usage with nfunc.
	(nfunc): Fix sorting of fastcall symbols when --kill-at is used.

Index: dlltool.c
===================================================================
RCS file: /cvs/src/src/binutils/dlltool.c,v
retrieving revision 1.61
diff -u -p -r1.61 dlltool.c
--- dlltool.c	8 May 2005 14:17:38 -0000	1.61
+++ dlltool.c	1 Aug 2005 15:37:45 -0000
@@ -705,7 +705,6 @@ static int nfunc (const void *, const vo
 static void remove_null_names (export_type **);
 static void process_duplicates (export_type **);
 static void fill_ordinals (export_type **);
-static int alphafunc (const void *, const void *);
 static void mangle_defs (void);
 static void usage (FILE *, int);
 static void inform (const char *, ...);
@@ -2834,8 +2833,15 @@ nfunc (const void *a, const void *b)
 {
   export_type *ap = *(export_type **) a;
   export_type *bp = *(export_type **) b;
+  const char *an = ap->name;
+  const char *bn = bp->name;
 
-  return (strcmp (ap->name, bp->name));
+  if (killat) {
+    an = (an[0] == '@') ? an + 1 : an;
+    bn = (bn[0] == '@') ? bn + 1 : bn;
+  }
+
+  return (strcmp (an, bn));
 }
 
 static void
@@ -2979,15 +2985,6 @@ fill_ordinals (export_type **d_export_ve
     }
 }
 
-static int
-alphafunc (const void *av, const void *bv)
-{
-  const export_type **a = (const export_type **) av;
-  const export_type **b = (const export_type **) bv;
-
-  return strcmp ((*a)->name, (*b)->name);
-}
-
 static void
 mangle_defs (void)
 {
@@ -3023,7 +3020,7 @@ mangle_defs (void)
 
   d_exports_lexically[i] = 0;
 
-  qsort (d_exports_lexically, i, sizeof (export_type *), alphafunc);
+  qsort (d_exports_lexically, i, sizeof (export_type *), nfunc);
 
   /* Fill exp entries with their hint values.  */
   for (i = 0; i < d_nfuncs; i++)

Attachment: test.tar.gz
Description: GNU Zip compressed data


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]