summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--rust/binary_test.go17
-rw-r--r--rust/builder.go9
-rw-r--r--rust/rust.go6
3 files changed, 31 insertions, 1 deletions
diff --git a/rust/binary_test.go b/rust/binary_test.go
index 86f50d3e4..968c0c1ff 100644
--- a/rust/binary_test.go
+++ b/rust/binary_test.go
@@ -114,6 +114,23 @@ func TestBinaryFlags(t *testing.T) {
}
}
+// Test that the bootstrap property sets the appropriate linker
+func TestBootstrap(t *testing.T) {
+ ctx := testRust(t, `
+ rust_binary {
+ name: "foo",
+ srcs: ["foo.rs"],
+ bootstrap: true,
+ }`)
+
+ foo := ctx.ModuleForTests("foo", "android_arm64_armv8-a").Rule("rustc")
+
+ flag := "-Wl,-dynamic-linker,/system/bin/bootstrap/linker64"
+ if !strings.Contains(foo.Args["linkFlags"], flag) {
+ t.Errorf("missing link flag to use bootstrap linker, expecting %#v, linkFlags: %#v", flag, foo.Args["linkFlags"])
+ }
+}
+
func TestStaticBinaryFlags(t *testing.T) {
ctx := testRust(t, `
rust_binary {
diff --git a/rust/builder.go b/rust/builder.go
index 6db508d64..523428db2 100644
--- a/rust/builder.go
+++ b/rust/builder.go
@@ -220,6 +220,15 @@ func transformSrctoCrate(ctx ModuleContext, main android.Path, deps PathDeps, fl
linkFlags = append(linkFlags, flags.GlobalLinkFlags...)
linkFlags = append(linkFlags, flags.LinkFlags...)
+ // Check if this module needs to use the bootstrap linker
+ if ctx.RustModule().Bootstrap() && !ctx.RustModule().InRecovery() && !ctx.RustModule().InRamdisk() && !ctx.RustModule().InVendorRamdisk() {
+ dynamicLinker := "-Wl,-dynamic-linker,/system/bin/bootstrap/linker"
+ if ctx.toolchain().Is64Bit() {
+ dynamicLinker += "64"
+ }
+ linkFlags = append(linkFlags, dynamicLinker)
+ }
+
libFlags := makeLibFlags(deps)
// Collect dependencies
diff --git a/rust/rust.go b/rust/rust.go
index 52b409435..931cb9dde 100644
--- a/rust/rust.go
+++ b/rust/rust.go
@@ -85,6 +85,10 @@ type BaseProperties struct {
VendorRamdiskVariantNeeded bool `blueprint:"mutated"`
ExtraVariants []string `blueprint:"mutated"`
+ // Allows this module to use non-APEX version of libraries. Useful
+ // for building binaries that are started before APEXes are activated.
+ Bootstrap *bool
+
// Used by vendor snapshot to record dependencies from snapshot modules.
SnapshotSharedLibs []string `blueprint:"mutated"`
SnapshotStaticLibs []string `blueprint:"mutated"`
@@ -288,7 +292,7 @@ func (mod *Module) UseVndk() bool {
}
func (mod *Module) Bootstrap() bool {
- return false
+ return Bool(mod.Properties.Bootstrap)
}
func (mod *Module) MustUseVendorVariant() bool {