Revert "Revert "Prohibit static executable in APEX""
This reverts commit 2125aab5043c05953505563ed505a7e64fc9f668.
Reason for revert: relanding along with a forward fix
Change-Id: Ib0283ca6beefa2f3073860287d00553ad0af6317
diff --git a/apex/apex.go b/apex/apex.go
index 0857946..e8bb9b7 100644
--- a/apex/apex.go
+++ b/apex/apex.go
@@ -1696,6 +1696,7 @@
a.checkUpdatable(ctx)
a.checkMinSdkVersion(ctx)
a.checkStaticLinkingToStubLibraries(ctx)
+ a.checkStaticExecutables(ctx)
if len(a.properties.Tests) > 0 && !a.testApex {
ctx.PropertyErrorf("tests", "property allowed only in apex_test module type")
return
@@ -2487,6 +2488,35 @@
})
}
+// checkStaticExecutable ensures that executables in an APEX are not static.
+func (a *apexBundle) checkStaticExecutables(ctx android.ModuleContext) {
+ ctx.VisitDirectDepsBlueprint(func(module blueprint.Module) {
+ if ctx.OtherModuleDependencyTag(module) != executableTag {
+ return
+ }
+ if cc, ok := module.(*cc.Module); ok && cc.StaticExecutable() {
+ apex := a.ApexVariationName()
+ exec := ctx.OtherModuleName(module)
+ if isStaticExecutableAllowed(apex, exec) {
+ return
+ }
+ ctx.ModuleErrorf("executable %s is static", ctx.OtherModuleName(module))
+ }
+ })
+}
+
+// A small list of exceptions where static executables are allowed in APEXes.
+func isStaticExecutableAllowed(apex string, exec string) bool {
+ m := map[string][]string{
+ "com.android.runtime": []string{
+ "linker",
+ "linkerconfig",
+ },
+ }
+ execNames, ok := m[apex]
+ return ok && android.InList(exec, execNames)
+}
+
// Collect information for opening IDE project files in java/jdeps.go.
func (a *apexBundle) IDEInfo(dpInfo *android.IdeInfo) {
dpInfo.Deps = append(dpInfo.Deps, a.properties.Java_libs...)
diff --git a/apex/apex_test.go b/apex/apex_test.go
index f58bf6c..1645c99 100644
--- a/apex/apex_test.go
+++ b/apex/apex_test.go
@@ -374,7 +374,6 @@
symlinks: ["foo_link_"],
symlink_preferred_arch: true,
system_shared_libs: [],
- static_executable: true,
stl: "none",
apex_available: [ "myapex", "com.android.gki.*" ],
}
@@ -2494,7 +2493,6 @@
srcs: ["mylib.cpp"],
relative_install_path: "foo/bar",
system_shared_libs: [],
- static_executable: true,
stl: "none",
apex_available: [ "myapex" ],
}
@@ -2554,7 +2552,6 @@
name: "mybin",
relative_install_path: "foo/bar",
system_shared_libs: [],
- static_executable: true,
stl: "none",
apex_available: [ "myapex" ],
native_bridge_supported: true,
@@ -8188,6 +8185,33 @@
}
}
+func TestProhibitStaticExecutable(t *testing.T) {
+ testApexError(t, `executable mybin is static`, `
+ apex {
+ name: "myapex",
+ key: "myapex.key",
+ binaries: ["mybin"],
+ min_sdk_version: "29",
+ }
+
+ apex_key {
+ name: "myapex.key",
+ public_key: "testkey.avbpubkey",
+ private_key: "testkey.pem",
+ }
+
+ cc_binary {
+ name: "mybin",
+ srcs: ["mylib.cpp"],
+ relative_install_path: "foo/bar",
+ static_executable: true,
+ system_shared_libs: [],
+ stl: "none",
+ apex_available: [ "myapex" ],
+ }
+ `)
+}
+
func TestMain(m *testing.M) {
os.Exit(m.Run())
}