diff options
| author | Mazdak Farrokhzad <twingoow@gmail.com> | 2020-04-06 00:53:43 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-04-06 00:53:43 +0200 |
| commit | aafbe07af3eb9b497c5c24db0a5c7253b2125bbf (patch) | |
| tree | 7b3e41c22dd1e72db2296cbee22cc6f4bb5b7436 /src/librustc_codegen_ssa | |
| parent | be93b1cdc5fbc94d4ab0c58f4c1542c1e45da877 (diff) | |
| parent | 13bd25e4722a02f7b38797c7d116bfb9d1667e72 (diff) | |
| download | rust-aafbe07af3eb9b497c5c24db0a5c7253b2125bbf.tar.gz rust-aafbe07af3eb9b497c5c24db0a5c7253b2125bbf.zip | |
Rollup merge of #70665 - petrochenkov:linkargs, r=nagisa
Do not lose or reorder user-provided linker arguments Linker arguments are potentially order-dependent, so the order in which `-C link-arg` and `-C link-args` options are passed to `rustc` should be preserved when they are passed further to the linker. Also, multiple `-C link-args` options are now appended to each other rather than overwrite each other. In other words, `-C link-arg=a -C link-args="b c" -C link-args="d e" -C link-arg=f` is now passed as `"a" "b" "c" "d" "e" "f"` and not as `"d" "e" "a" "f"`. Addresses https://github.com/rust-lang/rust/pull/70505#issuecomment-606780163.
Diffstat (limited to 'src/librustc_codegen_ssa')
| -rw-r--r-- | src/librustc_codegen_ssa/back/link.rs | 24 |
1 files changed, 8 insertions, 16 deletions
diff --git a/src/librustc_codegen_ssa/back/link.rs b/src/librustc_codegen_ssa/back/link.rs index 1e780c5f867..49786bc3b06 100644 --- a/src/librustc_codegen_ssa/back/link.rs +++ b/src/librustc_codegen_ssa/back/link.rs @@ -505,10 +505,7 @@ fn link_natively<'a, B: ArchiveBuilder<'a>>( cmd.args(args); } } - if let Some(ref args) = sess.opts.debugging_opts.pre_link_args { - cmd.args(args); - } - cmd.args(&sess.opts.debugging_opts.pre_link_arg); + cmd.args(&sess.opts.debugging_opts.pre_link_args); if sess.target.target.options.is_like_fuchsia { let prefix = match sess.opts.debugging_opts.sanitizer { @@ -1302,18 +1299,17 @@ fn link_args<'a, B: ArchiveBuilder<'a>>( cmd.gc_sections(keep_metadata); } - let used_link_args = &codegen_results.crate_info.link_args; + let attr_link_args = codegen_results.crate_info.link_args.iter(); + let user_link_args: Vec<_> = + sess.opts.cg.link_args.iter().chain(attr_link_args).cloned().collect(); if crate_type == config::CrateType::Executable { let mut position_independent_executable = false; if t.options.position_independent_executables { - let empty_vec = Vec::new(); - let args = sess.opts.cg.link_args.as_ref().unwrap_or(&empty_vec); - let more_args = &sess.opts.cg.link_arg; - let mut args = args.iter().chain(more_args.iter()).chain(used_link_args.iter()); - - if is_pic(sess) && !sess.crt_static(Some(crate_type)) && !args.any(|x| *x == "-static") + if is_pic(sess) + && !sess.crt_static(Some(crate_type)) + && !user_link_args.iter().any(|x| x == "-static") { position_independent_executable = true; } @@ -1444,11 +1440,7 @@ fn link_args<'a, B: ArchiveBuilder<'a>>( // Finally add all the linker arguments provided on the command line along // with any #[link_args] attributes found inside the crate - if let Some(ref args) = sess.opts.cg.link_args { - cmd.args(args); - } - cmd.args(&sess.opts.cg.link_arg); - cmd.args(&used_link_args); + cmd.args(&user_link_args); } // # Native library linking |
