diff options
-rw-r--r-- | binutils/ChangeLog | 6 | ||||
-rw-r--r-- | binutils/defparse.y | 6 | ||||
-rw-r--r-- | 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 <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) { |