Merge "Prohibit static executable in APEX" am: d8a3513155

Original change: https://android-review.googlesource.com/c/platform/build/soong/+/1779746

Change-Id: I59bfe18a8a11fbc8f145bd3bef3bff41855ac5a9
This commit is contained in:
Jiyong Park
2021-08-03 04:01:03 +00:00
committed by Automerger Merge Worker
2 changed files with 57 additions and 3 deletions

View File

@@ -1696,6 +1696,7 @@ func (a *apexBundle) GenerateAndroidBuildActions(ctx android.ModuleContext) {
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 @@ func (a *apexBundle) checkApexAvailability(ctx android.ModuleContext) {
})
}
// 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...)

View File

@@ -374,7 +374,6 @@ func TestBasicApex(t *testing.T) {
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 @@ func TestFilesInSubDir(t *testing.T) {
srcs: ["mylib.cpp"],
relative_install_path: "foo/bar",
system_shared_libs: [],
static_executable: true,
stl: "none",
apex_available: [ "myapex" ],
}
@@ -2554,7 +2552,6 @@ func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
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 TestApexJavaCoverage(t *testing.T) {
}
}
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())
}