You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
99 lines
4.9 KiB
99 lines
4.9 KiB
From 3fdce19416e80a48c5b2b77b2cdec697d0b5e225 Mon Sep 17 00:00:00 2001
|
|
From: Josh Stone <jistone@redhat.com>
|
|
Date: Thu, 28 Sep 2023 18:18:16 -0700
|
|
Subject: [PATCH 2/2] set an external library path for wasm32-wasi
|
|
|
|
---
|
|
compiler/rustc_codegen_ssa/src/back/link.rs | 10 ++++++++++
|
|
compiler/rustc_target/src/spec/mod.rs | 4 ++++
|
|
.../rustc_target/src/spec/targets/wasm32_wasip1.rs | 7 ++++---
|
|
3 files changed, 18 insertions(+), 3 deletions(-)
|
|
|
|
diff --git a/compiler/rustc_codegen_ssa/src/back/link.rs b/compiler/rustc_codegen_ssa/src/back/link.rs
|
|
index e8143b9a5f38..5a928a18b3ea 100644
|
|
--- a/compiler/rustc_codegen_ssa/src/back/link.rs
|
|
+++ b/compiler/rustc_codegen_ssa/src/back/link.rs
|
|
@@ -1621,6 +1621,12 @@ fn get_object_file_path(sess: &Session, name: &str, self_contained: bool) -> Pat
|
|
return file_path;
|
|
}
|
|
}
|
|
+ if let Some(lib_path) = &sess.target.options.external_lib_path {
|
|
+ let file_path = Path::new(lib_path.as_ref()).join(name);
|
|
+ if file_path.exists() {
|
|
+ return file_path;
|
|
+ }
|
|
+ }
|
|
for search_path in sess.target_filesearch(PathKind::Native).search_paths() {
|
|
let file_path = search_path.dir.join(name);
|
|
if file_path.exists() {
|
|
@@ -2123,6 +2129,10 @@ fn add_library_search_dirs(
|
|
ControlFlow::<()>::Continue(())
|
|
},
|
|
);
|
|
+
|
|
+ if let Some(lib_path) = &sess.target.options.external_lib_path {
|
|
+ cmd.include_path(Path::new(lib_path.as_ref()));
|
|
+ }
|
|
}
|
|
|
|
/// Add options making relocation sections in the produced ELF files read-only
|
|
diff --git a/compiler/rustc_target/src/spec/mod.rs b/compiler/rustc_target/src/spec/mod.rs
|
|
index d5f227a84a4c..54c22c8ebed6 100644
|
|
--- a/compiler/rustc_target/src/spec/mod.rs
|
|
+++ b/compiler/rustc_target/src/spec/mod.rs
|
|
@@ -2053,6 +2053,7 @@ pub struct TargetOptions {
|
|
/// Objects to link before and after all other object code.
|
|
pub pre_link_objects: CrtObjects,
|
|
pub post_link_objects: CrtObjects,
|
|
+ pub external_lib_path: Option<StaticCow<str>>,
|
|
/// Same as `(pre|post)_link_objects`, but when self-contained linking mode is enabled.
|
|
pub pre_link_objects_self_contained: CrtObjects,
|
|
pub post_link_objects_self_contained: CrtObjects,
|
|
@@ -2540,6 +2541,7 @@ fn default() -> TargetOptions {
|
|
relro_level: RelroLevel::None,
|
|
pre_link_objects: Default::default(),
|
|
post_link_objects: Default::default(),
|
|
+ external_lib_path: None,
|
|
pre_link_objects_self_contained: Default::default(),
|
|
post_link_objects_self_contained: Default::default(),
|
|
link_self_contained: LinkSelfContainedDefault::False,
|
|
@@ -3221,6 +3223,7 @@ macro_rules! key {
|
|
key!(linker_is_gnu_json = "linker-is-gnu", bool);
|
|
key!(pre_link_objects = "pre-link-objects", link_objects);
|
|
key!(post_link_objects = "post-link-objects", link_objects);
|
|
+ key!(external_lib_path, optional);
|
|
key!(pre_link_objects_self_contained = "pre-link-objects-fallback", link_objects);
|
|
key!(post_link_objects_self_contained = "post-link-objects-fallback", link_objects);
|
|
// Deserializes the backwards-compatible variants of `-Clink-self-contained`
|
|
@@ -3482,6 +3485,7 @@ macro_rules! target_option_val {
|
|
target_option_val!(linker_is_gnu_json, "linker-is-gnu");
|
|
target_option_val!(pre_link_objects);
|
|
target_option_val!(post_link_objects);
|
|
+ target_option_val!(external_lib_path);
|
|
target_option_val!(pre_link_objects_self_contained, "pre-link-objects-fallback");
|
|
target_option_val!(post_link_objects_self_contained, "post-link-objects-fallback");
|
|
target_option_val!(link_args - pre_link_args_json, "pre-link-args");
|
|
diff --git a/compiler/rustc_target/src/spec/targets/wasm32_wasip1.rs b/compiler/rustc_target/src/spec/targets/wasm32_wasip1.rs
|
|
index 29e6dff2068f..dbe021ef064c 100644
|
|
--- a/compiler/rustc_target/src/spec/targets/wasm32_wasip1.rs
|
|
+++ b/compiler/rustc_target/src/spec/targets/wasm32_wasip1.rs
|
|
@@ -19,11 +19,12 @@ pub fn target() -> Target {
|
|
options.env = "p1".into();
|
|
options.add_pre_link_args(LinkerFlavor::WasmLld(Cc::Yes), &["--target=wasm32-wasi"]);
|
|
|
|
- options.pre_link_objects_self_contained = crt_objects::pre_wasi_self_contained();
|
|
- options.post_link_objects_self_contained = crt_objects::post_wasi_self_contained();
|
|
+ options.pre_link_objects = crt_objects::pre_wasi_self_contained();
|
|
+ options.post_link_objects = crt_objects::post_wasi_self_contained();
|
|
|
|
// FIXME: Figure out cases in which WASM needs to link with a native toolchain.
|
|
- options.link_self_contained = LinkSelfContainedDefault::True;
|
|
+ options.link_self_contained = LinkSelfContainedDefault::False;
|
|
+ options.external_lib_path = Some("/usr/wasm32-wasi/lib/wasm32-wasi".into());
|
|
|
|
// Right now this is a bit of a workaround but we're currently saying that
|
|
// the target by default has a static crt which we're taking as a signal
|
|
--
|
|
2.46.0
|
|
|