aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--binutils/ChangeLog6
-rw-r--r--binutils/defparse.y6
-rw-r--r--binutils/dlltool.c36
3 files changed, 41 insertions, 7 deletions
diff --git a/binutils/ChangeLog b/binutils/ChangeLog
index 1767f67..6914410 100644
--- a/binutils/ChangeLog
+++ b/binutils/ChangeLog
@@ -1,3 +1,9 @@
+2001-03-13 Eric Kohl <ekohl@rz-online.de>
+
+ * defparse.y (opt_equal_name): allow "." in name.
+ * dlltool.c (def_exports): Added ability to generate forwarded exports.
+ (gen_exp_file): Likewise.
+
2001-03-12 Stefan Geuken <mail@stefan-geuken.de>
* NEWS: Document addition of -B switch to objcopy.
diff --git a/binutils/defparse.y b/binutils/defparse.y
index 7e13965..d0bccd9 100644
--- a/binutils/defparse.y
+++ b/binutils/defparse.y
@@ -149,6 +149,12 @@ opt_ordinal:
opt_equal_name:
'=' ID { $$ = $2; }
+ | '=' ID '.' ID
+ {
+ char *name = xmalloc (strlen ($2) + 1 + strlen ($4) + 1);
+ sprintf (name, "%s.%s", $2, $4);
+ $$ = name;
+ }
| { $$ = 0; }
;
diff --git a/binutils/dlltool.c b/binutils/dlltool.c
index 9475b98..ca6199a 100644
--- a/binutils/dlltool.c
+++ b/binutils/dlltool.c
@@ -48,9 +48,13 @@
LIBRARY <name> [ , <base> ]
The result is going to be <name>.DLL
- EXPORTS ( <name1> [ = <name2> ] [ @ <integer> ] [ NONAME ] [CONSTANT] [DATA] ) *
+ EXPORTS ( ( ( <name1> [ = <name2> ] )
+ | ( <name1> = <module-name> . <external-name>))
+ [ @ <integer> ] [ NONAME ] [CONSTANT] [DATA] ) *
Declares name1 as an exported symbol from the
- DLL, with optional ordinal number <integer>
+ DLL, with optional ordinal number <integer>.
+ Or declares name1 as an alias (forward) of the function <external-name>
+ in the DLL <module-name>.
IMPORTS ( ( <internal-name> = <module-name> . <integer> )
| ( [ <internal-name> = ] <module-name> . <external-name> )) *
@@ -636,6 +640,7 @@ typedef struct export
int noname;
int data;
int hint;
+ int forward; /* number of forward label, 0 means no forward */
struct export *next;
}
export_type;
@@ -848,6 +853,7 @@ static export_type *d_exports; /*list of exported functions */
static export_type **d_exports_lexically; /* vector of exported functions in alpha order */
static dlist_type *d_list; /* Descriptions */
static dlist_type *a_list; /* Stuff to go in directives */
+static int d_nforwards = 0; /* Number of forwarded exports */
static int d_is_dll;
static int d_is_exe;
@@ -882,6 +888,12 @@ def_exports (name, internal_name, ordinal, noname, constant, data)
p->next = d_exports;
d_exports = p;
d_nfuncs++;
+
+ if ((internal_name != NULL)
+ && (strchr (internal_name, '.') != NULL))
+ p->forward = ++d_nforwards;
+ else
+ p->forward = 0; /* no forward */
}
void
@@ -1819,9 +1831,14 @@ gen_exp_file ()
i++;
}
}
- fprintf (f, "\t%s%s%s%s\t%s %d\n", ASM_RVA_BEFORE,
- ASM_PREFIX,
- exp->internal_name, ASM_RVA_AFTER, ASM_C, exp->ordinal);
+
+ if (exp->forward == 0)
+ fprintf (f, "\t%s%s%s%s\t%s %d\n", ASM_RVA_BEFORE,
+ ASM_PREFIX,
+ exp->internal_name, ASM_RVA_AFTER, ASM_C, exp->ordinal);
+ else
+ fprintf (f, "\t%sf%d%s\t%s %d\n", ASM_RVA_BEFORE,
+ exp->forward, ASM_RVA_AFTER, ASM_C, exp->ordinal);
i++;
}
@@ -1846,8 +1863,13 @@ gen_exp_file ()
fprintf(f,"%s Export Name Table\n", ASM_C);
for (i = 0; (exp = d_exports_lexically[i]); i++)
if (!exp->noname || show_allnames)
- fprintf (f, "n%d: %s \"%s\"\n",
- exp->ordinal, ASM_TEXT, exp->name);
+ {
+ fprintf (f, "n%d: %s \"%s\"\n",
+ exp->ordinal, ASM_TEXT, exp->name);
+ if (exp->forward != 0)
+ fprintf (f, "f%d: %s \"%s\"\n",
+ exp->forward, ASM_TEXT, exp->internal_name);
+ }
if (a_list)
{