aboutsummaryrefslogtreecommitdiff
path: root/binutils/dlltool.c
diff options
context:
space:
mode:
authorDJ Delorie <dj@redhat.com>1999-09-28 20:08:37 +0000
committerDJ Delorie <dj@redhat.com>1999-09-28 20:08:37 +0000
commitce195b4280a718f36c02f316234b79b3f4b3e9e8 (patch)
tree323f17e4bad2ead69236f1848f6e64e3c9d9a447 /binutils/dlltool.c
parent13d92f2c5b7ef187dda2518b459751f146128e99 (diff)
downloadgdb-ce195b4280a718f36c02f316234b79b3f4b3e9e8.zip
gdb-ce195b4280a718f36c02f316234b79b3f4b3e9e8.tar.gz
gdb-ce195b4280a718f36c02f316234b79b3f4b3e9e8.tar.bz2
* dlltool.c (scan_drectve_symbols): Handle type tags in exported
symbols. (scan_filtered_symbols): Likewise.
Diffstat (limited to 'binutils/dlltool.c')
-rw-r--r--binutils/dlltool.c23
1 files changed, 19 insertions, 4 deletions
diff --git a/binutils/dlltool.c b/binutils/dlltool.c
index 82576ff..0bd6a0e 100644
--- a/binutils/dlltool.c
+++ b/binutils/dlltool.c
@@ -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);
}
}