@@ -54,7 +54,6 @@ pub fn link_binary<'a, B: ArchiveBuilder<'a>>(
54
54
sess : & ' a Session ,
55
55
codegen_results : & CodegenResults ,
56
56
outputs : & OutputFilenames ,
57
- crate_name : & str ,
58
57
) {
59
58
let _timer = sess. timer ( "link_binary" ) ;
60
59
let output_metadata = sess. opts . output_types . contains_key ( & OutputType :: Metadata ) ;
@@ -87,7 +86,12 @@ pub fn link_binary<'a, B: ArchiveBuilder<'a>>(
87
86
. tempdir ( )
88
87
. unwrap_or_else ( |err| sess. fatal ( & format ! ( "couldn't create a temp dir: {}" , err) ) ) ;
89
88
let path = MaybeTempDir :: new ( tmpdir, sess. opts . cg . save_temps ) ;
90
- let out_filename = out_filename ( sess, crate_type, outputs, crate_name) ;
89
+ let out_filename = out_filename (
90
+ sess,
91
+ crate_type,
92
+ outputs,
93
+ & codegen_results. crate_info . local_crate_name . as_str ( ) ,
94
+ ) ;
91
95
match crate_type {
92
96
CrateType :: Rlib => {
93
97
let _timer = sess. timer ( "link_rlib" ) ;
@@ -143,97 +147,6 @@ pub fn link_binary<'a, B: ArchiveBuilder<'a>>(
143
147
} ) ;
144
148
}
145
149
146
- // The third parameter is for env vars, used on windows to set up the
147
- // path for MSVC to find its DLLs, and gcc to find its bundled
148
- // toolchain
149
- fn get_linker (
150
- sess : & Session ,
151
- linker : & Path ,
152
- flavor : LinkerFlavor ,
153
- self_contained : bool ,
154
- ) -> Command {
155
- let msvc_tool = windows_registry:: find_tool ( & sess. opts . target_triple . triple ( ) , "link.exe" ) ;
156
-
157
- // If our linker looks like a batch script on Windows then to execute this
158
- // we'll need to spawn `cmd` explicitly. This is primarily done to handle
159
- // emscripten where the linker is `emcc.bat` and needs to be spawned as
160
- // `cmd /c emcc.bat ...`.
161
- //
162
- // This worked historically but is needed manually since #42436 (regression
163
- // was tagged as #42791) and some more info can be found on #44443 for
164
- // emscripten itself.
165
- let mut cmd = match linker. to_str ( ) {
166
- Some ( linker) if cfg ! ( windows) && linker. ends_with ( ".bat" ) => Command :: bat_script ( linker) ,
167
- _ => match flavor {
168
- LinkerFlavor :: Lld ( f) => Command :: lld ( linker, f) ,
169
- LinkerFlavor :: Msvc if sess. opts . cg . linker . is_none ( ) && sess. target . linker . is_none ( ) => {
170
- Command :: new ( msvc_tool. as_ref ( ) . map_or ( linker, |t| t. path ( ) ) )
171
- }
172
- _ => Command :: new ( linker) ,
173
- } ,
174
- } ;
175
-
176
- // UWP apps have API restrictions enforced during Store submissions.
177
- // To comply with the Windows App Certification Kit,
178
- // MSVC needs to link with the Store versions of the runtime libraries (vcruntime, msvcrt, etc).
179
- let t = & sess. target ;
180
- if ( flavor == LinkerFlavor :: Msvc || flavor == LinkerFlavor :: Lld ( LldFlavor :: Link ) )
181
- && t. vendor == "uwp"
182
- {
183
- if let Some ( ref tool) = msvc_tool {
184
- let original_path = tool. path ( ) ;
185
- if let Some ( ref root_lib_path) = original_path. ancestors ( ) . nth ( 4 ) {
186
- let arch = match t. arch . as_str ( ) {
187
- "x86_64" => Some ( "x64" ) ,
188
- "x86" => Some ( "x86" ) ,
189
- "aarch64" => Some ( "arm64" ) ,
190
- "arm" => Some ( "arm" ) ,
191
- _ => None ,
192
- } ;
193
- if let Some ( ref a) = arch {
194
- // FIXME: Move this to `fn linker_with_args`.
195
- let mut arg = OsString :: from ( "/LIBPATH:" ) ;
196
- arg. push ( format ! ( "{}\\ lib\\ {}\\ store" , root_lib_path. display( ) , a) ) ;
197
- cmd. arg ( & arg) ;
198
- } else {
199
- warn ! ( "arch is not supported" ) ;
200
- }
201
- } else {
202
- warn ! ( "MSVC root path lib location not found" ) ;
203
- }
204
- } else {
205
- warn ! ( "link.exe not found" ) ;
206
- }
207
- }
208
-
209
- // The compiler's sysroot often has some bundled tools, so add it to the
210
- // PATH for the child.
211
- let mut new_path = sess. host_filesearch ( PathKind :: All ) . get_tools_search_paths ( self_contained) ;
212
- let mut msvc_changed_path = false ;
213
- if sess. target . is_like_msvc {
214
- if let Some ( ref tool) = msvc_tool {
215
- cmd. args ( tool. args ( ) ) ;
216
- for & ( ref k, ref v) in tool. env ( ) {
217
- if k == "PATH" {
218
- new_path. extend ( env:: split_paths ( v) ) ;
219
- msvc_changed_path = true ;
220
- } else {
221
- cmd. env ( k, v) ;
222
- }
223
- }
224
- }
225
- }
226
-
227
- if !msvc_changed_path {
228
- if let Some ( path) = env:: var_os ( "PATH" ) {
229
- new_path. extend ( env:: split_paths ( & path) ) ;
230
- }
231
- }
232
- cmd. env ( "PATH" , env:: join_paths ( new_path) . unwrap ( ) ) ;
233
-
234
- cmd
235
- }
236
-
237
150
pub fn each_linked_rlib (
238
151
info : & CrateInfo ,
239
152
f : & mut dyn FnMut ( CrateNum , & Path ) ,
@@ -1800,11 +1713,13 @@ fn linker_with_args<'a, B: ArchiveBuilder<'a>>(
1800
1713
codegen_results : & CodegenResults ,
1801
1714
) -> Command {
1802
1715
let crt_objects_fallback = crt_objects_fallback ( sess, crate_type) ;
1803
- let base_cmd = get_linker ( sess, path, flavor, crt_objects_fallback) ;
1804
- // FIXME: Move `/LIBPATH` addition for uwp targets from the linker construction
1805
- // to the linker args construction.
1806
- assert ! ( base_cmd. get_args( ) . is_empty( ) || sess. target. vendor == "uwp" ) ;
1807
- let cmd = & mut * codegen_results. linker_info . to_linker ( base_cmd, & sess, flavor) ;
1716
+ let cmd = & mut * super :: linker:: get_linker (
1717
+ sess,
1718
+ path,
1719
+ flavor,
1720
+ crt_objects_fallback,
1721
+ & codegen_results. crate_info . target_cpu ,
1722
+ ) ;
1808
1723
let link_output_kind = link_output_kind ( sess, crate_type) ;
1809
1724
1810
1725
// ------------ Early order-dependent options ------------
@@ -1814,7 +1729,11 @@ fn linker_with_args<'a, B: ArchiveBuilder<'a>>(
1814
1729
// dynamic library.
1815
1730
// Must be passed before any libraries to prevent the symbols to export from being thrown away,
1816
1731
// at least on some platforms (e.g. windows-gnu).
1817
- cmd. export_symbols ( tmpdir, crate_type) ;
1732
+ cmd. export_symbols (
1733
+ tmpdir,
1734
+ crate_type,
1735
+ & codegen_results. crate_info . exported_symbols [ & crate_type] ,
1736
+ ) ;
1818
1737
1819
1738
// Can be used for adding custom CRT objects or overriding order-dependent options above.
1820
1739
// FIXME: In practice built-in target specs use this for arbitrary order-independent options,
@@ -1986,10 +1905,10 @@ fn add_order_independent_options(
1986
1905
if flavor == LinkerFlavor :: PtxLinker {
1987
1906
// Provide the linker with fallback to internal `target-cpu`.
1988
1907
cmd. arg ( "--fallback-arch" ) ;
1989
- cmd. arg ( & codegen_results. linker_info . target_cpu ) ;
1908
+ cmd. arg ( & codegen_results. crate_info . target_cpu ) ;
1990
1909
} else if flavor == LinkerFlavor :: BpfLinker {
1991
1910
cmd. arg ( "--cpu" ) ;
1992
- cmd. arg ( & codegen_results. linker_info . target_cpu ) ;
1911
+ cmd. arg ( & codegen_results. crate_info . target_cpu ) ;
1993
1912
cmd. arg ( "--cpu-features" ) ;
1994
1913
cmd. arg ( match & sess. opts . cg . target_feature {
1995
1914
feat if !feat. is_empty ( ) => feat,
0 commit comments