diff --git a/compiler/rustc_target/src/spec/aarch64_unknown_yggdrasil.rs b/compiler/rustc_target/src/spec/aarch64_unknown_yggdrasil.rs index 76c4e32b9b4..00f3ff9d814 100644 --- a/compiler/rustc_target/src/spec/aarch64_unknown_yggdrasil.rs +++ b/compiler/rustc_target/src/spec/aarch64_unknown_yggdrasil.rs @@ -1,12 +1,15 @@ use crate::spec::{PanicStrategy, Target}; +// Have specific requirements about how segments are aligned +const LINKER_SCRIPT: &str = include_str!("./aarch64_unknown_yggdrasil_linker_script.ld"); + pub fn target() -> Target { let mut base = super::yggdrasil_base::opts(); base.disable_redzone = true; base.panic_strategy = PanicStrategy::Abort; base.features = "-fp-armv8,-neon,+strict-align,+v8a".into(); - base.add_pre_link_args(super::LinkerFlavor::Unix(super::Cc::No), &["--entry=runtime_entry"]); + base.link_script = Some(LINKER_SCRIPT.into()); Target { llvm_target: "aarch64-unknown-none".into(), diff --git a/compiler/rustc_target/src/spec/aarch64_unknown_yggdrasil_linker_script.ld b/compiler/rustc_target/src/spec/aarch64_unknown_yggdrasil_linker_script.ld new file mode 100644 index 00000000000..59cab5c5eb7 --- /dev/null +++ b/compiler/rustc_target/src/spec/aarch64_unknown_yggdrasil_linker_script.ld @@ -0,0 +1,34 @@ +OUTPUT_FORMAT(elf64-littleaarch64) +OUTPUT_ARCH(aarch64) +ENTRY(runtime_entry) + +BASE_ADDR = 0x400000; + +SECTIONS { + . = BASE_ADDR; + + .text : { + *(.text*) + *(.plt*) + } + + . = ALIGN(4K); + + .rodata : { + *(.rodata*) + } + + . = ALIGN(4K); + + .data : { + *(.data*) + *(.got*) + } + + . = ALIGN(4K); + + .bss : { + *(COMMON) + *(.bss*) + } +} diff --git a/compiler/rustc_target/src/spec/yggdrasil_base.rs b/compiler/rustc_target/src/spec/yggdrasil_base.rs index cf86a40671d..259ce92146c 100644 --- a/compiler/rustc_target/src/spec/yggdrasil_base.rs +++ b/compiler/rustc_target/src/spec/yggdrasil_base.rs @@ -1,13 +1,13 @@ use crate::spec::{Cc, LinkerFlavor, RelocModel, StackProbeType, TargetOptions}; -use super::LldFlavor; +use super::{Lld, LldFlavor}; pub fn opts() -> TargetOptions { TargetOptions { os: "yggdrasil".into(), executables: true, linker: Some("ld.lld".into()), - linker_flavor: LinkerFlavor::Unix(Cc::No), + linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes), lld_flavor_json: LldFlavor::Ld, stack_probes: StackProbeType::Inline, max_atomic_width: Some(128),