Winebuild vendor drop Added: vendor/wine/tools/winebuild/current/ Added: vendor/wine/tools/winebuild/current/CVS/ Added: vendor/wine/tools/winebuild/current/CVS/Entries Added: vendor/wine/tools/winebuild/current/CVS/Repository Added: vendor/wine/tools/winebuild/current/CVS/Root Added: vendor/wine/tools/winebuild/current/CVS/Tag Added: vendor/wine/tools/winebuild/current/Makefile.in Added: vendor/wine/tools/winebuild/current/build.h Added: vendor/wine/tools/winebuild/current/import.c Added: vendor/wine/tools/winebuild/current/main.c Added: vendor/wine/tools/winebuild/current/parser.c Added: vendor/wine/tools/winebuild/current/relay.c Added: vendor/wine/tools/winebuild/current/res16.c Added: vendor/wine/tools/winebuild/current/res32.c Added: vendor/wine/tools/winebuild/current/spec16.c Added: vendor/wine/tools/winebuild/current/spec32.c Added: vendor/wine/tools/winebuild/current/utils.c Added: vendor/wine/tools/winebuild/current/winebuild.man.in _____
Added: vendor/wine/tools/winebuild/current/CVS/Entries --- vendor/wine/tools/winebuild/current/CVS/Entries 2005-02-14 16:14:12 UTC (rev 13564) +++ vendor/wine/tools/winebuild/current/CVS/Entries 2005-02-14 16:16:27 UTC (rev 13565) @@ -0,0 +1,14 @@
+/.cvsignore/1.2/Mon Feb 14 16:13:00 2005//TWine-20050211 +/Makefile.in/1.17/Mon Feb 14 16:13:00 2005//TWine-20050211 +/build.h/1.54/Mon Feb 14 16:13:00 2005//TWine-20050211 +/import.c/1.72/Mon Feb 14 16:13:00 2005//TWine-20050211 +/main.c/1.59/Mon Feb 14 16:13:00 2005//TWine-20050211 +/parser.c/1.55/Mon Feb 14 16:13:00 2005//TWine-20050211 +/relay.c/1.35/Mon Feb 14 16:13:00 2005//TWine-20050211 +/res16.c/1.12/Mon Feb 14 16:13:00 2005//TWine-20050211 +/res32.c/1.16/Mon Feb 14 16:13:00 2005//TWine-20050211 +/spec16.c/1.49/Mon Feb 14 16:13:00 2005//TWine-20050211 +/spec32.c/1.85/Mon Feb 14 16:13:00 2005//TWine-20050211 +/utils.c/1.20/Mon Feb 14 16:13:00 2005//TWine-20050211 +/winebuild.man.in/1.28/Mon Feb 14 16:13:00 2005//TWine-20050211 +D _____
Added: vendor/wine/tools/winebuild/current/CVS/Repository --- vendor/wine/tools/winebuild/current/CVS/Repository 2005-02-14 16:14:12 UTC (rev 13564) +++ vendor/wine/tools/winebuild/current/CVS/Repository 2005-02-14 16:16:27 UTC (rev 13565) @@ -0,0 +1 @@
+wine/tools/winebuild _____
Added: vendor/wine/tools/winebuild/current/CVS/Root --- vendor/wine/tools/winebuild/current/CVS/Root 2005-02-14 16:14:12 UTC (rev 13564) +++ vendor/wine/tools/winebuild/current/CVS/Root 2005-02-14 16:16:27 UTC (rev 13565) @@ -0,0 +1 @@
+:pserver:cvs@cvs.winehq.com:2401/home/wine _____
Added: vendor/wine/tools/winebuild/current/CVS/Tag --- vendor/wine/tools/winebuild/current/CVS/Tag 2005-02-14 16:14:12 UTC (rev 13564) +++ vendor/wine/tools/winebuild/current/CVS/Tag 2005-02-14 16:16:27 UTC (rev 13565) @@ -0,0 +1 @@
+NWine-20050211 _____
Added: vendor/wine/tools/winebuild/current/Makefile.in --- vendor/wine/tools/winebuild/current/Makefile.in 2005-02-14 16:14:12 UTC (rev 13564) +++ vendor/wine/tools/winebuild/current/Makefile.in 2005-02-14 16:16:27 UTC (rev 13565) @@ -0,0 +1,42 @@
+TOPSRCDIR = @top_srcdir@ +TOPOBJDIR = ../.. +SRCDIR = @srcdir@ +VPATH = @srcdir@ +EXEEXT = @EXEEXT@ + +PROGRAMS = winebuild$(EXEEXT) +MODULE = none + +C_SRCS = \ + import.c \ + main.c \ + parser.c \ + relay.c \ + res16.c \ + res32.c \ + spec16.c \ + spec32.c \ + utils.c + +all: $(PROGRAMS) winebuild.man + +@MAKE_RULES@ + +winebuild$(EXEEXT): $(OBJS) + $(CC) $(CFLAGS) -o $@ $(OBJS) $(LIBPORT) $(LDFLAGS) + +winebuild.man: winebuild.man.in + sed -e 's,@PACKAGE_STRING@,@PACKAGE_STRING@,g' $(SRCDIR)/winebuild.man.in >$@ || ($(RM) $@ && false) + +install:: $(PROGRAMS) winebuild.man + $(MKINSTALLDIRS) $(bindir) $(mandir)/man$(prog_manext) + $(INSTALL_PROGRAM) winebuild$(EXEEXT) $(bindir)/winebuild$(EXEEXT) + $(INSTALL_DATA) winebuild.man $(mandir)/man$(prog_manext)/winebuild.$(prog_manext) + +uninstall:: + $(RM) $(bindir)/winebuild$(EXEEXT) $(mandir)/man$(prog_manext)/winebuild.$(prog_manext) + +clean:: + $(RM) winebuild.man + +### Dependencies: Property changes on: vendor/wine/tools/winebuild/current/Makefile.in ___________________________________________________________________ Name: svn:keywords + Author Date Id Revision Name: svn:eol-style + native _____
Added: vendor/wine/tools/winebuild/current/build.h --- vendor/wine/tools/winebuild/current/build.h 2005-02-14 16:14:12 UTC (rev 13564) +++ vendor/wine/tools/winebuild/current/build.h 2005-02-14 16:16:27 UTC (rev 13565) @@ -0,0 +1,212 @@
+/* + * Copyright 1993 Robert J. Amstadt + * Copyright 1995 Martin von Loewis + * Copyright 1995, 1996, 1997 Alexandre Julliard + * Copyright 1997 Eric Youngdale + * Copyright 1999 Ulrich Weigand + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef __WINE_BUILD_H +#define __WINE_BUILD_H + +#ifndef __WINE_CONFIG_H +# error You must include config.h to use this header +#endif + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +typedef enum +{ + TYPE_VARIABLE, /* variable */ + TYPE_PASCAL, /* pascal function (Win16) */ + TYPE_ABS, /* absolute value (Win16) */ + TYPE_STUB, /* unimplemented stub */ + TYPE_STDCALL, /* stdcall function (Win32) */ + TYPE_CDECL, /* cdecl function (Win32) */ + TYPE_VARARGS, /* varargs function (Win32) */ + TYPE_EXTERN, /* external symbol (Win32) */ + TYPE_NBTYPES +} ORD_TYPE; + +typedef enum +{ + SPEC_WIN16, + SPEC_WIN32 +} SPEC_TYPE; + +typedef struct +{ + int n_values; + int *values; +} ORD_VARIABLE; + +typedef struct +{ + char arg_types[21]; +} ORD_FUNCTION; + +typedef struct +{ + int value; +} ORD_ABS; + +typedef struct +{ + ORD_TYPE type; + int ordinal; + int offset; + int lineno; + int flags; + char *name; /* public name of this function */ + char *link_name; /* name of the C symbol to link to */ + char *export_name; /* name exported under for noname exports */ + union + { + ORD_VARIABLE var; + ORD_FUNCTION func; + ORD_ABS abs; + } u; +} ORDDEF; + +typedef struct +{ + char *file_name; /* file name of the dll */ + char *dll_name; /* internal name of the dll */ + char *owner_name; /* name of the 32-bit dll owning this one */ + char *init_func; /* initialization routine */ + SPEC_TYPE type; /* type of dll (Win16/Win32) */ + int base; /* ordinal base */ + int limit; /* ordinal limit */ + int stack_size; /* exe stack size */ + int heap_size; /* exe heap size */ + int nb_entry_points; /* number of used entry points */ + int alloc_entry_points; /* number of allocated entry points */ + int nb_names; /* number of entry points with names */ + int nb_resources; /* number of resources */ + int characteristics; /* characteristics for the PE header */ + int subsystem; /* subsystem id */ + int subsystem_major; /* subsystem version major number */ + int subsystem_minor; /* subsystem version minor number */ + ORDDEF *entry_points; /* dll entry points */ + ORDDEF **names; /* array of entry point names (points into entry_points) */ + ORDDEF **ordinals; /* array of dll ordinals (points into entry_points) */ + struct resource *resources; /* array of dll resources (format differs between Win16/Win32) */ +} DLLSPEC; + +/* entry point flags */ +#define FLAG_NORELAY 0x01 /* don't use relay debugging for this function */ +#define FLAG_NONAME 0x02 /* don't import function by name */ +#define FLAG_RET16 0x04 /* function returns a 16-bit value */ +#define FLAG_RET64 0x08 /* function returns a 64-bit value */ +#define FLAG_I386 0x10 /* function is i386 only */ +#define FLAG_REGISTER 0x20 /* use register calling convention */ +#define FLAG_PRIVATE 0x40 /* function is private (cannot be imported) */ + +#define FLAG_FORWARD 0x80 /* function is a forwarded name */ + + /* Offset of a structure field relative to the start of the struct */ +#define STRUCTOFFSET(type,field) ((int)&((type *)0)->field) + + /* Offset of register relative to the start of the CONTEXT struct */ +#define CONTEXTOFFSET(reg) STRUCTOFFSET(CONTEXT86,reg) + + /* Offset of register relative to the start of the STACK16FRAME struct */ +#define STACK16OFFSET(reg) STRUCTOFFSET(STACK16FRAME,reg) + + /* Offset of register relative to the start of the STACK32FRAME struct */ +#define STACK32OFFSET(reg) STRUCTOFFSET(STACK32FRAME,reg) + + /* Offset of the stack pointer relative to %fs:(0) */ +#define STACKOFFSET (STRUCTOFFSET(TEB,cur_stack)) + + +#define MAX_ORDINALS 65535 + +/* global functions */ + +#ifndef __GNUC__ +#define __attribute__(X) +#endif + +extern void *xmalloc (size_t size); +extern void *xrealloc (void *ptr, size_t size); +extern char *xstrdup( const char *str ); +extern char *strupper(char *s); +extern void fatal_error( const char *msg, ... ) + __attribute__ ((__format__ (__printf__, 1, 2))); +extern void fatal_perror( const char *msg, ... ) + __attribute__ ((__format__ (__printf__, 1, 2))); +extern void error( const char *msg, ... ) + __attribute__ ((__format__ (__printf__, 1, 2))); +extern void warning( const char *msg, ... ) + __attribute__ ((__format__ (__printf__, 1, 2))); +extern void output_standard_file_header( FILE *outfile ); +extern FILE *open_input_file( const char *srcdir, const char *name ); +extern void close_input_file( FILE *file ); +extern void dump_bytes( FILE *outfile, const unsigned char *data, int len, + const char *label, int constant ); +extern int remove_stdcall_decoration( char *name ); +extern DLLSPEC *alloc_dll_spec(void); +extern void free_dll_spec( DLLSPEC *spec ); +extern const char *make_c_identifier( const char *str ); +extern int get_alignment(int alignBoundary); + +extern void add_import_dll( const char *name, int delay ); +extern void add_ignore_symbol( const char *name ); +extern void read_undef_symbols( char **argv ); +extern int resolve_imports( DLLSPEC *spec ); +extern int output_imports( FILE *outfile, DLLSPEC *spec ); +extern int load_res32_file( const char *name, DLLSPEC *spec ); +extern void output_resources( FILE *outfile, DLLSPEC *spec ); +extern void load_res16_file( const char *name, DLLSPEC *spec ); +extern int output_res16_data( FILE *outfile, DLLSPEC *spec ); +extern int output_res16_directory( unsigned char *buffer, DLLSPEC *spec ); +extern void output_dll_init( FILE *outfile, const char *constructor, const char *destructor ); + +extern void BuildRelays16( FILE *outfile ); +extern void BuildRelays32( FILE *outfile ); +extern void BuildSpec16File( FILE *outfile, DLLSPEC *spec ); +extern void BuildSpec32File( FILE *outfile, DLLSPEC *spec ); +extern void BuildDef32File( FILE *outfile, DLLSPEC *spec ); +extern void BuildDebugFile( FILE *outfile, const char *srcdir, char **argv ); + +extern int parse_spec_file( FILE *file, DLLSPEC *spec ); +extern int parse_def_file( FILE *file, DLLSPEC *spec ); +extern int parse_debug_channels( const char *srcdir, const char *filename ); + +/* global variables */ + +extern int current_line; +extern int UsePIC; +extern int debugging; +extern int nb_debug_channels; +extern int nb_lib_paths; +extern int nb_errors; +extern int display_warnings; +extern int kill_at; + +extern char *input_file_name; +extern const char *output_file_name; +extern char **debug_channels; +extern char **lib_path; + +extern char *ld_command; +extern char *nm_command; + +#endif /* __WINE_BUILD_H */ Property changes on: vendor/wine/tools/winebuild/current/build.h ___________________________________________________________________ Name: svn:keywords + Author Date Id Revision Name: svn:eol-style + native _____
Added: vendor/wine/tools/winebuild/current/import.c --- vendor/wine/tools/winebuild/current/import.c 2005-02-14 16:14:12 UTC (rev 13564) +++ vendor/wine/tools/winebuild/current/import.c 2005-02-14 16:16:27 UTC (rev 13565) @@ -0,0 +1,1107 @@
+/* + * DLL imports support + * + * Copyright 2000, 2004 Alexandre Julliard + * Copyright 2000 Eric Pouech + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "config.h" +#include "wine/port.h" + +#include <ctype.h> +#include <fcntl.h> +#include <stdio.h> +#include <string.h> +#include <stdarg.h> +#ifdef HAVE_UNISTD_H +# include <unistd.h> +#endif + +#include "windef.h" +#include "winbase.h" +#include "build.h" + +struct import +{ + DLLSPEC *spec; /* description of the imported dll */ + int delay; /* delay or not dll loading ? */ + ORDDEF **exports; /* functions exported from this dll */ + int nb_exports; /* number of exported functions */ + ORDDEF **imports; /* functions we want to import from this dll */ + int nb_imports; /* number of imported functions */ +}; + +static char **undef_symbols; /* list of undefined symbols */ +static int nb_undef_symbols = -1; +static int undef_size; + +static char **ignore_symbols; /* list of symbols to ignore */ +static int nb_ignore_symbols; +static int ignore_size; + +static char *ld_tmp_file; /* ld temp file name */ + +static struct import **dll_imports = NULL; +static int nb_imports = 0; /* number of imported dlls (delayed or not) */ +static int nb_delayed = 0; /* number of delayed dlls */ +static int total_imports = 0; /* total number of imported functions */ +static int total_delayed = 0; /* total number of imported functions in delayed DLLs */ + +/* list of symbols that are ignored by default */ +static const char * const default_ignored_symbols[] = +{ + "abs", + "acos", + "asin", + "atan", + "atan2", + "atof", + "atoi", + "atol", + "bsearch", + "ceil", + "cos", + "cosh", + "exp", + "fabs", + "floor", + "fmod", + "frexp", + "labs", + "log", + "log10", + "memchr", + "memcmp", + "memcpy", + "memmove", + "memset", + "modf", + "pow", + "qsort", + "sin", + "sinh", + "sqrt", + "strcat", + "strchr", + "strcmp", + "strcpy", + "strcspn", + "strlen", + "strncat", + "strncmp", + "strncpy", + "strpbrk", + "strrchr", + "strspn", + "strstr", + "tan", + "tanh" +}; + +#ifdef __powerpc__ +# ifdef __APPLE__ +# define ppc_high(mem) "ha16(" mem ")" +# define ppc_low(mem) "lo16(" mem ")" +static const char * const ppc_reg[32] = { "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", + "r8", "r9", "r10","r11","r12","r13","r14","r15", + "r16","r17","r18","r19","r20","r21","r22","r23", + "r24","r25","r26","r27","r28","r29","r30","r31" }; +# else /* __APPLE__ */ +# define ppc_high(mem) "(" mem ")@hi" +# define ppc_low(mem) "(" mem ")@l" +static const char * const ppc_reg[32] = { "0", "1", "2", "3", "4", "5", "6", "7", + "8", "9", "10","11","12","13","14","15", + "16","17","18","19","20","21","22","23", + "24","25","26","27","28","29","30","31" }; +# endif /* __APPLE__ */ +#endif /* __powerpc__ */ + +/* compare function names; helper for resolve_imports */ +static int name_cmp( const void *name, const void *entry ) +{ + return strcmp( *(const char* const *)name, *(const char* const *)entry ); +} + +/* compare function names; helper for resolve_imports */ +static int func_cmp( const void *func1, const void *func2 ) +{ + const ORDDEF *odp1 = *(const ORDDEF * const *)func1; + const ORDDEF *odp2 = *(const ORDDEF * const *)func2; + return strcmp( odp1->name ? odp1->name : odp1->export_name, + odp2->name ? odp2->name : odp2->export_name ); +} + +/* locate a symbol in a (sorted) list */ +inline static const char *find_symbol( const char *name, char **table, int size ) +{ + char **res = NULL; + + if (table) { + res = bsearch( &name, table, size, sizeof(*table), name_cmp ); + } + + return res ? *res : NULL; +} + +/* locate an export in a (sorted) export list */ +inline static ORDDEF *find_export( const char *name, ORDDEF **table, int size ) +{ + ORDDEF func, *odp, **res = NULL; + + func.name = (char *)name; + func.ordinal = -1; + odp = &func; + if (table) res = bsearch( &odp, table, size, sizeof(*table), func_cmp ); + return res ? *res : NULL; +} + +/* sort a symbol table */ +inline static void sort_symbols( char **table, int size ) +{ + if (table ) + qsort( table, size, sizeof(*table), name_cmp ); +} + +inline static void output_function_size( FILE *outfile, const char *name ) +{ +#ifdef HAVE_ASM_DOT_SIZE + fprintf( outfile, " "\t.size " __ASM_NAME("%s") ", . - " __ASM_NAME("%s") "\n"\n", name, name); +#endif +} + +/* free an import structure */ +static void free_imports( struct import *imp ) +{ + free( imp->exports ); + free( imp->imports ); + free_dll_spec( imp->spec ); + free( imp ); +} + +/* remove the temp file at exit */ +static void remove_ld_tmp_file(void) +{ + if (ld_tmp_file) unlink( ld_tmp_file ); +} + +/* check whether a given dll has already been imported */ +static int is_already_imported( const char *name ) +{ + int i; + + for (i = 0; i < nb_imports; i++) + { + if (!strcmp( dll_imports[i]->spec->file_name, name )) return 1; + } + return 0; +} + +/* open the .so library for a given dll in a specified path */ +static char *try_library_path( const char *path, const char *name ) +{ + char *buffer; + int fd; + + buffer = xmalloc( strlen(path) + strlen(name) + 9 ); + sprintf( buffer, "%s/lib%s.def", path, name ); + + /* check if the file exists */ + if ((fd = open( buffer, O_RDONLY )) != -1) + { + close( fd ); + return buffer; + } + free( buffer ); + return NULL; +} + +/* open the .so library for a given dll */ +static char *open_library( const char *name ) +{ + char *fullname; + int i; + + for (i = 0; i < nb_lib_paths; i++) + { + if ((fullname = try_library_path( lib_path[i], name ))) return fullname; + } + fatal_error( "could not open .def file for %s\n", name ); + return NULL; +} + +/* read in the list of exported symbols of an import library */ +static int read_import_lib( const char *name, struct import *imp ) +{ + FILE *f; + char *fullname; + int i, ret; + DLLSPEC *spec = imp->spec; + + imp->exports = NULL; + imp->nb_exports = 0; + + fullname = open_library( name ); + f = open_input_file( NULL, fullname ); + free( fullname ); + + ret = parse_def_file( f, spec ); + close_input_file( f ); + if (!ret) return 0; + if (is_already_imported( spec->file_name )) return 0; + + imp->exports = xmalloc( spec->nb_entry_points * sizeof(*imp->exports) ); + + for (i = 0; i < spec->nb_entry_points; i++) + { + ORDDEF *odp = &spec->entry_points[i]; + + if (odp->type != TYPE_STDCALL && odp->type != TYPE_CDECL) continue; + if (odp->flags & FLAG_PRIVATE) continue; + imp->exports[imp->nb_exports++] = odp; + } + imp->exports = xrealloc( imp->exports, imp->nb_exports * sizeof(*imp->exports) ); + if (imp->nb_exports) + qsort( imp->exports, imp->nb_exports, sizeof(*imp->exports), func_cmp ); + return 1; +} + +/* add a dll to the list of imports */ +void add_import_dll( const char *name, int delay ) +{ + struct import *imp; + char *fullname; + + fullname = xmalloc( strlen(name) + 5 ); + strcpy( fullname, name ); + if (!strchr( fullname, '.' )) strcat( fullname, ".dll" ); + + /* check if we already imported it */ + if (is_already_imported( fullname )) + { + free( fullname ); + return; + } + + imp = xmalloc( sizeof(*imp) ); + imp->spec = alloc_dll_spec(); + imp->spec->file_name = fullname; + imp->delay = delay; + imp->imports = NULL; + imp->nb_imports = 0; + if (delay) nb_delayed++; + + if (read_import_lib( name, 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); + } +} + +/* remove an imported dll, based on its index in the dll_imports array */ +static void remove_import_dll( int index ) +{ + struct import *imp = dll_imports[index]; + + memmove( &dll_imports[index], &dll_imports[index+1], sizeof(imp) * (nb_imports - index - 1) ); + nb_imports--; + if (imp->delay) nb_delayed--; + free_imports( imp ); +} + +/* initialize the list of ignored symbols */ +static void init_ignored_symbols(void) +{ + int i; + + nb_ignore_symbols = sizeof(default_ignored_symbols)/sizeof(default_ignored_symbols[0]); + ignore_size = nb_ignore_symbols + 32; + ignore_symbols = xmalloc( ignore_size * sizeof(*ignore_symbols) ); + for (i = 0; i < nb_ignore_symbols; i++) + ignore_symbols[i] = xstrdup( default_ignored_symbols[i] ); +} + +/* add a symbol to the ignored symbol list */ +/* if the name starts with '-' the symbol is removed instead */ +void add_ignore_symbol( const char *name ) +{ + int i; + + if (!ignore_symbols) init_ignored_symbols(); /* first time around, fill list with defaults */ + + if (name[0] == '-') /* remove it */ + { + if (!name[1]) /* remove everything */ + { + for (i = 0; i < nb_ignore_symbols; i++) free( ignore_symbols[i] ); + nb_ignore_symbols = 0; + } + else + { + for (i = 0; i < nb_ignore_symbols; i++) + { + if (!strcmp( ignore_symbols[i], name+1 )) + { + free( ignore_symbols[i] ); + memmove( &ignore_symbols[i], &ignore_symbols[i+1], nb_ignore_symbols - i - 1 ); + nb_ignore_symbols--; + } + } + } + } + else + { + if (nb_ignore_symbols == ignore_size) + { + ignore_size += 32; + ignore_symbols = xrealloc( ignore_symbols, ignore_size * sizeof(*ignore_symbols) ); + } + ignore_symbols[nb_ignore_symbols++] = xstrdup( name ); + } +} + +/* add a function to the list of imports from a given dll */ +static void add_import_func( struct import *imp, ORDDEF *func ) +{ + imp->imports = xrealloc( imp->imports, (imp->nb_imports+1) * sizeof(*imp->imports) ); + imp->imports[imp->nb_imports++] = func; + total_imports++; + if (imp->delay) total_delayed++; +} + +/* add a symbol to the undef list */ +inline static void add_undef_symbol( const char *name ) +{ + if (nb_undef_symbols == undef_size) + { + undef_size += 128; + undef_symbols = xrealloc( undef_symbols, undef_size * sizeof(*undef_symbols) ); + } + undef_symbols[nb_undef_symbols++] = xstrdup( name ); +} + +/* remove all the holes in the undefined symbol list; return the number of removed symbols */ +static int remove_symbol_holes(void) +{ + int i, off; + for (i = off = 0; i < nb_undef_symbols; i++) + { + if (!undef_symbols[i]) off++; + else undef_symbols[i - off] = undef_symbols[i]; + } + nb_undef_symbols -= off; + return off; +} + +/* add a symbol to the extra list, but only if needed */ +static int add_extra_symbol( const char **extras, int *count, const char *name, const DLLSPEC *spec ) +{ + int i; + + if (!find_symbol( name, undef_symbols, nb_undef_symbols )) + { + /* check if the symbol is being exported by this dll */ + for (i = 0; i < spec->nb_entry_points; i++) + { + ORDDEF *odp = &spec->entry_points[i]; + if (odp->type == TYPE_STDCALL || + odp->type == TYPE_CDECL || + odp->type == TYPE_VARARGS || + odp->type == TYPE_EXTERN) + { + if (odp->name && !strcmp( odp->name, name )) return 0; + } + } + extras[*count] = name; + (*count)++; + } + return 1; +} + +/* add the extra undefined symbols that will be contained in the generated spec file itself */ +static void add_extra_undef_symbols( const DLLSPEC *spec ) +{ + const char *extras[10]; + int i, count = 0, nb_stubs = 0, nb_regs = 0; + int kernel_imports = 0, ntdll_imports = 0; + + sort_symbols( undef_symbols, nb_undef_symbols ); + + for (i = 0; i < spec->nb_entry_points; i++) + { + ORDDEF *odp = &spec->entry_points[i]; + if (odp->type == TYPE_STUB) nb_stubs++; + if (odp->flags & FLAG_REGISTER) nb_regs++; + } + + /* add symbols that will be contained in the spec file itself */ + if (!(spec->characteristics & IMAGE_FILE_DLL)) + { + switch (spec->subsystem) + { + case IMAGE_SUBSYSTEM_WINDOWS_GUI: + case IMAGE_SUBSYSTEM_WINDOWS_CUI: + kernel_imports += add_extra_symbol( extras, &count, "GetCommandLineA", spec ); + kernel_imports += add_extra_symbol( extras, &count, "GetStartupInfoA", spec ); + kernel_imports += add_extra_symbol( extras, &count, "GetModuleHandleA", spec ); + kernel_imports += add_extra_symbol( extras, &count, "ExitProcess", spec ); + break; + } + } + if (nb_delayed) + { + kernel_imports += add_extra_symbol( extras, &count, "LoadLibraryA", spec ); + kernel_imports += add_extra_symbol( extras, &count, "GetProcAddress", spec ); + } + if (nb_regs) + ntdll_imports += add_extra_symbol( extras, &count, "__wine_call_from_32_regs", spec ); + if (nb_delayed || nb_stubs) + ntdll_imports += add_extra_symbol( extras, &count, "RtlRaiseException", spec ); + + /* make sure we import the dlls that contain these functions */ + if (kernel_imports) add_import_dll( "kernel32", 0 ); + if (ntdll_imports) add_import_dll( "ntdll", 0 ); + + if (count) + { + for (i = 0; i < count; i++) add_undef_symbol( extras[i] ); + sort_symbols( undef_symbols, nb_undef_symbols ); + } +} + +/* check if a given imported dll is not needed, taking forwards into account */ +static int check_unused( const struct import* imp, const DLLSPEC *spec ) +{ + int i; + const char *file_name = imp->spec->file_name; + size_t len = strlen( file_name ); + const char *p = strchr( file_name, '.' ); + if (p && !strcasecmp( p, ".dll" )) len = p - file_name; + + for (i = spec->base; i <= spec->limit; i++) + { + ORDDEF *odp = spec->ordinals[i]; + if (!odp || !(odp->flags & FLAG_FORWARD)) continue; + if (!strncasecmp( odp->link_name, file_name, len ) && + odp->link_name[len] == '.') + return 0; /* found a forward, it is used */ + } + return 1; +} + +/* combine a list of object files with ld into a single object file */ +/* returns the name of the combined file */ +static const char *ldcombine_files( char **argv ) +{ + int i, len = 0; + char *cmd; + int fd, err; + + if (output_file_name && output_file_name[0]) + { + ld_tmp_file = xmalloc( strlen(output_file_name) + 10 ); + strcpy( ld_tmp_file, output_file_name ); + strcat( ld_tmp_file, ".XXXXXX.o" ); + } + else ld_tmp_file = xstrdup( "/tmp/winebuild.tmp.XXXXXX.o" ); + + if ((fd = mkstemps( ld_tmp_file, 2 ) == -1)) fatal_error( "could not generate a temp file\n" ); + close( fd ); + atexit( remove_ld_tmp_file ); + + for (i = 0; argv[i]; i++) len += strlen(argv[i]) + 1; + cmd = xmalloc( len + strlen(ld_tmp_file) + 8 + strlen(ld_command) ); + sprintf( cmd, "%s -r -o %s", ld_command, ld_tmp_file ); + for (i = 0; argv[i]; i++) sprintf( cmd + strlen(cmd), " %s", argv[i] ); + err = system( cmd ); + if (err) fatal_error( "%s -r failed with status %d\n", ld_command, err ); + free( cmd ); + return ld_tmp_file; +} + +/* read in the list of undefined symbols */ +void read_undef_symbols( char **argv ) +{ + static const char name_prefix[] = __ASM_NAME(""); + static const int prefix_len = sizeof(name_prefix) - 1; + FILE *f; + char *cmd, buffer[1024]; + int err; + const char *name; + + if (!argv[0]) return; + + undef_size = nb_undef_symbols = 0; + + /* if we have multiple object files, link them together */ + if (argv[1]) name = ldcombine_files( argv ); + else name = argv[0]; + + cmd = xmalloc( strlen(nm_command) + strlen(name) + 5 ); + sprintf( cmd, "%s -u %s", nm_command, name ); + if (!(f = popen( cmd, "r" ))) + fatal_error( "Cannot execute '%s'\n", cmd ); + + while (fgets( buffer, sizeof(buffer), f )) + { + char *p = buffer + strlen(buffer) - 1; + if (p < buffer) continue; + if (*p == '\n') *p-- = 0; + p = buffer; + while (*p == ' ') p++; + if (p[0] == 'U' && p[1] == ' ' && p[2]) p += 2; + if (prefix_len && !strncmp( p, name_prefix, prefix_len )) p += prefix_len; + add_undef_symbol( p ); + } + if ((err = pclose( f ))) warning( "%s failed with status %d\n", cmd, err ); + free( cmd ); +} + +static void remove_ignored_symbols(void) +{ + int i; + + if (!ignore_symbols) init_ignored_symbols(); + sort_symbols( ignore_symbols, nb_ignore_symbols ); + for (i = 0; i < nb_undef_symbols; i++) + { + if (find_symbol( undef_symbols[i], ignore_symbols, nb_ignore_symbols )) + { + free( undef_symbols[i] ); + undef_symbols[i] = NULL; + } + } + remove_symbol_holes(); +} + +/* resolve the imports for a Win32 module */ +int resolve_imports( DLLSPEC *spec ) +{ + int i, j; + + if (nb_undef_symbols == -1) return 0; /* no symbol file specified */ + + add_extra_undef_symbols( spec ); + remove_ignored_symbols(); + + for (i = 0; i < nb_imports; i++) + { + struct import *imp = dll_imports[i]; + + for (j = 0; j < nb_undef_symbols; j++) + { + ORDDEF *odp = find_export( undef_symbols[j], imp->exports, imp->nb_exports ); + if (odp) + { + add_import_func( imp, odp ); + free( undef_symbols[j] ); + undef_symbols[j] = NULL; + } + } + /* remove all the holes in the undef symbols list */ + if (!remove_symbol_holes() && check_unused( imp, spec )) + { + /* the dll is not used, get rid of it */ + warning( "%s imported but no symbols used\n", imp->spec->file_name ); + remove_import_dll( i ); + i--; + } + } + return 1; +} + +/* output the import table of a Win32 module */ +static int output_immediate_imports( FILE *outfile ) +{ + int i, j, pos; + int nb_imm = nb_imports - nb_delayed; + static const char import_thunks[] = "__wine_spec_import_thunks"; + + if (!nb_imm) goto done; + + /* main import header */ + + fprintf( outfile, "\nstatic struct {\n" ); + fprintf( outfile, " struct {\n" ); + fprintf( outfile, " void *OriginalFirstThunk;\n" ); + fprintf( outfile, " unsigned int TimeDateStamp;\n" ); + fprintf( outfile, " unsigned int ForwarderChain;\n" ); + fprintf( outfile, " const char *Name;\n" ); + fprintf( outfile, " void *FirstThunk;\n" ); + fprintf( outfile, " } imp[%d];\n", nb_imm+1 ); + fprintf( outfile, " const char *data[%d];\n", + total_imports - total_delayed + nb_imm ); + fprintf( outfile, "} imports = {\n {\n" ); + + /* list of dlls */ + + for (i = j = 0; i < nb_imports; i++) + { + if (dll_imports[i]->delay) continue; + fprintf( outfile, " { 0, 0, 0, "%s", &imports.data[%d] },\n", + dll_imports[i]->spec->file_name, j ); + j += dll_imports[i]->nb_imports + 1; + } + + fprintf( outfile, " { 0, 0, 0, 0, 0 },\n" ); + fprintf( outfile, " },\n {\n" ); + + /* list of imported functions */ + + for (i = 0; i < nb_imports; i++) + { + if (dll_imports[i]->delay) continue; + fprintf( outfile, " /* %s */\n", dll_imports[i]->spec->file_name ); + for (j = 0; j < dll_imports[i]->nb_imports; j++) + { + ORDDEF *odp = dll_imports[i]->imports[j]; + if (!(odp->flags & FLAG_NONAME)) + { + unsigned short ord = odp->ordinal; + fprintf( outfile, " "\%03o\%03o%s",\n", + *(unsigned char *)&ord, *((unsigned char *)&ord + 1), odp->name ); + } + else [truncated at 1000 lines; 6763 more skipped]