Fix flags when using clang as linker for Fuchsia

Don't add C runtime or set dynamic linker when linking with clang for
Fuchsia. Clang already does this for us.
This commit is contained in:
Tyler Mandry 2022-07-20 02:30:29 -07:00
parent 03d488b48a
commit 55d5dcb1aa
2 changed files with 21 additions and 4 deletions

View File

@ -1551,12 +1551,21 @@ fn crt_objects_fallback(sess: &Session, crate_type: CrateType) -> bool {
fn add_pre_link_objects( fn add_pre_link_objects(
cmd: &mut dyn Linker, cmd: &mut dyn Linker,
sess: &Session, sess: &Session,
flavor: LinkerFlavor,
link_output_kind: LinkOutputKind, link_output_kind: LinkOutputKind,
self_contained: bool, self_contained: bool,
) { ) {
// FIXME: we are currently missing some infra here (per-linker-flavor CRT objects),
// so Fuchsia has to be special-cased.
let opts = &sess.target; let opts = &sess.target;
let objects = let empty = Default::default();
if self_contained { &opts.pre_link_objects_fallback } else { &opts.pre_link_objects }; let objects = if self_contained {
&opts.pre_link_objects_fallback
} else if !(sess.target.os == "fuchsia" && flavor == LinkerFlavor::Gcc) {
&opts.pre_link_objects
} else {
&empty
};
for obj in objects.get(&link_output_kind).iter().copied().flatten() { for obj in objects.get(&link_output_kind).iter().copied().flatten() {
cmd.add_object(&get_object_file_path(sess, obj, self_contained)); cmd.add_object(&get_object_file_path(sess, obj, self_contained));
} }
@ -1881,7 +1890,7 @@ fn linker_with_args<'a, B: ArchiveBuilder<'a>>(
// ------------ Object code and libraries, order-dependent ------------ // ------------ Object code and libraries, order-dependent ------------
// Pre-link CRT objects. // Pre-link CRT objects.
add_pre_link_objects(cmd, sess, link_output_kind, crt_objects_fallback); add_pre_link_objects(cmd, sess, flavor, link_output_kind, crt_objects_fallback);
add_linked_symbol_object( add_linked_symbol_object(
cmd, cmd,
@ -2018,7 +2027,10 @@ fn add_order_independent_options(
add_link_script(cmd, sess, tmpdir, crate_type); add_link_script(cmd, sess, tmpdir, crate_type);
if sess.target.os == "fuchsia" && crate_type == CrateType::Executable { if sess.target.os == "fuchsia"
&& crate_type == CrateType::Executable
&& flavor != LinkerFlavor::Gcc
{
let prefix = if sess.opts.unstable_opts.sanitizer.contains(SanitizerSet::ADDRESS) { let prefix = if sess.opts.unstable_opts.sanitizer.contains(SanitizerSet::ADDRESS) {
"asan/" "asan/"
} else { } else {

View File

@ -1,6 +1,11 @@
use crate::spec::{crt_objects, cvs, LinkOutputKind, LinkerFlavor, LldFlavor, TargetOptions}; use crate::spec::{crt_objects, cvs, LinkOutputKind, LinkerFlavor, LldFlavor, TargetOptions};
pub fn opts() -> TargetOptions { pub fn opts() -> TargetOptions {
// This mirrors the linker options provided by clang. We presume lld for
// now. When using clang as the linker it will supply these options for us,
// so we only list them for ld/lld.
//
// https://github.com/llvm/llvm-project/blob/db9322b2066c55254e7691efeab863f43bfcc084/clang/lib/Driver/ToolChains/Fuchsia.cpp#L31
let pre_link_args = TargetOptions::link_args( let pre_link_args = TargetOptions::link_args(
LinkerFlavor::Ld, LinkerFlavor::Ld,
&[ &[