]> git.lizzy.rs Git - rust.git/blobdiff - src/librustc_target/spec/windows_base.rs
Rollup merge of #70038 - DutchGhost:const-forget-tests, r=RalfJung
[rust.git] / src / librustc_target / spec / windows_base.rs
index ce7b338345caf6e4fed10c2c7313e40d42ca9cbd..188548b41fe75fda00784adf71f26e4f4ff2e0e8 100644 (file)
@@ -3,36 +3,66 @@
 
 pub fn opts() -> TargetOptions {
     let mut pre_link_args = LinkArgs::new();
-    pre_link_args.insert(LinkerFlavor::Gcc, vec![
+    pre_link_args.insert(
+        LinkerFlavor::Gcc,
+        vec![
             // Tell GCC to avoid linker plugins, because we are not bundling
             // them with Windows installer, and Rust does its own LTO anyways.
             "-fno-use-linker-plugin".to_string(),
-
             // Always enable DEP (NX bit) when it is available
             "-Wl,--nxcompat".to_string(),
-
             // Do not use the standard system startup files or libraries when linking
             "-nostdlib".to_string(),
-        ]);
+        ],
+    );
 
     let mut late_link_args = LinkArgs::new();
-    late_link_args.insert(LinkerFlavor::Gcc, vec![
-        "-lmingwex".to_string(),
-        "-lmingw32".to_string(),
-        "-lgcc".to_string(), // alas, mingw* libraries above depend on libgcc
-        "-lmsvcrt".to_string(),
-        // mingw's msvcrt is a weird hybrid import library and static library.
-        // And it seems that the linker fails to use import symbols from msvcrt
-        // that are required from functions in msvcrt in certain cases. For example
-        // `_fmode` that is used by an implementation of `__p__fmode` in x86_64.
-        // Listing the library twice seems to fix that, and seems to also be done
-        // by mingw's gcc (Though not sure if it's done on purpose, or by mistake).
-        //
-        // See https://github.com/rust-lang/rust/pull/47483
-        "-lmsvcrt".to_string(),
-        "-luser32".to_string(),
-        "-lkernel32".to_string(),
-    ]);
+    let mut late_link_args_dynamic = LinkArgs::new();
+    let mut late_link_args_static = LinkArgs::new();
+    late_link_args.insert(
+        LinkerFlavor::Gcc,
+        vec![
+            "-lmingwex".to_string(),
+            "-lmingw32".to_string(),
+            "-lmsvcrt".to_string(),
+            // mingw's msvcrt is a weird hybrid import library and static library.
+            // And it seems that the linker fails to use import symbols from msvcrt
+            // that are required from functions in msvcrt in certain cases. For example
+            // `_fmode` that is used by an implementation of `__p__fmode` in x86_64.
+            // Listing the library twice seems to fix that, and seems to also be done
+            // by mingw's gcc (Though not sure if it's done on purpose, or by mistake).
+            //
+            // See https://github.com/rust-lang/rust/pull/47483
+            "-lmsvcrt".to_string(),
+            "-luser32".to_string(),
+            "-lkernel32".to_string(),
+        ],
+    );
+    late_link_args_dynamic.insert(
+        LinkerFlavor::Gcc,
+        vec![
+            // If any of our crates are dynamically linked then we need to use
+            // the shared libgcc_s-dw2-1.dll. This is required to support
+            // unwinding across DLL boundaries.
+            "-lgcc_s".to_string(),
+            "-lgcc".to_string(),
+            "-lkernel32".to_string(),
+        ],
+    );
+    late_link_args_static.insert(
+        LinkerFlavor::Gcc,
+        vec![
+            // If all of our crates are statically linked then we can get away
+            // with statically linking the libgcc unwinding code. This allows
+            // binaries to be redistributed without the libgcc_s-dw2-1.dll
+            // dependency, but unfortunately break unwinding across DLL
+            // boundaries when unwinding across FFI boundaries.
+            "-lgcc".to_string(),
+            "-lgcc_eh".to_string(),
+            "-lpthread".to_string(),
+            "-lkernel32".to_string(),
+        ],
+    );
 
     TargetOptions {
         // FIXME(#13846) this should be enabled for windows
@@ -59,14 +89,13 @@ pub fn opts() -> TargetOptions {
             "rsbegin.o".to_string(),
         ],
         late_link_args,
-        post_link_objects: vec![
-            "rsend.o".to_string()
-        ],
-        custom_unwind_resume: true,
+        late_link_args_dynamic,
+        late_link_args_static,
+        post_link_objects: vec!["rsend.o".to_string()],
         abi_return_struct_as_int: true,
         emit_debug_gdb_scripts: false,
         requires_uwtable: true,
 
-        .. Default::default()
+        ..Default::default()
     }
 }