Enforce apex.min_sdk_version for bundled builds
Previously, when Q-targeting apexes are bundled-built, they are built
against the latest stubs.
It was because unwinder is linked dynamically in R and APIs are provided
by libc while Q apexes should run on Q where libc doesn't provide those
APIs. To make Q apexes run on Q device, libc++ should be linked with
static unwinder. But, because libc++ with static unwinder may cause problem
on HWASAN build, Q apexes were built against the latest stubs for bundled
build.
However, Q apexes should be built against Q stubs.
Now, only for HWASAN builds, Q apexes are built against the latest stubs
(and native modules are not linked with static unwinder).
Bug: 151912436
Test: TARGET_SANITIZE=hwaddress m
=> Q apexes(media, resolv, ..) are linked with the latest stubs
m
=> Q apexes are linked with Q stubs,
and Q apexes' libc++ is linked with static unwinder
Merged-In: If32f1b547e6d93e3955c7521eec8aef5851f908c
Change-Id: If32f1b547e6d93e3955c7521eec8aef5851f908c
(cherry picked from commit 7406660685)
Exempt-From-Owner-Approval: cp from internal
Change-Id: If32f1b547e6d93e3955c7521eec8aef5851f908c
This commit is contained in:
33
cc/cc.go
33
cc/cc.go
@@ -488,6 +488,9 @@ type Module struct {
|
||||
makeLinkType string
|
||||
// Kythe (source file indexer) paths for this compilation module
|
||||
kytheFiles android.Paths
|
||||
|
||||
// For apex variants, this is set as apex.min_sdk_version
|
||||
apexSdkVersion int
|
||||
}
|
||||
|
||||
func (c *Module) Toc() android.OptionalPath {
|
||||
@@ -1209,7 +1212,7 @@ func (ctx *moduleContextImpl) apexName() string {
|
||||
}
|
||||
|
||||
func (ctx *moduleContextImpl) apexSdkVersion() int {
|
||||
return ctx.mod.ApexProperties.Info.MinSdkVersion
|
||||
return ctx.mod.apexSdkVersion
|
||||
}
|
||||
|
||||
func (ctx *moduleContextImpl) hasStubsVariants() bool {
|
||||
@@ -1847,7 +1850,10 @@ func (c *Module) DepsMutator(actx android.BottomUpMutatorContext) {
|
||||
}, depTag, lib)
|
||||
}
|
||||
|
||||
if deps.StaticUnwinderIfLegacy && ctx.Config().UnbundledBuild() {
|
||||
// staticUnwinderDep is treated as staticDep for Q apexes
|
||||
// so that native libraries/binaries are linked with static unwinder
|
||||
// because Q libc doesn't have unwinder APIs
|
||||
if deps.StaticUnwinderIfLegacy {
|
||||
actx.AddVariationDependencies([]blueprint.Variation{
|
||||
{Mutator: "link", Variation: "static"},
|
||||
}, staticUnwinderDepTag, staticUnwinder(actx))
|
||||
@@ -2231,9 +2237,22 @@ func (c *Module) depsToPaths(ctx android.ModuleContext) PathDeps {
|
||||
}
|
||||
}
|
||||
|
||||
// For the dependency from platform to apex, use the latest stubs
|
||||
c.apexSdkVersion = android.FutureApiLevel
|
||||
if !c.IsForPlatform() {
|
||||
c.apexSdkVersion = c.ApexProperties.Info.MinSdkVersion
|
||||
}
|
||||
|
||||
if android.InList("hwaddress", ctx.Config().SanitizeDevice()) {
|
||||
// In hwasan build, we override apexSdkVersion to the FutureApiLevel(10000)
|
||||
// so that even Q(29/Android10) apexes could use the dynamic unwinder by linking the newer stubs(e.g libc(R+)).
|
||||
// (b/144430859)
|
||||
c.apexSdkVersion = android.FutureApiLevel
|
||||
}
|
||||
|
||||
if depTag == staticUnwinderDepTag {
|
||||
// Use static unwinder for legacy (min_sdk_version = 29) apexes (b/144430859)
|
||||
if c.ShouldSupportAndroid10() {
|
||||
// Use static unwinder for legacy (min_sdk_version = 29) apexes (b/144430859)
|
||||
if c.apexSdkVersion <= android.SdkVersion_Android10 {
|
||||
depTag = StaticDepTag
|
||||
} else {
|
||||
return
|
||||
@@ -2287,8 +2306,7 @@ func (c *Module) depsToPaths(ctx android.ModuleContext) PathDeps {
|
||||
|
||||
// when to use (unspecified) stubs, check min_sdk_version and choose the right one
|
||||
if useThisDep && depIsStubs && !explicitlyVersioned {
|
||||
useLatest := c.IsForPlatform() || (c.ShouldSupportAndroid10() && !ctx.Config().UnbundledBuild())
|
||||
versionToUse, err := c.ChooseSdkVersion(ccDep.StubsVersions(), useLatest)
|
||||
versionToUse, err := c.ChooseSdkVersion(ccDep.StubsVersions(), c.apexSdkVersion)
|
||||
if err != nil {
|
||||
ctx.OtherModuleErrorf(dep, err.Error())
|
||||
return
|
||||
@@ -2311,8 +2329,7 @@ func (c *Module) depsToPaths(ctx android.ModuleContext) PathDeps {
|
||||
// if this is for use_vendor apex && dep has stubsVersions
|
||||
// apply the same rule of apex sdk enforcement to choose right version
|
||||
var err error
|
||||
useLatest := c.ShouldSupportAndroid10() && !ctx.Config().UnbundledBuild()
|
||||
versionToUse, err = c.ChooseSdkVersion(versions, useLatest)
|
||||
versionToUse, err = c.ChooseSdkVersion(versions, c.apexSdkVersion)
|
||||
if err != nil {
|
||||
ctx.OtherModuleErrorf(dep, err.Error())
|
||||
return
|
||||
|
||||
@@ -67,6 +67,20 @@ func GatherRequiredDepsForTest(oses ...android.OsType) string {
|
||||
src: "",
|
||||
}
|
||||
|
||||
cc_prebuilt_library_shared {
|
||||
name: "libclang_rt.hwasan-aarch64-android",
|
||||
nocrt: true,
|
||||
vendor_available: true,
|
||||
recovery_available: true,
|
||||
system_shared_libs: [],
|
||||
stl: "none",
|
||||
srcs: [""],
|
||||
check_elf_files: false,
|
||||
sanitize: {
|
||||
never: true,
|
||||
},
|
||||
}
|
||||
|
||||
toolchain_library {
|
||||
name: "libclang_rt.builtins-i686-android",
|
||||
vendor_available: true,
|
||||
|
||||
Reference in New Issue
Block a user