diff options
author | DJ Delorie <dj@redhat.com> | 1999-09-28 20:08:37 +0000 |
---|---|---|
committer | DJ Delorie <dj@redhat.com> | 1999-09-28 20:08:37 +0000 |
commit | ce195b4280a718f36c02f316234b79b3f4b3e9e8 (patch) | |
tree | 323f17e4bad2ead69236f1848f6e64e3c9d9a447 /binutils/dlltool.c | |
parent | 13d92f2c5b7ef187dda2518b459751f146128e99 (diff) | |
download | gdb-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.c | 23 |
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); } } |