winebuild: Store wine_ldt_copy pointer in the NE header at load time.

Avoids having to import libwine from 16-bit modules.

Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Alexandre Julliard 2019-05-17 16:46:00 +02:00
parent 075e561f5c
commit 7b494f13e7
3 changed files with 7 additions and 11 deletions

View File

@ -921,6 +921,7 @@ static HMODULE16 NE_DoLoadBuiltinModule( const IMAGE_DOS_HEADER *mz_header, cons
} }
patch_code_segment( pModule ); patch_code_segment( pModule );
*(void **)mz_header->e_res2 = &wine_ldt_copy;
return hInstance; return hInstance;
} }

View File

@ -156,12 +156,10 @@ static void BuildCallFrom16Core( int reg_func, int thunk )
output( "\tandl $0xfff8, %%edx\n" ); output( "\tandl $0xfff8, %%edx\n" );
output( "\tshrl $1, %%edx\n" ); output( "\tshrl $1, %%edx\n" );
if (UsePIC) if (UsePIC)
{ output( "\taddl .Lwine_ldt_copy_ptr-1b(%%ecx),%%edx\n" );
output( "\taddl wine_ldt_copy_ptr-1b(%%ecx),%%edx\n" );
output( "\tmovl (%%edx), %%edx\n" );
}
else else
output( "\tmovl %s(%%edx), %%edx\n", asm_name("wine_ldt_copy") ); output( "\taddl .Lwine_ldt_copy_ptr,%%edx\n" );
output( "\tmovl (%%edx), %%edx\n" );
output( "\tmovzwl %%sp, %%ebp\n" ); output( "\tmovzwl %%sp, %%ebp\n" );
output( "\tleal %d(%%ebp,%%edx), %%edx\n", reg_func ? 0 : -4 ); output( "\tleal %d(%%ebp,%%edx), %%edx\n", reg_func ? 0 : -4 );

View File

@ -355,11 +355,11 @@ static void output_call16_function( ORDDEF *odp )
if (UsePIC) if (UsePIC)
{ {
output( "\tcall %s\n", asm_name("__wine_spec_get_pc_thunk_eax") ); output( "\tcall %s\n", asm_name("__wine_spec_get_pc_thunk_eax") );
output( "1:\tmovl wine_ldt_copy_ptr-1b(%%eax),%%esi\n" ); output( "1:\tmovl .Lwine_ldt_copy_ptr-1b(%%eax),%%esi\n" );
needs_get_pc_thunk = 1; needs_get_pc_thunk = 1;
} }
else else
output( "\tmovl $%s,%%esi\n", asm_name("wine_ldt_copy") ); output( "\tmovl .Lwine_ldt_copy_ptr,%%esi\n" );
} }
/* preserve 16-byte stack alignment */ /* preserve 16-byte stack alignment */
@ -584,7 +584,7 @@ static void output_module16( DLLSPEC *spec )
output( "\t.short 0,0,0,0\n" ); /* e_res */ output( "\t.short 0,0,0,0\n" ); /* e_res */
output( "\t.short 0\n" ); /* e_oemid */ output( "\t.short 0\n" ); /* e_oemid */
output( "\t.short 0\n" ); /* e_oeminfo */ output( "\t.short 0\n" ); /* e_oeminfo */
output( "\t.short 0,0,0,0,0,0,0,0,0,0\n" ); /* e_res2 */ output( ".Lwine_ldt_copy_ptr:\t.long 0,0,0,0,0\n" ); /* e_res2, used for ldt_copy */
output( "\t.long .L__wine_spec_ne_header-.L__wine_spec_dos_header\n" );/* e_lfanew */ output( "\t.long .L__wine_spec_ne_header-.L__wine_spec_dos_header\n" );/* e_lfanew */
output( ".L__wine_spec_ne_header:\n" ); output( ".L__wine_spec_ne_header:\n" );
@ -794,9 +794,6 @@ static void output_module16( DLLSPEC *spec )
output( "\n/* relay functions */\n\n" ); output( "\n/* relay functions */\n\n" );
output( "\t.text\n" ); output( "\t.text\n" );
for ( i = 0; i < nb_funcs; i++ ) output_call16_function( typelist[i] ); for ( i = 0; i < nb_funcs; i++ ) output_call16_function( typelist[i] );
output( "\t.data\n" );
output( "wine_ldt_copy_ptr:\n" );
output( "\t.long %s\n", asm_name("wine_ldt_copy") );
} }
free( typelist ); free( typelist );