diff --git a/tools/winegcc/winegcc.c b/tools/winegcc/winegcc.c index 674d1a3ff54..46b67ce8108 100644 --- a/tools/winegcc/winegcc.c +++ b/tools/winegcc/winegcc.c @@ -205,6 +205,7 @@ struct options int compile_only; int force_pointer_size; int large_address_aware; + int wine_builtin; int unwind_tables; int strip; const char* wine_objdir; @@ -515,6 +516,28 @@ static int check_platform( struct options *opts, const char *file ) return ret; } +static void make_wine_builtin( const char *file ) +{ + static const char wine_magic[32] = "Wine builtin DLL"; + int fd; + struct + { + unsigned short e_magic; + unsigned short unused[29]; + unsigned int e_lfanew; + } header; + + if ((fd = open( file, O_RDWR | O_BINARY )) == -1) error( "Failed to add signature to %s\n", file ); + + if (read( fd, &header, sizeof(header) ) == sizeof(header) && !memcmp( &header.e_magic, "MZ", 2 )) + { + if (header.e_lfanew < sizeof(header) + sizeof(wine_magic)) + error( "Not enough space (%x) for Wine signature\n", header.e_lfanew ); + write( fd, wine_magic, sizeof(wine_magic) ); + } + close( fd ); +} + static const char *get_multiarch_dir( enum target_cpu cpu ) { switch(cpu) @@ -1131,6 +1154,8 @@ static void build(struct options* opts) spawn(opts->prefix, link_args, 0); strarray_free (link_args); + if (is_pe && opts->wine_builtin) make_wine_builtin( output_path ); + /* set the base address with prelink if linker support is not present */ if (opts->prelink && !opts->target) { @@ -1549,6 +1574,11 @@ int main(int argc, char **argv) opts.large_address_aware = 1; continue; } + if (!strcmp(Wl->base[j], "--wine-builtin")) + { + opts.wine_builtin = 1; + continue; + } if (!strcmp(Wl->base[j], "--subsystem") && j < Wl->size - 1) { opts.subsystem = strdup( Wl->base[++j] );