winebuild: Add a -ordinal flag for entry points that must be imported by ordinal but exported by name.

This commit is contained in:
Alexandre Julliard 2007-10-26 12:47:40 +02:00
parent 8170acfc35
commit 3243311214
4 changed files with 27 additions and 10 deletions

View File

@ -124,15 +124,16 @@ extern enum target_platform target_platform;
/* entry point flags */
#define FLAG_NORELAY 0x01 /* don't use relay debugging for this function */
#define FLAG_NONAME 0x02 /* don't import function by name */
#define FLAG_NONAME 0x02 /* don't export function by name */
#define FLAG_RET16 0x04 /* function returns a 16-bit value */
#define FLAG_RET64 0x08 /* function returns a 64-bit value */
#define FLAG_I386 0x10 /* function is i386 only */
#define FLAG_REGISTER 0x20 /* use register calling convention */
#define FLAG_PRIVATE 0x40 /* function is private (cannot be imported) */
#define FLAG_ORDINAL 0x80 /* function should be imported by ordinal */
#define FLAG_FORWARD 0x80 /* function is a forwarded name */
#define FLAG_EXT_LINK 0x100 /* function links to an external symbol */
#define FLAG_FORWARD 0x100 /* function is a forwarded name */
#define FLAG_EXT_LINK 0x200 /* function links to an external symbol */
#define MAX_ORDINALS 65535

View File

@ -70,6 +70,7 @@ static const char * const FlagNames[] =
"i386", /* FLAG_I386 */
"register", /* FLAG_REGISTER */
"private", /* FLAG_PRIVATE */
"ordinal", /* FLAG_ORDINAL */
NULL
};
@ -545,11 +546,14 @@ static int parse_spec_ordinal( int ordinal, DLLSPEC *spec )
}
}
if (!strcmp( odp->name, "@" ) || odp->flags & FLAG_NONAME)
if (!strcmp( odp->name, "@" ) || odp->flags & (FLAG_NONAME | FLAG_ORDINAL))
{
if (ordinal == -1)
{
error( "Nameless function needs an explicit ordinal number\n" );
if (!strcmp( odp->name, "@" ))
error( "Nameless function needs an explicit ordinal number\n" );
else
error( "Function imported by ordinal needs an explicit ordinal number\n" );
goto error;
}
if (spec->type != SPEC_WIN32)
@ -557,9 +561,16 @@ static int parse_spec_ordinal( int ordinal, DLLSPEC *spec )
error( "Nameless functions not supported for Win16\n" );
goto error;
}
if (!strcmp( odp->name, "@" )) free( odp->name );
else odp->export_name = odp->name;
odp->name = NULL;
if (!strcmp( odp->name, "@" ))
{
free( odp->name );
odp->name = NULL;
}
else if (!(odp->flags & FLAG_ORDINAL)) /* -ordinal only affects the import library */
{
odp->export_name = odp->name;
odp->name = NULL;
}
}
return 1;

View File

@ -552,7 +552,7 @@ void BuildDef32File( DLLSPEC *spec )
assert(0);
}
output( " @%d", odp->ordinal );
if (!odp->name) output( " NONAME" );
if (!odp->name || (odp->flags & FLAG_ORDINAL)) output( " NONAME" );
if (is_data) output( " DATA" );
if (odp->flags & FLAG_PRIVATE) output( " PRIVATE" );
output( "\n" );

View File

@ -260,7 +260,8 @@ The entry point is not displayed in relay debugging traces (Win32
only).
.TP
.B -noname
The entry point will be imported by ordinal instead of by name.
The entry point will be exported by ordinal instead of by name. The
name is still available for importing.
.TP
.B -ret16
The function returns a 16-bit value (Win16 only).
@ -277,6 +278,10 @@ The function uses CPU register to pass arguments.
.B -private
The function cannot be imported from other dlls, it can only be
accessed through GetProcAddress.
.TP
.B -ordinal
The entry point will be imported by ordinal instead of by name. The
name is still exported.
.SS "Function ordinals"
Syntax:
.br