diff --git a/tools/winegcc/utils.c b/tools/winegcc/utils.c index 0fe9b04b002..0b82af90683 100644 --- a/tools/winegcc/utils.c +++ b/tools/winegcc/utils.c @@ -271,39 +271,39 @@ static char* try_lib_path(const char* dir, const char* pre, } static file_type guess_lib_type(enum target_platform platform, const char* dir, - const char* library, const char *suffix, char** file) + const char* library, const char *prefix, const char *suffix, char** file) { if (platform != PLATFORM_WINDOWS && platform != PLATFORM_MINGW && platform != PLATFORM_CYGWIN) { /* Unix shared object */ - if ((*file = try_lib_path(dir, "lib", library, ".so", file_so))) + if ((*file = try_lib_path(dir, prefix, library, ".so", file_so))) return file_so; /* Mach-O (Darwin/Mac OS X) Dynamic Library behaves mostly like .so */ - if ((*file = try_lib_path(dir, "lib", library, ".dylib", file_so))) + if ((*file = try_lib_path(dir, prefix, library, ".dylib", file_so))) return file_so; /* Windows DLL */ - if ((*file = try_lib_path(dir, "lib", library, ".def", file_def))) + if ((*file = try_lib_path(dir, prefix, library, ".def", file_def))) return file_dll; } /* static archives */ - if ((*file = try_lib_path(dir, "lib", library, suffix, file_arh))) + if ((*file = try_lib_path(dir, prefix, library, suffix, file_arh))) return file_arh; return file_na; } file_type get_lib_type(enum target_platform platform, strarray* path, const char *library, - const char *suffix, char** file) + const char *prefix, const char *suffix, char** file) { unsigned int i; if (!suffix) suffix = ".a"; for (i = 0; i < path->size; i++) { - file_type type = guess_lib_type(platform, path->base[i], library, suffix, file); + file_type type = guess_lib_type(platform, path->base[i], library, prefix, suffix, file); if (type != file_na) return type; } return file_na; diff --git a/tools/winegcc/utils.h b/tools/winegcc/utils.h index 9c70011a90f..39fe8a8d08a 100644 --- a/tools/winegcc/utils.h +++ b/tools/winegcc/utils.h @@ -85,7 +85,7 @@ char* get_basename(const char* file); void create_file(const char* name, int mode, const char* fmt, ...); file_type get_file_type(const char* filename); file_type get_lib_type(enum target_platform platform, strarray* path, const char *library, - const char *suffix, char** file); + const char *prefix, const char *suffix, char** file); const char *find_binary( const strarray* prefix, const char *name ); int spawn(const strarray* prefix, const strarray* arr, int ignore_errors); diff --git a/tools/winegcc/winegcc.c b/tools/winegcc/winegcc.c index e43ad298e60..bcabc4f7998 100644 --- a/tools/winegcc/winegcc.c +++ b/tools/winegcc/winegcc.c @@ -1083,14 +1083,27 @@ static const char *find_libgcc(const strarray *prefix, const strarray *link_tool /* add specified library to the list of files */ static void add_library( struct options *opts, strarray *lib_dirs, strarray *files, const char *library ) { - char *static_lib, *fullname = 0; + char *static_lib, *fullname = 0, *unixlib; - switch(get_lib_type(opts->target_platform, lib_dirs, library, opts->lib_suffix, &fullname)) + switch(get_lib_type(opts->target_platform, lib_dirs, library, "lib", opts->lib_suffix, &fullname)) { case file_arh: strarray_add(files, strmake("-a%s", fullname)); break; case file_dll: + if (opts->unix_lib && opts->subsystem && !strcmp(opts->subsystem, "native")) + { + if (get_lib_type(opts->target_platform, lib_dirs, library, "", ".so", &unixlib) == file_so) + { + strarray_add(files, strmake("-s%s", unixlib)); + free(unixlib); + } + else + { + strarray_add(files, strmake("-l%s", library)); + } + break; + } strarray_add(files, strmake("-d%s", fullname)); if ((static_lib = find_static_lib(fullname))) { @@ -1266,7 +1279,7 @@ static void build(struct options* opts) /* set default entry point, if needed */ if (!opts->entry_point) { - if (opts->subsystem && !strcmp( opts->subsystem, "native" )) + if (opts->subsystem && !opts->unix_lib && !strcmp( opts->subsystem, "native" )) entry_point = (is_pe && opts->target_cpu == CPU_x86) ? "DriverEntry@8" : "DriverEntry"; else if (opts->use_msvcrt && !opts->shared && !opts->win16_app) entry_point = opts->unicode_app ? "wmainCRTStartup" : "mainCRTStartup";