winebuild: Support the --main-module option for stand-alone 16-bit modules.

This commit is contained in:
Alexandre Julliard 2009-03-04 14:08:23 +01:00
parent fda642d075
commit a82ce66048
4 changed files with 27 additions and 11 deletions

View File

@ -89,6 +89,7 @@ typedef struct
char *file_name; /* file name of the dll */ char *file_name; /* file name of the dll */
char *dll_name; /* internal name of the dll */ char *dll_name; /* internal name of the dll */
char *init_func; /* initialization routine */ char *init_func; /* initialization routine */
char *main_module; /* main Win32 module for Win16 specs */
SPEC_TYPE type; /* type of dll (Win16/Win32) */ SPEC_TYPE type; /* type of dll (Win16/Win32) */
int base; /* ordinal base */ int base; /* ordinal base */
int limit; /* ordinal limit */ int limit; /* ordinal limit */

View File

@ -82,7 +82,6 @@ char *spec_file_name = NULL;
FILE *output_file = NULL; FILE *output_file = NULL;
const char *output_file_name = NULL; const char *output_file_name = NULL;
static const char *output_file_source_name; static const char *output_file_source_name;
static char *main_module; /* FIXME: to be removed */
char *as_command = NULL; char *as_command = NULL;
char *ld_command = NULL; char *ld_command = NULL;
@ -360,8 +359,7 @@ static char **parse_options( int argc, char **argv, DLLSPEC *spec )
else force_pointer_size = 8; else force_pointer_size = 8;
break; break;
case 'M': case 'M':
spec->type = SPEC_WIN16; spec->main_module = xstrdup( optarg );
main_module = xstrdup( optarg );
break; break;
case 'N': case 'N':
spec->dll_name = xstrdup( optarg ); spec->dll_name = xstrdup( optarg );
@ -586,24 +584,25 @@ int main(int argc, char **argv)
if (spec->subsystem != IMAGE_SUBSYSTEM_NATIVE) if (spec->subsystem != IMAGE_SUBSYSTEM_NATIVE)
spec->characteristics |= IMAGE_FILE_DLL; spec->characteristics |= IMAGE_FILE_DLL;
if (!spec_file_name) fatal_error( "missing .spec file\n" ); if (!spec_file_name) fatal_error( "missing .spec file\n" );
if (spec->type == SPEC_WIN32 && spec->main_module) /* embedded 16-bit module */
{
spec->type = SPEC_WIN16;
load_resources( argv, spec );
if (parse_input_file( spec )) BuildSpec16File( spec );
break;
}
/* fall through */ /* fall through */
case MODE_EXE: case MODE_EXE:
load_resources( argv, spec ); load_resources( argv, spec );
load_import_libs( argv ); load_import_libs( argv );
if (spec_file_name && !parse_input_file( spec )) break; if (spec_file_name && !parse_input_file( spec )) break;
read_undef_symbols( spec, argv );
switch (spec->type) switch (spec->type)
{ {
case SPEC_WIN16: case SPEC_WIN16:
if (!main_module)
{
read_undef_symbols( spec, argv );
output_spec16_file( spec ); output_spec16_file( spec );
}
else
BuildSpec16File( spec );
break; break;
case SPEC_WIN32: case SPEC_WIN32:
read_undef_symbols( spec, argv );
BuildSpec32File( spec ); BuildSpec32File( spec );
break; break;
default: assert(0); default: assert(0);

View File

@ -743,6 +743,16 @@ void add_16bit_exports( DLLSPEC *spec32, DLLSPEC *spec16 )
odp->ordinal = 1; odp->ordinal = 1;
odp->link_name = xstrdup( ".L__wine_spec_dos_header" ); odp->link_name = xstrdup( ".L__wine_spec_dos_header" );
if (spec16->main_module)
{
odp = add_entry_point( spec32 );
odp->type = TYPE_EXTERN;
odp->name = xstrdup( "__wine_spec_main_module" );
odp->lineno = 0;
odp->ordinal = 2;
odp->link_name = xstrdup( ".L__wine_spec_main_module" );
}
assign_names( spec32 ); assign_names( spec32 );
assign_ordinals( spec32 ); assign_ordinals( spec32 );
} }

View File

@ -875,6 +875,12 @@ void output_spec16_file( DLLSPEC *spec16 )
output_exports( spec32 ); output_exports( spec32 );
output_imports( spec16 ); output_imports( spec16 );
output_resources( spec16 ); output_resources( spec16 );
if (spec16->main_module)
{
output( "\n\t%s\n", get_asm_string_section() );
output( ".L__wine_spec_main_module:\n" );
output( "\t%s \"%s\"\n", get_asm_string_keyword(), spec16->main_module );
}
output_gnu_stack_note(); output_gnu_stack_note();
free_dll_spec( spec32 ); free_dll_spec( spec32 );
} }