From: Jacek Caban jacek@codeweavers.com
--- tools/winebuild/build.h | 4 +++- tools/winebuild/import.c | 16 ++++++++++++++-- tools/winebuild/main.c | 4 +++- tools/winebuild/parser.c | 12 ++++++------ tools/winebuild/spec32.c | 5 ++--- tools/winebuild/utils.c | 2 ++ 6 files changed, 30 insertions(+), 13 deletions(-)
diff --git a/tools/winebuild/build.h b/tools/winebuild/build.h index a469a0e9042..b857e05aa14 100644 --- a/tools/winebuild/build.h +++ b/tools/winebuild/build.h @@ -162,6 +162,7 @@ typedef struct int unicode_app; /* default to unicode entry point */ ORDDEF *entry_points; /* spec entry points */ struct exports exports; /* dll exports */ + struct exports native_exports; /* dll native exports */ struct resource *resources; /* array of dll resources (format differs between Win16/Win32) */ struct apiset apiset; /* list of defined api sets */ } DLLSPEC; @@ -327,7 +328,7 @@ extern void output_bin_resources( DLLSPEC *spec, unsigned int start_rva ); extern void output_spec32_file( DLLSPEC *spec ); extern void output_fake_module( DLLSPEC *spec ); extern void output_data_module( DLLSPEC *spec ); -extern void output_def_file( DLLSPEC *spec, int import_only ); +extern void output_def_file( DLLSPEC *spec, struct exports *exports, int import_only ); extern void output_apiset_lib( DLLSPEC *spec, const struct apiset *apiset ); extern void load_res16_file( const char *name, DLLSPEC *spec ); extern void output_res16_data( DLLSPEC *spec ); @@ -372,6 +373,7 @@ extern int force_pointer_size; extern int unwind_tables; extern int use_dlltool; extern int use_msvcrt; +extern int native_arch; extern int safe_seh; extern int prefer_native; extern int data_only; diff --git a/tools/winebuild/import.c b/tools/winebuild/import.c index 9cefb2afdfe..1ca2048284b 100644 --- a/tools/winebuild/import.c +++ b/tools/winebuild/import.c @@ -1377,19 +1377,31 @@ void output_static_lib( const char *output_name, struct strarray files, int crea /* create a Windows-style import library using dlltool */ static void build_dlltool_import_lib( const char *lib_name, DLLSPEC *spec, struct strarray files ) { + const char *def_file, *native_def_file = NULL; struct strarray args; - char *def_file;
def_file = open_temp_output_file( ".def" ); - output_def_file( spec, 1 ); + output_def_file( spec, &spec->exports, 1 ); fclose( output_file );
+ if (native_arch != -1) + { + native_def_file = open_temp_output_file( ".def" ); + output_def_file( spec, &spec->native_exports, 1 ); + fclose( output_file ); + } + args = find_tool( "dlltool", NULL ); strarray_add( &args, "-k" ); strarray_add( &args, strendswith( lib_name, ".delay.a" ) ? "-y" : "-l" ); strarray_add( &args, lib_name ); strarray_add( &args, "-d" ); strarray_add( &args, def_file ); + if (native_def_file) + { + strarray_add( &args, "-N" ); + strarray_add( &args, native_def_file ); + }
switch (target.cpu) { diff --git a/tools/winebuild/main.c b/tools/winebuild/main.c index 71e61522578..dc2992b5c51 100644 --- a/tools/winebuild/main.c +++ b/tools/winebuild/main.c @@ -36,6 +36,7 @@ int UsePIC = 0; int nb_errors = 0; int display_warnings = 0; +int native_arch = -1; int kill_at = 0; int verbose = 0; int link_ext_symbols = 0; @@ -386,6 +387,7 @@ static void option_callback( int optc, char *optarg ) else if (!strcmp( optarg, "64" )) force_pointer_size = 8; else if (!strcmp( optarg, "no-cygwin" )) use_msvcrt = 1; else if (!strcmp( optarg, "unicode" )) main_spec->unicode_app = 1; + else if (!strcmp( optarg, "arm64x" )) native_arch = CPU_ARM64; else if (!strncmp( optarg, "cpu=", 4 )) cpu_option = xstrdup( optarg + 4 ); else if (!strncmp( optarg, "fpu=", 4 )) fpu_option = xstrdup( optarg + 4 ); else if (!strncmp( optarg, "arch=", 5 )) arch_option = xstrdup( optarg + 5 ); @@ -648,7 +650,7 @@ int main(int argc, char **argv) if (!spec_file_name) fatal_error( "missing .spec file\n" ); if (!parse_input_file( spec )) break; open_output_file(); - output_def_file( spec, 0 ); + output_def_file( spec, &spec->exports, 0 ); close_output_file(); break; case MODE_IMPLIB: diff --git a/tools/winebuild/parser.c b/tools/winebuild/parser.c index 5bd05e97ca9..ec42c240a0a 100644 --- a/tools/winebuild/parser.c +++ b/tools/winebuild/parser.c @@ -943,16 +943,15 @@ static void assign_ordinals( struct exports *exports ) }
-static void assign_exports( DLLSPEC *spec ) +static void assign_exports( DLLSPEC *spec, unsigned int cpu, struct exports *exports ) { - struct exports *exports = &spec->exports; unsigned int i;
exports->entry_points = xmalloc( spec->nb_entry_points * sizeof(*exports->entry_points) ); for (i = 0; i < spec->nb_entry_points; i++) { ORDDEF *entry = &spec->entry_points[i]; - if ((entry->flags & FLAG_CPU_MASK) && !(entry->flags & FLAG_CPU(target.cpu))) + if ((entry->flags & FLAG_CPU_MASK) && !(entry->flags & FLAG_CPU(cpu))) continue; exports->entry_points[exports->nb_entry_points++] = entry; } @@ -1018,7 +1017,7 @@ void add_16bit_exports( DLLSPEC *spec32, DLLSPEC *spec16 ) odp->u.func.nb_args * sizeof(odp->u.func.args[0]) ); }
- assign_exports( spec32 ); + assign_exports( spec32, target.cpu, &spec32->exports ); }
@@ -1061,7 +1060,8 @@ int parse_spec_file( FILE *file, DLLSPEC *spec ) }
current_line = 0; /* no longer parsing the input file */ - assign_exports( spec ); + assign_exports( spec, target.cpu, &spec->exports ); + if (native_arch != -1) assign_exports( spec, native_arch, &spec->native_exports ); return !nb_errors; }
@@ -1303,6 +1303,6 @@ int parse_def_file( FILE *file, DLLSPEC *spec ) }
current_line = 0; /* no longer parsing the input file */ - assign_exports( spec ); + assign_exports( spec, target.cpu, &spec->exports ); return !nb_errors; } diff --git a/tools/winebuild/spec32.c b/tools/winebuild/spec32.c index 857985cb292..718ce4666ef 100644 --- a/tools/winebuild/spec32.c +++ b/tools/winebuild/spec32.c @@ -1343,9 +1343,8 @@ void output_data_module( DLLSPEC *spec ) * * Build a Win32 def file from a spec file. */ -void output_def_file( DLLSPEC *spec, int import_only ) +void output_def_file( DLLSPEC *spec, struct exports *exports, int import_only ) { - struct exports *exports; DLLSPEC *spec32 = NULL; const char *name; int i, total; @@ -1355,8 +1354,8 @@ void output_def_file( DLLSPEC *spec, int import_only ) spec32 = alloc_dll_spec(); add_16bit_exports( spec32, spec ); spec = spec32; + exports = &spec->exports; } - exports = &spec->exports;
if (spec_file_name) output( "; File generated automatically from %s; do not edit!\n\n", diff --git a/tools/winebuild/utils.c b/tools/winebuild/utils.c index 62f05e535b6..05595f86d37 100644 --- a/tools/winebuild/utils.c +++ b/tools/winebuild/utils.c @@ -615,6 +615,7 @@ DLLSPEC *alloc_dll_spec(void) spec->subsystem_minor = 0; spec->dll_characteristics = IMAGE_DLLCHARACTERISTICS_NX_COMPAT | IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE; spec->exports.base = MAX_ORDINALS; + spec->native_exports.base = MAX_ORDINALS; return spec; }
@@ -644,6 +645,7 @@ void free_dll_spec( DLLSPEC *spec ) free( odp->link_name ); } free_exports( &spec->exports ); + free_exports( &spec->native_exports ); free( spec->file_name ); free( spec->dll_name ); free( spec->c_name );