From 5e47acbc6d55dc42f143c769123014f66b74ddfa Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Sat, 25 May 2002 21:09:15 +0000 Subject: [PATCH] Only add extra symbols if they are not already exported by this dll. --- tools/winebuild/import.c | 60 ++++++++++++++++++++++++++++------------ 1 file changed, 42 insertions(+), 18 deletions(-) diff --git a/tools/winebuild/import.c b/tools/winebuild/import.c index 19cbe2d5e16..b9795ed5c5d 100644 --- a/tools/winebuild/import.c +++ b/tools/winebuild/import.c @@ -237,15 +237,37 @@ static int remove_symbol_holes(void) 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 ) +{ + 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 < nb_entry_points; i++) + { + ORDDEF *odp = EntryPoints[i]; + if (odp->type == TYPE_STDCALL || + odp->type == TYPE_CDECL || + odp->type == TYPE_VARARGS || + odp->type == TYPE_EXTERN) + { + if (!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(void) { const char *extras[10]; int i, count = 0, nb_stubs = 0, nb_regs = 0; - -#define ADD_SYM(name) \ - do { if (!find_symbol( extras[count] = (name), undef_symbols, \ - nb_undef_symbols )) count++; } while(0) + int kernel_imports = 0, ntdll_imports = 0; sort_symbols( undef_symbols, nb_undef_symbols ); @@ -262,33 +284,35 @@ static void add_extra_undef_symbols(void) case SPEC_MODE_DLL: break; case SPEC_MODE_GUIEXE: - ADD_SYM( "GetCommandLineA" ); - ADD_SYM( "GetStartupInfoA" ); - ADD_SYM( "GetModuleHandleA" ); + kernel_imports += add_extra_symbol( extras, &count, "GetCommandLineA" ); + kernel_imports += add_extra_symbol( extras, &count, "GetStartupInfoA" ); + kernel_imports += add_extra_symbol( extras, &count, "GetModuleHandleA" ); /* fall through */ case SPEC_MODE_CUIEXE: - ADD_SYM( "ExitProcess" ); + kernel_imports += add_extra_symbol( extras, &count, "ExitProcess" ); break; case SPEC_MODE_GUIEXE_UNICODE: - ADD_SYM( "GetCommandLineA" ); - ADD_SYM( "GetStartupInfoA" ); - ADD_SYM( "GetModuleHandleA" ); + kernel_imports += add_extra_symbol( extras, &count, "GetCommandLineA" ); + kernel_imports += add_extra_symbol( extras, &count, "GetStartupInfoA" ); + kernel_imports += add_extra_symbol( extras, &count, "GetModuleHandleA" ); /* fall through */ case SPEC_MODE_CUIEXE_UNICODE: - ADD_SYM( "ExitProcess" ); + kernel_imports += add_extra_symbol( extras, &count, "ExitProcess" ); break; } if (nb_delayed) { - ADD_SYM( "LoadLibraryA" ); - ADD_SYM( "GetProcAddress" ); + kernel_imports += add_extra_symbol( extras, &count, "LoadLibraryA" ); + kernel_imports += add_extra_symbol( extras, &count, "GetProcAddress" ); } - if (nb_regs) ADD_SYM( "__wine_call_from_32_regs" ); - if (nb_delayed || nb_stubs) ADD_SYM( "RtlRaiseException" ); + if (nb_regs) + ntdll_imports += add_extra_symbol( extras, &count, "__wine_call_from_32_regs" ); + if (nb_delayed || nb_stubs) + ntdll_imports += add_extra_symbol( extras, &count, "RtlRaiseException" ); /* make sure we import the dlls that contain these functions */ - if (SpecMode != SPEC_MODE_DLL || nb_delayed) add_import_dll( "kernel32", 0 ); - if (nb_delayed || nb_stubs || nb_regs) add_import_dll( "ntdll", 0 ); + if (kernel_imports) add_import_dll( "kernel32", 0 ); + if (ntdll_imports) add_import_dll( "ntdll", 0 ); if (count) {