Here is my second try for a replacement of the _end symbol. I think that since there is no support of it we need a kind of emulation function, which I thought should be located in the wine_port lib. So I add a mach-o.c port file, with the needed function. But should it be done this way?
Also I use the printf positional argument support (%n$x). Hope it is ok, since it might print warning on some compiler.
Thanks,
Pierre.
ChangeLog: Add Mach-O Support for ImageSize in WineLib App's NtHeader.
Index: tools/winebuild/spec32.c =================================================================== RCS file: /home/wine/wine/tools/winebuild/spec32.c,v retrieving revision 1.72 diff -u -r1.72 spec32.c --- tools/winebuild/spec32.c 3 Nov 2003 22:19:44 -0000 1.72 +++ tools/winebuild/spec32.c 22 Nov 2003 21:14:33 -0000 @@ -529,7 +529,12 @@ fprintf( outfile, "}\n" ); fprintf( outfile, "#endif\n" ); +#ifdef __APPLE__ + fprintf( outfile, "static char _end[4];\n" ); +#else fprintf( outfile, "extern char _end[];\n" ); +#endif + fprintf( outfile, "extern int __wine_spec_data_start[], __wine_spec_exports[];\n\n" ); #ifdef __i386__ @@ -826,7 +831,11 @@ "{\n" " extern void __wine_dll_register( const struct image_nt_headers *, const char * );\n" " extern void *__wine_dbg_register( char * const *, int );\n" - " __wine_dll_register( &nt_header, \"%s\" );\n" +#ifdef __APPLE__ + " extern unsigned long wine_dyld_dll_image_size(const char *);\n" + " *((unsigned long *)_end) = dyld_dll_image_size(\"%2$s\");\n" +#endif + " __wine_dll_register( &nt_header, \"%2$s\" );\n" "}\n", constructor, dll_file_name ); } --- /dev/null Sat Nov 22 22:20:41 2003 +++ libs/port/mach-o.c Sat Nov 22 22:22:35 2003 @@ -0,0 +1,56 @@ +/* + * Mach-O compatibility functions + * + * Copyright 2003 Pierre d'Herbemont + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "config.h" +#include "wine/port.h" + +#ifdef __APPLE__ + +#include <strings.h> +#include <mach-o/loader.h> +#include <mach-o/dyld.h> + +/*********************************************************************** + * dyld_dll_image_size + * + * Return the size of the image given its name. + * (Called from the generated spec.c files) + */ +unsigned long dyld_dll_image_size(const char * dllname) +{ + struct mach_header * header; + struct load_command * cmd; + unsigned long i, size = 0; + + for( i=0; i<_dyld_image_count(); i++) + if(strstr(_dyld_get_image_name(i), dllname)) break; + + header = _dyld_get_image_header(i); + cmd = (struct load_command *)((char *)header + sizeof(struct mach_header)); + + for (i = 0; i < header->ncmds; i++) { + size += cmd->cmdsize; + cmd = (struct load_command *)((char *)cmd + cmd->cmdsize); + } + + return size; +} + +#endif /* __APPLE__ */ Index: libs/port/Makefile.in =================================================================== RCS file: /home/wine/wine/libs/port/Makefile.in,v retrieving revision 1.8 diff -u -r1.8 Makefile.in --- libs/port/Makefile.in 12 Nov 2003 03:16:00 -0000 1.8 +++ libs/port/Makefile.in 22 Nov 2003 21:23:25 -0000 @@ -13,6 +13,7 @@ gettid.c \ interlocked.c \ lstat.c \ + mach-o.c \ memcpy_unaligned.c \ memmove.c \ mkstemps.c \