Skip to content

Commit 7e62240

Browse files
Add lld_link_script to TargetOptions
1 parent 8961b08 commit 7e62240

File tree

3 files changed

+39
-15
lines changed

3 files changed

+39
-15
lines changed

src/librustc_codegen_ssa/back/link.rs

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1179,6 +1179,34 @@ fn add_pre_link_args(
11791179
cmd.args(&sess.opts.debugging_opts.pre_link_args);
11801180
}
11811181

1182+
/// Add an LLD link script embedded in the target, if applicable.
1183+
fn add_lld_link_script(
1184+
cmd: &mut dyn Linker,
1185+
sess: &Session,
1186+
flavor: LinkerFlavor,
1187+
tmpdir: &Path,
1188+
crate_type: CrateType,
1189+
) {
1190+
match (flavor, crate_type, &sess.target.target.options.lld_link_script) {
1191+
(
1192+
LinkerFlavor::Lld(LldFlavor::Ld),
1193+
CrateType::Cdylib | CrateType::Executable,
1194+
Some(script),
1195+
) => {
1196+
let file_name = ["rustc", &sess.target.target.llvm_target, "linkfile.ld"].join("-");
1197+
1198+
let path = tmpdir.join(file_name);
1199+
if let Err(e) = fs::write(&path, script) {
1200+
sess.fatal(&format!("failed to write link script to {}: {}", path.display(), e));
1201+
}
1202+
1203+
cmd.arg("--script");
1204+
cmd.arg(path);
1205+
}
1206+
_ => {}
1207+
}
1208+
}
1209+
11821210
/// Add arbitrary "user defined" args defined from command line and by `#[link_args]` attributes.
11831211
/// FIXME: Determine where exactly these args need to be inserted.
11841212
fn add_user_defined_link_args(
@@ -1421,6 +1449,9 @@ fn linker_with_args<'a, B: ArchiveBuilder<'a>>(
14211449
// NO-OPT-OUT, OBJECT-FILES-MAYBE, CUSTOMIZATION-POINT
14221450
add_pre_link_args(cmd, sess, flavor, crate_type);
14231451

1452+
// NO-OPT-OUT
1453+
add_lld_link_script(cmd, sess, flavor, tmpdir, crate_type);
1454+
14241455
// NO-OPT-OUT, OBJECT-FILES-NO, AUDIT-ORDER
14251456
if sess.target.target.options.is_like_fuchsia {
14261457
let prefix = match sess.opts.debugging_opts.sanitizer {

src/librustc_target/spec/mipsel_sony_psp.rs

Lines changed: 2 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,14 @@
11
use crate::spec::{LinkArgs, LinkerFlavor, LldFlavor, RelocModel};
22
use crate::spec::{Target, TargetOptions, TargetResult};
3-
use std::{env, fs, io, path::PathBuf};
43

54
// The PSP has custom linker requirements.
65
const LINKER_SCRIPT: &str = include_str!("./mipsel_sony_psp_linker_script.ld");
76

8-
fn write_script() -> io::Result<PathBuf> {
9-
let path = env::temp_dir().join("rustc-mipsel-sony-psp-linkfile.ld");
10-
fs::write(&path, LINKER_SCRIPT)?;
11-
Ok(path)
12-
}
13-
147
pub fn target() -> TargetResult {
15-
let script = write_script().map_err(|e| format!("failed to write link script: {}", e))?;
16-
178
let mut pre_link_args = LinkArgs::new();
189
pre_link_args.insert(
1910
LinkerFlavor::Lld(LldFlavor::Ld),
20-
vec![
21-
"--eh-frame-hdr".to_string(),
22-
"--emit-relocs".to_string(),
23-
"--script".to_string(),
24-
script.display().to_string(),
25-
],
11+
vec!["--eh-frame-hdr".to_string(), "--emit-relocs".to_string()],
2612
);
2713

2814
Ok(Target {
@@ -49,6 +35,7 @@ pub fn target() -> TargetResult {
4935
// PSP does not support trap-on-condition instructions.
5036
llvm_args: vec!["-mno-check-zero-division".to_string()],
5137
pre_link_args,
38+
lld_link_script: Some(LINKER_SCRIPT.to_string()),
5239
..Default::default()
5340
},
5441
})

src/librustc_target/spec/mod.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -668,6 +668,9 @@ pub struct TargetOptions {
668668
/// Linker arguments that are unconditionally passed *after* any
669669
/// user-defined libraries.
670670
pub post_link_args: LinkArgs,
671+
/// Optional LLD link script applied to `dylib` and `executable` crate
672+
/// types. This is a string containing the script, not a path.
673+
pub lld_link_script: Option<String>,
671674

672675
/// Environment variables to be set for the linker invocation.
673676
pub link_env: Vec<(String, String)>,
@@ -897,6 +900,7 @@ impl Default for TargetOptions {
897900
pre_link_args: LinkArgs::new(),
898901
pre_link_args_crt: LinkArgs::new(),
899902
post_link_args: LinkArgs::new(),
903+
lld_link_script: None,
900904
asm_args: Vec::new(),
901905
cpu: "generic".to_string(),
902906
features: String::new(),
@@ -1246,6 +1250,7 @@ impl Target {
12461250
key!(post_link_objects, list);
12471251
key!(post_link_objects_crt, list);
12481252
key!(post_link_args, link_args);
1253+
key!(lld_link_script, optional);
12491254
key!(link_env, env);
12501255
key!(link_env_remove, list);
12511256
key!(asm_args, list);
@@ -1475,6 +1480,7 @@ impl ToJson for Target {
14751480
target_option_val!(post_link_objects);
14761481
target_option_val!(post_link_objects_crt);
14771482
target_option_val!(link_args - post_link_args);
1483+
target_option_val!(lld_link_script);
14781484
target_option_val!(env - link_env);
14791485
target_option_val!(link_env_remove);
14801486
target_option_val!(asm_args);

0 commit comments

Comments
 (0)