Alexandre Julliard : winebuild: Add support for linking to static import libraries.

Alexandre Julliard julliard at wine.codeweavers.com
Fri Mar 25 10:00:38 CDT 2016


Module: wine
Branch: master
Commit: 13fe69714bbf719d9ddbcf8d34d025f48da3af7b
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=13fe69714bbf719d9ddbcf8d34d025f48da3af7b

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Fri Mar 25 15:33:35 2016 +0900

winebuild: Add support for linking to static import libraries.

Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 tools/winebuild/import.c | 57 +++++++++++++++++++++++++++++++++++++++++++-----
 1 file changed, 51 insertions(+), 6 deletions(-)

diff --git a/tools/winebuild/import.c b/tools/winebuild/import.c
index d2d6f57..4fbcab0 100644
--- a/tools/winebuild/import.c
+++ b/tools/winebuild/import.c
@@ -309,6 +309,28 @@ void add_extra_ld_symbol( const char *name )
     strarray_add( &extra_ld_symbols, name, NULL );
 }
 
+/* retrieve an imported dll, adding one if necessary */
+struct import *add_static_import_dll( const char *name )
+{
+    struct import *import;
+    char *dll_name = get_dll_name( name, NULL );
+
+    if ((import = find_import_dll( dll_name ))) return import;
+
+    import = xmalloc( sizeof(*import) );
+    memset( import, 0, sizeof(*import) );
+
+    import->dll_name = dll_name;
+    import->full_name = xstrdup( dll_name );
+    import->c_name = make_c_identifier( dll_name );
+
+    if (is_delayed_import( dll_name ))
+        list_add_tail( &dll_delayed, &import->entry );
+    else
+        list_add_tail( &dll_imports, &import->entry );
+    return import;
+}
+
 /* add a function to the list of imports from a given dll */
 static void add_import_func( struct import *imp, const char *name, const char *export_name, int ordinal )
 {
@@ -324,6 +346,26 @@ static void add_import_func( struct import *imp, const char *name, const char *e
     imp->nb_imports++;
 }
 
+/* add an import for an undefined function of the form __wine$func$ */
+static void add_undef_import( const char *name, int is_ordinal )
+{
+    char *p, *dll_name = xstrdup( name );
+    int ordinal = 0;
+    struct import *import;
+
+    if (!(p = strchr( dll_name, '$' ))) return;
+    *p++ = 0;
+    while (*p >= '0' && *p <= '9') ordinal = 10 * ordinal + *p++ - '0';
+    if (*p != '$') return;
+    p++;
+
+    import = add_static_import_dll( dll_name );
+    if (is_ordinal)
+        add_import_func( import, NULL, xstrdup( p ), ordinal );
+    else
+        add_import_func( import, xstrdup( p ), NULL, ordinal );
+}
+
 /* get the default entry point for a given spec file */
 static const char *get_default_entry_point( const DLLSPEC *spec )
 {
@@ -351,7 +393,7 @@ static void add_extra_undef_symbols( DLLSPEC *spec )
     if (!spec->init_func) spec->init_func = xstrdup( get_default_entry_point(spec) );
     add_extra_ld_symbol( spec->init_func );
     if (has_stubs( spec )) add_extra_ld_symbol( "__wine_spec_unimplemented_stub" );
-    if (!list_empty( &dll_delayed )) add_extra_ld_symbol( "__wine_spec_delay_load" );
+    if (delayed_imports.count) add_extra_ld_symbol( "__wine_spec_delay_load" );
 }
 
 /* check if a given imported dll is not needed, taking forwards into account */
@@ -518,7 +560,11 @@ void read_undef_symbols( DLLSPEC *spec, char **argv )
         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;
-        strarray_add( &undef_symbols, xstrdup( p ), NULL );
+        if (!strncmp( p, import_func_prefix, strlen(import_func_prefix) ))
+            add_undef_import( p + strlen( import_func_prefix ), 0 );
+        else if (!strncmp( p, import_ord_prefix, strlen(import_ord_prefix) ))
+            add_undef_import( p + strlen( import_ord_prefix ), 1 );
+        else strarray_add( &undef_symbols, xstrdup( p ), NULL );
     }
     if ((err = pclose( f ))) warning( "%s failed with status %d\n", cmd, err );
     free( cmd );
@@ -526,13 +572,13 @@ void read_undef_symbols( DLLSPEC *spec, char **argv )
 
 void resolve_dll_imports( DLLSPEC *spec, struct list *list )
 {
-    unsigned int j, removed;
+    unsigned int j;
     struct import *imp, *next;
     ORDDEF *odp;
 
     LIST_FOR_EACH_ENTRY_SAFE( imp, next, list, struct import, entry )
     {
-        for (j = removed = 0; j < undef_symbols.count; j++)
+        for (j = 0; j < undef_symbols.count; j++)
         {
             odp = find_export( undef_symbols.str[j], imp->exports, imp->nb_exports );
             if (odp)
@@ -546,11 +592,10 @@ void resolve_dll_imports( DLLSPEC *spec, struct list *list )
                     add_import_func( imp, (odp->flags & FLAG_NONAME) ? NULL : odp->name,
                                      odp->export_name, odp->ordinal );
                     remove_name( &undef_symbols, j-- );
-                    removed++;
                 }
             }
         }
-        if (!removed)
+        if (!imp->nb_imports)
         {
             /* the dll is not used, get rid of it */
             if (check_unused( imp, spec ))




More information about the wine-cvs mailing list