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:
parent
03d488b48a
commit
55d5dcb1aa
@ -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 {
|
||||||
|
@ -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,
|
||||||
&[
|
&[
|
||||||
|
Loading…
x
Reference in New Issue
Block a user