Added native mode dll support (based on a patch by Marcus Meissner).
diff --git a/tools/winebuild/build.h b/tools/winebuild/build.h index afb6fd1..c7da34d 100644 --- a/tools/winebuild/build.h +++ b/tools/winebuild/build.h
@@ -53,6 +53,7 @@ typedef enum { SPEC_MODE_DLL, + SPEC_MODE_NATIVE, SPEC_MODE_GUIEXE, SPEC_MODE_CUIEXE, SPEC_MODE_GUIEXE_UNICODE,
diff --git a/tools/winebuild/import.c b/tools/winebuild/import.c index 023f45c..a8f367c 100644 --- a/tools/winebuild/import.c +++ b/tools/winebuild/import.c
@@ -569,6 +569,7 @@ switch (spec->mode) { case SPEC_MODE_DLL: + case SPEC_MODE_NATIVE: break; case SPEC_MODE_GUIEXE: kernel_imports += add_extra_symbol( extras, &count, "GetCommandLineA", spec );
diff --git a/tools/winebuild/main.c b/tools/winebuild/main.c index ce7ff31..615089c 100644 --- a/tools/winebuild/main.c +++ b/tools/winebuild/main.c
@@ -268,6 +268,7 @@ else if (!strcmp( optarg, "cui" )) spec->mode = SPEC_MODE_CUIEXE; else if (!strcmp( optarg, "guiw" )) spec->mode = SPEC_MODE_GUIEXE_UNICODE; else if (!strcmp( optarg, "cuiw" )) spec->mode = SPEC_MODE_CUIEXE_UNICODE; + else if (!strcmp( optarg, "native" )) spec->mode = SPEC_MODE_NATIVE; else usage(1); break; case 'o':
diff --git a/tools/winebuild/spec32.c b/tools/winebuild/spec32.c index 8588e72..994a9b2 100644 --- a/tools/winebuild/spec32.c +++ b/tools/winebuild/spec32.c
@@ -72,6 +72,27 @@ } /******************************************************************* + * declare_weak_function + * + * Output a prototype for a weak function. + */ +static void declare_weak_function( FILE *outfile, const char *name, const char *prototype ) +{ + fprintf( outfile, "#ifdef __GNUC__\n" ); + fprintf( outfile, "# ifdef __APPLE__\n" ); + fprintf( outfile, "extern %s __attribute__((weak_import));\n", prototype ); + fprintf( outfile, "# else\n" ); + fprintf( outfile, "extern %s __attribute__((weak));\n", prototype ); + fprintf( outfile, "# endif\n" ); + fprintf( outfile, "#else\n" ); + fprintf( outfile, "extern %s;\n", prototype ); + fprintf( outfile, "static void __asm__dummy_%s(void)", name ); + fprintf( outfile, " { asm(\".weak " __ASM_NAME("%s") "\"); }\n", name ); + fprintf( outfile, "#endif\n\n" ); +} + + +/******************************************************************* * output_debug * * Output the debug channels. @@ -559,17 +580,8 @@ fprintf( outfile, "extern int __stdcall %s( void*, unsigned int, void* );\n\n", init_func ); else { - fprintf( outfile, "#ifdef __GNUC__\n" ); - fprintf( outfile, "# ifdef __APPLE__\n" ); - fprintf( outfile, "extern int __stdcall DllMain( void*, unsigned int, void* ) __attribute__((weak_import));\n" ); - fprintf( outfile, "# else\n" ); - fprintf( outfile, "extern int __stdcall DllMain( void*, unsigned int, void* ) __attribute__((weak));\n" ); - fprintf( outfile, "# endif\n" ); - fprintf( outfile, "#else\n" ); - fprintf( outfile, "extern int __stdcall DllMain( void*, unsigned int, void* );\n" ); - fprintf( outfile, "static void __asm__dummy_dllmain(void)" ); - fprintf( outfile, " { asm(\".weak " __ASM_NAME("DllMain") "\"); }\n" ); - fprintf( outfile, "#endif\n\n" ); + declare_weak_function( outfile, "DllMain", + "int __stdcall DllMain( void*, unsigned int, void* )" ); init_func = "DllMain"; } fprintf( outfile, @@ -586,6 +598,29 @@ init_func = "__wine_dll_main"; characteristics = IMAGE_FILE_DLL; break; + case SPEC_MODE_NATIVE: + if (init_func) + fprintf( outfile, "extern int __stdcall %s( void*, void* );\n\n", init_func ); + else + { + declare_weak_function( outfile, "DriverEntry", + "int __stdcall DriverEntry( void*, void* )" ); + init_func = "DriverEntry"; + } + fprintf( outfile, + "static int __stdcall __wine_driver_entry( void *obj, void *path )\n" + "{\n" + " int ret;\n" + " if (reason == %d && __wine_spec_init_state == 1)\n" + " _init( __wine_main_argc, __wine_main_argv, __wine_main_environ );\n" + " ret = %s ? %s( obj, path ) : 0;\n" + " if (reason == %d && __wine_spec_init_state == 1) _fini();\n" + " return ret;\n" + "}\n", + DLL_PROCESS_ATTACH, init_func, init_func, DLL_PROCESS_DETACH ); + init_func = "__wine_driver_entry"; + subsystem = IMAGE_SUBSYSTEM_NATIVE; + break; case SPEC_MODE_GUIEXE: case SPEC_MODE_GUIEXE_UNICODE: if (!init_func) init_func = "WinMain";
diff --git a/tools/winebuild/winebuild.man.in b/tools/winebuild/winebuild.man.in index ffd80cd..2e8a203 100644 --- a/tools/winebuild/winebuild.man.in +++ b/tools/winebuild/winebuild.man.in
@@ -145,7 +145,10 @@ for a command line Unicode executable, .br .B guiw -for a graphical Unicode executable. +for a graphical Unicode executable, +.br +.B native +for a native-mode dll. .br A command line executable entry point is a normal C \fBmain\fR function. A graphical executable has a \fBWinMain\fR entry point