winegcc: Add option to put a builtin dll signature in the DOS header of PE files.

Signed-off-by: Alexandre Julliard <julliard@winehq.org>
stable
Alexandre Julliard 2019-04-22 11:34:14 +02:00
parent f8fff8b297
commit 11ee7a7051
1 changed files with 30 additions and 0 deletions

View File

@ -205,6 +205,7 @@ struct options
int compile_only; int compile_only;
int force_pointer_size; int force_pointer_size;
int large_address_aware; int large_address_aware;
int wine_builtin;
int unwind_tables; int unwind_tables;
int strip; int strip;
const char* wine_objdir; const char* wine_objdir;
@ -515,6 +516,28 @@ static int check_platform( struct options *opts, const char *file )
return ret; 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 ) static const char *get_multiarch_dir( enum target_cpu cpu )
{ {
switch(cpu) switch(cpu)
@ -1131,6 +1154,8 @@ static void build(struct options* opts)
spawn(opts->prefix, link_args, 0); spawn(opts->prefix, link_args, 0);
strarray_free (link_args); 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 */ /* set the base address with prelink if linker support is not present */
if (opts->prelink && !opts->target) if (opts->prelink && !opts->target)
{ {
@ -1549,6 +1574,11 @@ int main(int argc, char **argv)
opts.large_address_aware = 1; opts.large_address_aware = 1;
continue; continue;
} }
if (!strcmp(Wl->base[j], "--wine-builtin"))
{
opts.wine_builtin = 1;
continue;
}
if (!strcmp(Wl->base[j], "--subsystem") && j < Wl->size - 1) if (!strcmp(Wl->base[j], "--subsystem") && j < Wl->size - 1)
{ {
opts.subsystem = strdup( Wl->base[++j] ); opts.subsystem = strdup( Wl->base[++j] );