Thanks Alexandre for the last patch you did regarding Mac OS X Support. Here is a fix for a typo mistake: "mctr" should be "mtctr" on the Assembly PowerPC Code. There is also the part of my patch you didn't integrate in yours: the support for the .text section and the .space section of Darwin's ld.
Thanks,
Pierre
ChangeLog:
Change mctr PowerPC asm instruction to mtctr. Add Support for the .text section and the .space section of darwin's ld.
? tools/winebuild/.DS_Store Index: tools/winebuild/build.h =================================================================== RCS file: /home/wine/wine/tools/winebuild/build.h,v retrieving revision 1.47 diff -u -r1.47 build.h --- tools/winebuild/build.h 3 Oct 2003 03:35:20 -0000 1.47 +++ tools/winebuild/build.h 23 Oct 2003 14:15:50 -0000 @@ -124,6 +124,18 @@ #define MAX_ORDINALS 65535 +#ifdef __APPLE__ +# define LD_SECTION_TEXT ".text" +# define LD_SKIP(i) ".space " #i +#endif /* __APPLE__ */ + +#ifndef LD_SECTION_TEXT +# define LD_SECTION_TEXT ".section \\\".text\\\"" +#endif +#ifndef LD_SKIP +# define LD_SKIP(i) ".skip " #i +#endif + /* global functions */ #ifndef __GNUC__ Index: tools/winebuild/import.c =================================================================== RCS file: /home/wine/wine/tools/winebuild/import.c,v retrieving revision 1.52 diff -u -r1.52 import.c --- tools/winebuild/import.c 13 Aug 2003 21:57:42 -0000 1.52 +++ tools/winebuild/import.c 23 Oct 2003 14:15:52 -0000 @@ -852,7 +852,7 @@ fprintf(outfile, "\t\"\\tlis %s, " ppc_high(__ASM_NAME("imports") "+ %d") "\\n\"\n", ppc_reg[9], pos); fprintf(outfile, "\t\"\\tla %s, " ppc_low (__ASM_NAME("imports") "+ %d") "(%s)\\n\"\n", ppc_reg[8], pos, ppc_reg[9]); fprintf(outfile, "\t\"\\tlwz %s, 0(%s)\\n\"\n", ppc_reg[7], ppc_reg[8]); - fprintf(outfile, "\t\"\\tmctr %s\\n\"\n", ppc_reg[7]); + fprintf(outfile, "\t\"\\tmtctr %s\\n\"\n", ppc_reg[7]); fprintf(outfile, "\t\"\\tlwz %s, 0(%s)\\n\"\n", ppc_reg[7], ppc_reg[1]); fprintf(outfile, "\t\"\\taddi %s, %s, 0x4\\n\"\n", ppc_reg[1], ppc_reg[1]); @@ -868,7 +868,7 @@ } pos += 4; } - fprintf( outfile, "\".section\\t\\\".text\\\"\");\n#ifndef __GNUC__\n}\n#endif\n\n" ); + fprintf( outfile, "\"" LD_SECTION_TEXT "\");\n#ifndef __GNUC__\n}\n#endif\n\n" ); done: return nb_imm; @@ -1142,7 +1142,7 @@ fprintf( outfile, "\n" ); } } - fprintf( outfile, "\".section \\\".text\\\"\");\n" ); + fprintf( outfile, "\"" LD_SECTION_TEXT "\");\n" ); fprintf( outfile, "#ifndef __GNUC__\n" ); fprintf( outfile, "}\n" ); fprintf( outfile, "#endif\n" ); Index: tools/winebuild/spec32.c =================================================================== RCS file: /home/wine/wine/tools/winebuild/spec32.c,v retrieving revision 1.69 diff -u -r1.69 spec32.c --- tools/winebuild/spec32.c 26 Sep 2003 04:36:46 -0000 1.69 +++ tools/winebuild/spec32.c 23 Oct 2003 14:15:54 -0000 @@ -434,7 +434,24 @@ fprintf( outfile, " \"\\tnop\\n\"\n" ); fprintf( outfile, " \"\\t.section\\t\\\".text\\\"\\n\");\n" ); } -#elif defined(__PPC__) +#elif defined(__powerpc__) +# ifdef __APPLE__ +/* Mach-O doesn't have an init section */ + if (constructor) + { + fprintf( outfile, "asm(\"\\t.mod_init_func\\n\"\n" ); + fprintf( outfile, " \"\\t.align 2\\n\"\n" ); + fprintf( outfile, " \"\\t.long " __ASM_NAME("%s") "\\n\"\n", constructor ); + fprintf( outfile, " \"\\t.text\\n\");\n" ); + } + if (destructor) + { + fprintf( outfile, "asm(\"\\t.mod_term_func\\n\"\n" ); + fprintf( outfile, " \"\\t.align 2\\n\"\n" ); + fprintf( outfile, " \"\\t.long " __ASM_NAME("%s") "\\n\"\n", destructor ); + fprintf( outfile, " \"\\t.text\\n\");\n" ); + } +# else /* __APPLE__ */ if (constructor) { fprintf( outfile, "asm(\"\\t.section\\t\\\".init\\\" ,\\\"ax\\\"\\n\"\n" ); @@ -447,6 +464,7 @@ fprintf( outfile, " \"\\tbl " __ASM_NAME("%s") "\\n\"\n", destructor ); fprintf( outfile, " \"\\t.section\\t\\\".text\\\"\\n\");\n" ); } +# endif /* __APPLE__ */ #else #error You need to define the DLL constructor for your architecture #endif @@ -495,9 +513,9 @@ fprintf( outfile, "#ifndef __GNUC__\n" ); fprintf( outfile, "static void __asm__dummy_header(void) {\n" ); fprintf( outfile, "#endif\n" ); - fprintf( outfile, "asm(\".section \\\".text\\\"\\n\\t\"\n" ); + fprintf( outfile, "asm(\"" LD_SECTION_TEXT "\\n\\t\"\n" ); fprintf( outfile, " \".align %d\\n\"\n", get_alignment(page_size) ); - fprintf( outfile, " \"" __ASM_NAME("pe_header") ":\\t.skip 65536\\n\\t\");\n" ); + fprintf( outfile, " \"" __ASM_NAME("pe_header") ":\\t" LD_SKIP(65536) "\\n\\t\");\n" ); fprintf( outfile, "#ifndef __GNUC__\n" ); fprintf( outfile, "}\n" ); fprintf( outfile, "#endif\n" ); @@ -551,7 +569,11 @@ else { fprintf( outfile, "#ifdef __GNUC__\n" ); + fprintf( outfile, "# ifdef __APPLE__\n" ); + fprintf( outfile, "extern void DllMain() __attribute__((weak_import));\n" ); + fprintf( outfile, "# else\n" ); fprintf( outfile, "extern void DllMain() __attribute__((weak));\n" ); + fprintf( outfile, "# endif\n" ); fprintf( outfile, "#else\n" ); fprintf( outfile, "extern void DllMain();\n" ); fprintf( outfile, "static void __asm__dummy_dllmain(void)" ); @@ -741,8 +763,13 @@ fprintf( outfile, " } OptionalHeader;\n" ); fprintf( outfile, "} nt_header = {\n" ); fprintf( outfile, " 0x%04x,\n", IMAGE_NT_SIGNATURE ); /* Signature */ - +#ifdef __i386__ fprintf( outfile, " { 0x%04x,\n", IMAGE_FILE_MACHINE_I386 ); /* Machine */ +#elif defined(__powerpc__) + fprintf( outfile, " { 0x%04x,\n", IMAGE_FILE_MACHINE_POWERPC ); /* Machine */ +#else + fprintf( outfile, " { 0x%04x,\n", IMAGE_FILE_MACHINE_UNKNOWN ); /* Machine */ +#endif fprintf( outfile, " 0, 0, 0, 0,\n" ); fprintf( outfile, " sizeof(nt_header.OptionalHeader),\n" ); /* SizeOfOptionalHeader */ fprintf( outfile, " 0x%04x },\n", characteristics ); /* Characteristics */ @@ -923,12 +950,12 @@ 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(__PPC__) +#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.section\\t\\\".text\\\"\\n\");\n" ); + fprintf( outfile, " \"\\t" LD_SECTION_TEXT "\\n\");\n" ); #else #error You need to define the DLL constructor for your architecture #endif