From 04847a4d3e1cf5c5c811f8fbbdeeca498de51dc4 Mon Sep 17 00:00:00 2001 From: Christopher Faylor Date: Wed, 14 Mar 2001 02:56:45 +0000 Subject: [PATCH] * defparse.y (opt_equal_name): allow "." in name. * dlltool.c (def_exports): Added ability to generate forwarded exports. (gen_exp_file): Likewise. --- binutils/ChangeLog | 6 ++++++ binutils/defparse.y | 6 ++++++ binutils/dlltool.c | 36 +++++++++++++++++++++++++++++------- 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 + + * 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 * 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 [ , ] The result is going to be .DLL - EXPORTS ( [ = ] [ @ ] [ NONAME ] [CONSTANT] [DATA] ) * + EXPORTS ( ( ( [ = ] ) + | ( = . )) + [ @ ] [ NONAME ] [CONSTANT] [DATA] ) * Declares name1 as an exported symbol from the - DLL, with optional ordinal number + DLL, with optional ordinal number . + Or declares name1 as an alias (forward) of the function + in the DLL . IMPORTS ( ( = . ) | ( [ = ] . )) * @@ -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) { -- 2.7.4