diff --git a/dlls/ntdll/relay.c b/dlls/ntdll/relay.c index 7316fcff2a3..8c2cad010bb 100644 --- a/dlls/ntdll/relay.c +++ b/dlls/ntdll/relay.c @@ -722,12 +722,11 @@ static BOOL is_register_entry_point( const BYTE *addr ) } else /* check for import thunk */ { - if (addr[0] != 0x50) return FALSE; /* pushl %%eax */ - if (addr[1] != 0x9c) return FALSE; /* pushfl */ - if (addr[2] != 0xe8 || addr[3] || addr[4] || addr[5] || addr[6]) return FALSE; /* call .+0 */ - if (addr[7] != 0x58) return FALSE; /* popl %%eax */ - if (addr[8] != 0x05) return FALSE; /* addl offset,%%eax */ - ptr = addr + 7 + *(const int *)(addr + 9); + if (addr[0] != 0x50) return FALSE; /* pushl %eax */ + if (addr[1] != 0xe8 || addr[2] || addr[3] || addr[4] || addr[5]) return FALSE; /* call .+0 */ + if (addr[6] != 0x58) return FALSE; /* popl %eax */ + if (addr[7] != 0x8b || addr[8] != 0x80) return FALSE; /* movl offset(%eax),%eax */ + ptr = addr + 6 + *(const int *)(addr + 9); } return (*(const char * const*)ptr == (char *)__wine_call_from_32_regs); } diff --git a/tools/winebuild/import.c b/tools/winebuild/import.c index 23b103c6f52..2a9a8a4e849 100644 --- a/tools/winebuild/import.c +++ b/tools/winebuild/import.c @@ -688,7 +688,7 @@ int resolve_imports( DLLSPEC *spec ) /* output a single import thunk */ static void output_import_thunk( FILE *outfile, const char *name, const char *table, int pos ) { - fprintf( outfile, " \"\\t.align %d\\n\"\n", get_alignment(8) ); + fprintf( outfile, " \"\\t.align %d\\n\"\n", get_alignment(4) ); fprintf( outfile, " \"\\t%s\\n\"\n", func_declaration(name) ); fprintf( outfile, " \"\\t.globl %s\\n\"\n", asm_name(name) ); fprintf( outfile, " \"%s:\\n\"\n", asm_name(name) ); @@ -708,17 +708,14 @@ static void output_import_thunk( FILE *outfile, const char *name, const char *ta { /* special case: need to preserve all registers */ fprintf( outfile, " \"\\tpushl %%eax\\n\"\n" ); - fprintf( outfile, " \"\\tpushfl\\n\"\n" ); fprintf( outfile, " \"\\tcall .L__wine_spec_%s\\n\"\n", name ); fprintf( outfile, " \".L__wine_spec_%s:\\n\"\n", name ); fprintf( outfile, " \"\\tpopl %%eax\\n\"\n" ); - fprintf( outfile, " \"\\taddl $%d+%s-.L__wine_spec_%s,%%eax\\n\"\n", - pos, asm_name(table), name ); if (!strcmp( name, "__wine_call_from_16_regs" )) fprintf( outfile, " \"\\t.byte 0x2e\\n\"\n" ); - fprintf( outfile, " \"\\tmovl 0(%%eax),%%eax\\n\"\n" ); - fprintf( outfile, " \"\\txchgl 4(%%esp),%%eax\\n\"\n" ); - fprintf( outfile, " \"\\tpopfl\\n\"\n" ); + fprintf( outfile, " \"\\tmovl %s+%d-.L__wine_spec_%s(%%eax),%%eax\\n\"\n", + asm_name(table), pos, name ); + fprintf( outfile, " \"\\txchgl %%eax,(%%esp)\\n\"\n" ); fprintf( outfile, " \"\\tret\\n\"\n" ); } else @@ -726,11 +723,10 @@ static void output_import_thunk( FILE *outfile, const char *name, const char *ta fprintf( outfile, " \"\\tcall .L__wine_spec_%s\\n\"\n", name ); fprintf( outfile, " \".L__wine_spec_%s:\\n\"\n", name ); fprintf( outfile, " \"\\tpopl %%eax\\n\"\n" ); - fprintf( outfile, " \"\\taddl $%d+%s-.L__wine_spec_%s,%%eax\\n\"\n", - pos, asm_name(table), name ); if (strstr( name, "__wine_call_from_16" )) fprintf( outfile, " \"\\t.byte 0x2e\\n\"\n" ); - fprintf( outfile, " \"\\tjmp *0(%%eax)\\n\"\n" ); + fprintf( outfile, " \"\\tjmp *%s+%d-.L__wine_spec_%s(%%eax)\\n\"\n", + asm_name(table), pos, name ); } } break;