Here is a patch which allows Mac OS X to build dlls' and programs' spec.c files. I don't know how you expect it to be, for example regarding #ifdef to be inside or outside (in winebuild) the spec.c file, or if you would like an other way of doing it (using libwine_port or something). So I have done the simplest way - I think it is -, tell me if you'd like core modifications.
On Mac OS X There is no _end symbol. There is a convenience function get_end() to replace it, mainly because of the Mach-O file format. So we have to get the value of get_end at launch time and store it in the nt_header.
Thanks,
Pierre
ChangeLog:
Add Mach-O support for the "_end" symbol using Mac OS X's get_end() function
Index: winebuild/spec32.c =================================================================== RCS file: /home/wine/wine/tools/winebuild/spec32.c,v retrieving revision 1.72 diff -u -r1.72 spec32.c --- winebuild/spec32.c 3 Nov 2003 22:19:44 -0000 1.72 +++ winebuild/spec32.c 19 Nov 2003 20:11:37 -0000 @@ -529,7 +529,10 @@ fprintf( outfile, "}\n" ); fprintf( outfile, "#endif\n" ); +#ifndef __APPLE__ fprintf( outfile, "extern char _end[];\n" ); +#endif + fprintf( outfile, "extern int __wine_spec_data_start[], __wine_spec_exports[];\n\n" ); #ifdef __i386__ @@ -796,7 +799,11 @@ fprintf( outfile, " 0, 0,\n" ); /* Major/MinorImageVersion */ fprintf( outfile, " 4, 0,\n" ); /* Major/MinorSubsystemVersion */ fprintf( outfile, " 0,\n" ); /* Win32VersionValue */ +#ifdef __APPLE__ + fprintf( outfile, " 0,\n" ); +#else fprintf( outfile, " _end,\n" ); /* SizeOfImage */ +#endif fprintf( outfile, " %ld,\n", page_size ); /* SizeOfHeaders */ fprintf( outfile, " 0,\n" ); /* CheckSum */ fprintf( outfile, " 0x%04x,\n", subsystem ); /* Subsystem */ @@ -826,6 +833,10 @@ "{\n" " extern void __wine_dll_register( const struct image_nt_headers *, const char * );\n" " extern void *__wine_dbg_register( char * const *, int );\n" +#ifdef __APPLE__ + " extern void *get_end();\n" + " nt_header.OptionalHeader.SizeOfImage = get_end();\n" +#endif " __wine_dll_register( &nt_header, \"%s\" );\n" "}\n", constructor, dll_file_name );