Jacek Caban : winegcc: Add support for -Wl,--entry argument.

Alexandre Julliard julliard at winehq.org
Thu Jan 23 15:48:50 CST 2020


Module: wine
Branch: master
Commit: 618ac5f32a8c05beec5a499b49741f4b3cebd9ef
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=618ac5f32a8c05beec5a499b49741f4b3cebd9ef

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Tue Jan 21 19:52:05 2020 +0100

winegcc: Add support for -Wl,--entry argument.

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 tools/winegcc/winegcc.c | 45 +++++++++++++++++++++++++++++----------------
 1 file changed, 29 insertions(+), 16 deletions(-)

diff --git a/tools/winegcc/winegcc.c b/tools/winegcc/winegcc.c
index 7f32a38788..7320216a24 100644
--- a/tools/winegcc/winegcc.c
+++ b/tools/winegcc/winegcc.c
@@ -219,6 +219,7 @@ struct options
     const char* isysroot;
     const char* lib_suffix;
     const char* subsystem;
+    const char* entry_point;
     const char* prelink;
     strarray* prefix;
     strarray* lib_dirs;
@@ -439,16 +440,7 @@ static strarray *get_link_args( struct options *opts, const char *output_name )
         if (opts->unicode_app) strarray_add( flags, "-municode" );
         if (opts->nodefaultlibs || use_wine_crt) strarray_add( flags, "-nodefaultlibs" );
         if (opts->nostartfiles || use_wine_crt) strarray_add( flags, "-nostartfiles" );
-
-        if (opts->subsystem)
-        {
-            strarray_add( flags, strmake("-Wl,--subsystem,%s", opts->subsystem ));
-            if (!strcmp( opts->subsystem, "native" ))
-            {
-                const char *entry = opts->target_cpu == CPU_x86 ? "_DriverEntry at 8" : "DriverEntry";
-                strarray_add( flags, strmake( "-Wl,--entry,%s", entry ));
-            }
-        }
+        if (opts->subsystem) strarray_add( flags, strmake("-Wl,--subsystem,%s", opts->subsystem ));
 
         strarray_add( flags, "-Wl,--nxcompat" );
 
@@ -957,7 +949,7 @@ static void build(struct options* opts)
     const char *spec_o_name, *libgcc = NULL;
     const char *output_name, *spec_file, *lang;
     int generate_app_loader = 1;
-    const char* crt_lib = NULL;
+    const char *crt_lib = NULL, *entry_point = NULL;
     int fake_module = 0;
     int is_pe = (opts->target_platform == PLATFORM_WINDOWS || opts->target_platform == PLATFORM_CYGWIN);
     unsigned int j;
@@ -1098,6 +1090,19 @@ static void build(struct options* opts)
     }
     if (!opts->nostdlib && !is_pe) add_library(opts, lib_dirs, files, "wine");
 
+    /* set default entry point, if needed */
+    if (!opts->entry_point)
+    {
+        if (is_pe)
+        {
+            if (opts->subsystem && !strcmp( opts->subsystem, "native" ))
+                entry_point = opts->target_cpu == CPU_x86 ? "_DriverEntry at 8" : "DriverEntry";
+        }
+        else if (!opts->shared && opts->unicode_app)
+            entry_point = "__wine_spec_exe_wentry";
+    }
+    else entry_point = opts->entry_point;
+
     /* run winebuild to generate the .spec.o file */
     spec_args = get_winebuild_args( opts );
     strarray_add( spec_args, strmake( "--cc-cmd=%s", build_tool_name( opts, "gcc", CC )));
@@ -1133,14 +1138,15 @@ static void build(struct options* opts)
         strarray_add(spec_args, output_name);
         strarray_add(spec_args, "--subsystem");
         strarray_add(spec_args, opts->gui_app ? "windows" : "console");
-        if (opts->unicode_app)
-        {
-            strarray_add(spec_args, "--entry");
-            strarray_add(spec_args, "__wine_spec_exe_wentry");
-        }
         if (opts->large_address_aware) strarray_add( spec_args, "--large-address-aware" );
     }
 
+    if (entry_point)
+    {
+        strarray_add(spec_args, "--entry");
+        strarray_add(spec_args, entry_point);
+    }
+
     if (opts->subsystem)
     {
         strarray_add(spec_args, "--subsystem");
@@ -1196,6 +1202,8 @@ static void build(struct options* opts)
     for ( j = 0; j < lib_dirs->size; j++ )
 	strarray_add(link_args, strmake("-L%s", lib_dirs->base[j]));
 
+    if (is_pe && entry_point) strarray_add(link_args, strmake("-Wl,--entry,%s", entry_point));
+
     strarray_add(link_args, spec_o_name);
 
     if (is_pe)
@@ -1677,6 +1685,11 @@ int main(int argc, char **argv)
                                 opts.subsystem = strdup( Wl->base[++j] );
                                 continue;
                             }
+                            if (!strcmp(Wl->base[j], "--entry") && j < Wl->size - 1)
+                            {
+                                opts.entry_point = strdup( Wl->base[++j] );
+                                continue;
+                            }
                             if (!strcmp(Wl->base[j], "-delayload") && j < Wl->size - 1)
                             {
                                 strarray_add( opts.delayimports, Wl->base[++j] );




More information about the wine-cvs mailing list