rustc_target/spec/base/
windows_gnu.rs1use std::borrow::Cow;
2
3use crate::spec::{
4    BinaryFormat, Cc, DebuginfoKind, LinkSelfContainedDefault, LinkerFlavor, Lld, SplitDebuginfo,
5    TargetOptions, add_link_args, crt_objects, cvs,
6};
7
8pub(crate) fn opts() -> TargetOptions {
9    let mut pre_link_args = TargetOptions::link_args(
10        LinkerFlavor::Gnu(Cc::No, Lld::No),
11        &[
12            "--dynamicbase",
14            "--disable-auto-image-base",
16        ],
17    );
18    add_link_args(
19        &mut pre_link_args,
20        LinkerFlavor::Gnu(Cc::Yes, Lld::No),
21        &[
22            "-fno-use-linker-plugin",
25            "-Wl,--dynamicbase",
26            "-Wl,--disable-auto-image-base",
27        ],
28    );
29
30    let mingw_libs = &[
33        "-lmsvcrt",
34        "-lmingwex",
35        "-lmingw32",
36        "-lgcc", "-lmsvcrt",
45        "-lmingwex",
48        "-luser32",
49        "-lkernel32",
50    ];
51    let mut late_link_args =
52        TargetOptions::link_args(LinkerFlavor::Gnu(Cc::No, Lld::No), mingw_libs);
53    add_link_args(&mut late_link_args, LinkerFlavor::Gnu(Cc::Yes, Lld::No), mingw_libs);
54    let dynamic_unwind_libs = &["-lgcc_s"];
58    let mut late_link_args_dynamic =
59        TargetOptions::link_args(LinkerFlavor::Gnu(Cc::No, Lld::No), dynamic_unwind_libs);
60    add_link_args(
61        &mut late_link_args_dynamic,
62        LinkerFlavor::Gnu(Cc::Yes, Lld::No),
63        dynamic_unwind_libs,
64    );
65    let static_unwind_libs = &["-lgcc_eh", "-l:libpthread.a"];
71    let mut late_link_args_static =
72        TargetOptions::link_args(LinkerFlavor::Gnu(Cc::No, Lld::No), static_unwind_libs);
73    add_link_args(
74        &mut late_link_args_static,
75        LinkerFlavor::Gnu(Cc::Yes, Lld::No),
76        static_unwind_libs,
77    );
78
79    TargetOptions {
80        os: "windows".into(),
81        env: "gnu".into(),
82        vendor: "pc".into(),
83        function_sections: false,
85        linker: Some("gcc".into()),
86        dynamic_linking: true,
87        dll_tls_export: false,
88        dll_prefix: "".into(),
89        dll_suffix: ".dll".into(),
90        exe_suffix: ".exe".into(),
91        families: cvs!["windows"],
92        is_like_windows: true,
93        binary_format: BinaryFormat::Coff,
94        allows_weak_linkage: false,
95        pre_link_args,
96        pre_link_objects: crt_objects::pre_mingw(),
97        post_link_objects: crt_objects::post_mingw(),
98        pre_link_objects_self_contained: crt_objects::pre_mingw_self_contained(),
99        post_link_objects_self_contained: crt_objects::post_mingw_self_contained(),
100        link_self_contained: LinkSelfContainedDefault::InferredForMingw,
101        late_link_args,
102        late_link_args_dynamic,
103        late_link_args_static,
104        abi_return_struct_as_int: true,
105        emit_debug_gdb_scripts: false,
106        requires_uwtable: true,
107        eh_frame_header: false,
108        debuginfo_kind: DebuginfoKind::Dwarf,
109        supported_split_debuginfo: Cow::Borrowed(&[SplitDebuginfo::Off]),
112        ..Default::default()
113    }
114}