Some more OpenBSD work: the attribute((constructor)) syntax works on OBSD3.4, but the inline-asm syntax doesn't. I noticed that another part of sped32.c was almost identical but already contained the fix I was making to output_dll_init(), so I combined the two stretches of code into one. Changelog: Use the GCC attribute((constructor)) syntax for DLL initializer hooks if possible, instead of the inline-asm syntax. diff --recursive orig/wine-20031212/tools/winebuild/spec32.c wine-20031212/tools/winebuild/spec32.c --- orig/wine-20031212/tools/winebuild/spec32.c Mon Nov 3 14:19:44 2003 +++ wine-20031212/tools/winebuild/spec32.c Thu Jan 1 15:14:25 2004 @@ -410,7 +410,6 @@ { fprintf( outfile, "#ifndef __GNUC__\n" ); fprintf( outfile, "static void __asm__dummy_dll_init(void) {\n" ); - fprintf( outfile, "#endif\n" ); #if defined(__i386__) if (constructor) @@ -472,11 +471,18 @@ } # endif /* __APPLE__ */ #else -#error You need to define the DLL constructor for your architecture + fprintf( outfile, "#error You need to define the DLL constructor for your architecture\n" ); #endif - fprintf( outfile, "#ifndef __GNUC__\n" ); fprintf( outfile, "}\n" ); + fprintf( outfile, "#else\n" ); + if (constructor) + fprintf( outfile, "static void %s(void) __attribute__((constructor));\n", + constructor ); + if (destructor) + fprintf( outfile, "static void %s(void) __attribute__((destructor));\n", + destructor ); fprintf( outfile, "#endif\n" ); + fprintf( outfile, "\n\n" ); } @@ -822,7 +828,7 @@ output_dll_init( outfile, constructor, NULL ); fprintf( outfile, - "void %s(void)\n" + "static void %s(void)\n" "{\n" " extern void __wine_dll_register( const struct image_nt_headers *, const char * );\n" " extern void *__wine_dbg_register( char * const *, int );\n" @@ -915,6 +921,7 @@ { int nr_debug; char *prefix, *p; + char constructor[100], destructor[100]; while (*argv) { @@ -939,42 +946,13 @@ else prefix = xstrdup( "_" ); /* Output the DLL constructor */ + + snprintf( constructor, 100, "__wine_dbg_%s_init", prefix ); + snprintf( destructor, 100, "__wine_dbg_%s_fini", prefix ); + output_dll_init( outfile, constructor, destructor ); fprintf( outfile, "#ifdef __GNUC__\n" - "static void __wine_dbg_%s_init(void) __attribute__((constructor));\n" - "static void __wine_dbg_%s_fini(void) __attribute__((destructor));\n" - "#else\n" - "static void __asm__dummy_dll_init(void) {\n", - prefix, prefix ); - -#if defined(__i386__) - fprintf( outfile, "asm(\"\\t.section\\t\\\".init\\\" ,\\\"ax\\\"\\n\"\n" ); - fprintf( outfile, " \"\\tcall " __ASM_NAME("__wine_dbg_%s_init") "\\n\"\n", prefix ); - fprintf( outfile, " \"\\t.section\\t\\\".fini\\\" ,\\\"ax\\\"\\n\"\n" ); - fprintf( outfile, " \"\\tcall " __ASM_NAME("__wine_dbg_%s_fini") "\\n\"\n", prefix ); - fprintf( outfile, " \"\\t.section\\t\\\".text\\\"\\n\");\n" ); -#elif defined(__sparc__) - fprintf( outfile, "asm(\"\\t.section\\t\\\".init\\\" ,\\\"ax\\\"\\n\"\n" ); - fprintf( outfile, " \"\\tcall " __ASM_NAME("__wine_dbg_%s_init") "\\n\"\n", prefix ); - fprintf( outfile, " \"\\tnop\\n\"\n" ); - fprintf( outfile, " \"\\t.section\\t\\\".fini\\\" ,\\\"ax\\\"\\n\"\n" ); - fprintf( outfile, " \"\\tcall " __ASM_NAME("__wine_dbg_%s_fini") "\\n\"\n", prefix ); - fprintf( outfile, " \"\\tnop\\n\"\n" ); - fprintf( outfile, " \"\\t.section\t\\\".text\\\"\\n\");\n" ); -#elif defined(__powerpc__) - fprintf( outfile, "asm(\"\\t.section\\t\\\".init\\\" ,\\\"ax\\\"\\n\"\n" ); - fprintf( outfile, " \"\\tbl " __ASM_NAME("__wine_dbg_%s_init") "\\n\"\n", prefix ); - fprintf( outfile, " \"\\t.section\\t\\\".fini\\\" ,\\\"ax\\\"\\n\"\n" ); - fprintf( outfile, " \"\\tbl " __ASM_NAME("__wine_dbg_%s_fini") "\\n\"\n", prefix ); - fprintf( outfile, " \"\\t.text\\n\");\n" ); -#else -#error You need to define the DLL constructor for your architecture -#endif - fprintf( outfile, "}\n#endif /* defined(__GNUC__) */\n" ); - - fprintf( outfile, - "\n#ifdef __GNUC__\n" "static\n" "#endif\n" "void __wine_dbg_%s_init(void)\n" [EOF]