* dlltool.c (scan_drectve_symbols): Handle type tags in exported
authorDJ Delorie <dj@redhat.com>
Tue, 28 Sep 1999 20:08:37 +0000 (20:08 +0000)
committerDJ Delorie <dj@redhat.com>
Tue, 28 Sep 1999 20:08:37 +0000 (20:08 +0000)
symbols.
(scan_filtered_symbols): Likewise.

binutils/ChangeLog
binutils/dlltool.c

index 3e155d9224b75faa5e392008995fda837dda483b..d94b9f61d4f2e9f46324ee374f34f53cb8dc0f46 100644 (file)
@@ -1,3 +1,9 @@
+1999-09-29  Mumit Khan  <khan@xraylith.wisc.edu>
+
+        * dlltool.c (scan_drectve_symbols): Handle type tags in exported
+        symbols.
+        (scan_filtered_symbols): Likewise.
+
 1999-09-19  Ian Lance Taylor  <ian@zembu.com>
 
        * resrc.c (write_rc_rcdata): Fix local variable shadowing
index 82576ff4c5f872263fbfd2839354ef99cd8ee8e2..0bd6a0e173e3ae47de2bd7848f6513c75cf78ec1 100644 (file)
@@ -1203,7 +1203,9 @@ scan_drectve_symbols (abfd)
   inform (_("Sucking in info from %s section in %s\n"),
          DRECTVE_SECTION_NAME, bfd_get_filename (abfd));
 
-  /* Search for -export: strings */
+  /* Search for -export: strings. The exported symbols can optionally
+     have type tags (eg., -export:foo,data), so handle those as well.
+     Currently only data tag is supported. */
   p = buf;
   e = buf + size;
   while (p < e)
@@ -1213,25 +1215,36 @@ scan_drectve_symbols (abfd)
        {
          char * name;
          char * c;
+         flagword flags = BSF_FUNCTION;
          
          p += 8;
          name = p;
-         while (p < e && *p != ' ' && *p != '-')
+         while (p < e && *p != ',' && *p != ' ' && *p != '-')
            p++;
          c = xmalloc (p - name + 1);
          memcpy (c, name, p - name);
          c[p - name] = 0;
+         if (p < e && *p == ',')       /* found type tag. */
+           {
+             char *tag_start = ++p;
+             while (p < e && *p != ' ' && *p != '-')
+               p++;
+             if (strncmp (tag_start, "data", 4) == 0)
+               flags &= ~BSF_FUNCTION;
+           }
+
 
          /* FIXME: The 5th arg is for the `constant' field.
             What should it be?  Not that it matters since it's not
             currently useful.  */
-         def_exports (c, 0, -1, 0, 0, 0);
+         def_exports (c, 0, -1, 0, 0, ! (flags & BSF_FUNCTION));
 
          if (add_stdcall_alias && strchr (c, '@'))
            {
              char *exported_name = xstrdup (c);
              char *atsym = strchr (exported_name, '@');
              *atsym = '\0';
+             /* Note: stdcall alias symbols can never be data. */
              def_exports (exported_name, xstrdup (c), -1, 0, 0, 0);
            }
        }
@@ -1273,13 +1286,15 @@ scan_filtered_symbols (abfd, minisyms, symcount, size)
       if (bfd_get_symbol_leading_char (abfd) == symbol_name[0])
        ++symbol_name;
 
-      def_exports (xstrdup (symbol_name) , 0, -1, 0, 0, 0);
+      def_exports (xstrdup (symbol_name) , 0, -1, 0, 0,
+                   ! (sym->flags & BSF_FUNCTION));
 
       if (add_stdcall_alias && strchr (symbol_name, '@'))
         {
          char *exported_name = xstrdup (symbol_name);
          char *atsym = strchr (exported_name, '@');
          *atsym = '\0';
+         /* Note: stdcall alias symbols can never be data. */
          def_exports (exported_name, xstrdup (symbol_name), -1, 0, 0, 0);
        }
     }