/* add a dll to the list of imports */ void add_import_dll( const char *name, const char *filename ) { struct import *imp = xmalloc( sizeof(*imp) ); imp->spec = alloc_dll_spec(); imp->spec->file_name = get_dll_name( name, filename ); imp->delay = 0; imp->imports = NULL; imp->nb_imports = 0; imp->exports = NULL; imp->nb_exports = 0; if (filename) imp->full_name = xstrdup( filename ); else imp->full_name = find_library( name ); if (read_import_lib( imp )) { dll_imports = xrealloc( dll_imports, (nb_imports+1) * sizeof(*dll_imports) ); dll_imports[nb_imports++] = imp; } else { free_imports( imp ); if (nb_errors) exit(1); } }
/******************************************************************* * output_spec16_file * * Output the complete data for a spec 16-bit file. */ void output_spec16_file( DLLSPEC *spec16 ) { DLLSPEC *spec32 = alloc_dll_spec(); resolve_imports( spec16 ); add_16bit_exports( spec32, spec16 ); output_standard_file_header(); output_module( spec32 ); output_module16( spec16 ); output_stubs( spec16 ); output_exports( spec32 ); output_imports( spec16 ); if (is_undefined( "__wine_call_from_16" )) output_asm_relays16(); if (spec16->main_module) { output( "\n\t%s\n", get_asm_string_section() ); output( ".L__wine_spec_main_module:\n" ); output( "\t%s \"%s\"\n", get_asm_string_keyword(), spec16->main_module ); } output_gnu_stack_note(); free_dll_spec( spec32 ); output("%s:/*?*/\n", asm_name("_end")); }
int main(int argc, char* argv[]) { if (argc <= 1) { printf("wine spec file convert tool\nusage: %s specfile(16bit only) module name\n%s specfile(16bit only) -DEF\n", argv[0], argv[0]); fatal_error("file argument '%s' not allowed in this mode\n", argv[0]); } DLLSPEC *spec = alloc_dll_spec(); spec_file_name = argv[1]; exec_mode = MODE_DLL; spec->type = SPEC_WIN16; spec->file_name = spec_file_name; output_file = stdout; // init_dll_name(spec); if (argc > 2) { if (!strcmp(argv[2], "-DEF")) { exec_mode = MODE_DEF; } else { spec->main_module = xstrdup(argv[2]); spec->dll_name = xstrdup(argv[2]); } } else { init_dll_name(spec); } switch (exec_mode) { case MODE_DEF: if (!spec_file_name) fatal_error("missing .spec file\n"); if (!parse_input_file(spec)) break; output_def_file(spec, 1); break; case MODE_DLL: if (spec->subsystem != IMAGE_SUBSYSTEM_NATIVE) spec->characteristics |= IMAGE_FILE_DLL; /* fall through */ case MODE_EXE: load_resources(argv, spec); load_import_libs(argv); if (spec_file_name && !parse_input_file(spec)) break; if (fake_module) { if (spec->type == SPEC_WIN16) output_fake_module16(spec); else output_fake_module(spec); break; } //read_undef_symbols(spec, argv); switch (spec->type) { case SPEC_WIN16: output_spec16_file(spec); break; case SPEC_WIN32: BuildSpec32File(spec); break; default: assert(0); } break; } if (nb_errors) exit(1); return EXIT_SUCCESS; }
/******************************************************************* * main */ int main(int argc, char **argv) { DLLSPEC *spec = alloc_dll_spec(); #ifdef SIGHUP signal( SIGHUP, exit_on_signal ); #endif signal( SIGTERM, exit_on_signal ); signal( SIGINT, exit_on_signal ); output_file = stdout; argv = parse_options( argc, argv, spec ); switch(exec_mode) { case MODE_DLL: spec->characteristics |= IMAGE_FILE_DLL; load_resources( argv, spec ); load_import_libs( argv ); if (!spec_file_name) fatal_error( "missing .spec file\n" ); if (!parse_input_file( spec )) break; switch (spec->type) { case SPEC_WIN16: if (argv[0]) fatal_error( "file argument '%s' not allowed in this mode\n", argv[0] ); BuildSpec16File( output_file, spec ); break; case SPEC_WIN32: read_undef_symbols( spec, argv ); BuildSpec32File( output_file, spec ); break; default: assert(0); } break; case MODE_EXE: if (spec->type == SPEC_WIN16) fatal_error( "Cannot build 16-bit exe files\n" ); if (!spec->file_name) fatal_error( "executable must be named via the -F option\n" ); load_resources( argv, spec ); load_import_libs( argv ); if (spec_file_name && !parse_input_file( spec )) break; read_undef_symbols( spec, argv ); BuildSpec32File( output_file, spec ); break; case MODE_DEF: if (argv[0]) fatal_error( "file argument '%s' not allowed in this mode\n", argv[0] ); if (spec->type == SPEC_WIN16) fatal_error( "Cannot yet build .def file for 16-bit dlls\n" ); if (!spec_file_name) fatal_error( "missing .spec file\n" ); if (!parse_input_file( spec )) break; BuildDef32File( output_file, spec ); break; case MODE_RELAY16: if (argv[0]) fatal_error( "file argument '%s' not allowed in this mode\n", argv[0] ); BuildRelays16( output_file ); break; case MODE_RELAY32: if (argv[0]) fatal_error( "file argument '%s' not allowed in this mode\n", argv[0] ); BuildRelays32( output_file ); break; default: usage(1); break; } if (nb_errors) exit(1); if (output_file_name) { fclose( output_file ); if (output_file_source_name) assemble_file( output_file_source_name, output_file_name ); output_file_name = NULL; } return 0; }
/******************************************************************* * output_def_file * * Build a Win32 def file from a spec file. */ void output_def_file( DLLSPEC *spec, int include_private ) { DLLSPEC *spec32 = NULL; const char *name; int i, total; if (spec->type == SPEC_WIN16) { spec32 = alloc_dll_spec(); add_16bit_exports( spec32, spec ); spec = spec32; } if (spec_file_name) output( "; File generated automatically from %s; do not edit!\n\n", spec_file_name ); else output( "; File generated automatically; do not edit!\n\n" ); output( "LIBRARY %s\n\n", spec->file_name); output( "EXPORTS\n"); /* Output the exports and relay entry points */ for (i = total = 0; i < spec->nb_entry_points; i++) { const ORDDEF *odp = &spec->entry_points[i]; int is_data = 0; if (!odp) continue; if (odp->name) name = odp->name; else if (odp->export_name) name = odp->export_name; else continue; if (!(odp->flags & FLAG_PRIVATE)) total++; else if (!include_private) continue; if (odp->type == TYPE_STUB) continue; output( " %s", name ); switch(odp->type) { case TYPE_EXTERN: is_data = 1; /* fall through */ case TYPE_VARARGS: case TYPE_CDECL: case TYPE_THISCALL: /* try to reduce output */ if(strcmp(name, odp->link_name) || (odp->flags & FLAG_FORWARD)) output( "=%s", odp->link_name ); break; case TYPE_STDCALL: { int at_param = get_args_size( odp ); if (!kill_at && target_cpu == CPU_x86) output( "@%d", at_param ); if (odp->flags & FLAG_FORWARD) { output( "=%s", odp->link_name ); } else if (strcmp(name, odp->link_name)) /* try to reduce output */ { output( "=%s", odp->link_name ); if (!kill_at && target_cpu == CPU_x86) output( "@%d", at_param ); } break; } default: assert(0); } output( " @%d", odp->ordinal ); if (!odp->name || (odp->flags & FLAG_ORDINAL)) output( " NONAME" ); if (is_data) output( " DATA" ); if (odp->flags & FLAG_PRIVATE) output( " PRIVATE" ); output( "\n" ); } if (!total) warning( "%s: Import library doesn't export anything\n", spec->file_name ); if (spec32) free_dll_spec( spec32 ); }
/******************************************************************* * main */ int main(int argc, char **argv) { DLLSPEC *spec = alloc_dll_spec(); #ifdef SIGHUP signal( SIGHUP, exit_on_signal ); #endif signal( SIGTERM, exit_on_signal ); signal( SIGINT, exit_on_signal ); output_file = stdout; argv = parse_options( argc, argv, spec ); switch(exec_mode) { case MODE_DLL: if (spec->subsystem != IMAGE_SUBSYSTEM_NATIVE) spec->characteristics |= IMAGE_FILE_DLL; /* fall through */ case MODE_EXE: load_resources( argv, spec ); load_import_libs( argv ); if (spec_file_name && !parse_input_file( spec )) break; if (fake_module) { if (spec->type == SPEC_WIN16) output_fake_module16( spec ); else output_fake_module( spec ); break; } read_undef_symbols( spec, argv ); switch (spec->type) { case SPEC_WIN16: output_spec16_file( spec ); break; case SPEC_WIN32: BuildSpec32File( spec ); break; default: assert(0); } break; case MODE_DEF: if (argv[0]) fatal_error( "file argument '%s' not allowed in this mode\n", argv[0] ); if (!spec_file_name) fatal_error( "missing .spec file\n" ); if (!parse_input_file( spec )) break; output_def_file( spec, 1 ); break; case MODE_IMPLIB: if (!spec_file_name) fatal_error( "missing .spec file\n" ); if (!parse_input_file( spec )) break; output_import_lib( spec, argv ); break; case MODE_RESOURCES: load_resources( argv, spec ); output_res_o_file( spec ); break; default: usage(1); break; } if (nb_errors) exit(1); if (output_file_name) { if (fclose( output_file ) < 0) fatal_perror( "fclose" ); if (output_file_source_name) assemble_file( output_file_source_name, output_file_name ); output_file_name = NULL; } return 0; }