Prevent statically linking to a lib providing stable C APIs
A lib providing stable C APIs should be available only to the APEX containing the library. It shouldn't be available to other APEXes, especially via static linking. This change also fixes a bug that llndkImplDep (the dependency from llndk stub to its implementation library) was recognized as being in the same APEX. Bug: 151051671 Test: m Change-Id: Ifda7f4a367f68afcde93c86cda45a28cacd91f99
This commit is contained in:
39
apex/apex.go
39
apex/apex.go
@@ -1858,6 +1858,44 @@ func (a *apexBundle) checkUpdatable(ctx android.ModuleContext) {
|
||||
}
|
||||
}
|
||||
|
||||
// Ensures that a lib providing stub isn't statically linked
|
||||
func (a *apexBundle) checkStaticLinkingToStubLibraries(ctx android.ModuleContext) {
|
||||
// Practically, we only care about regular APEXes on the device.
|
||||
if ctx.Host() || a.testApex || a.vndkApex {
|
||||
return
|
||||
}
|
||||
|
||||
a.walkPayloadDeps(ctx, func(ctx android.ModuleContext, from blueprint.Module, to android.ApexModule, externalDep bool) bool {
|
||||
if ccm, ok := to.(*cc.Module); ok {
|
||||
apexName := ctx.ModuleName()
|
||||
fromName := ctx.OtherModuleName(from)
|
||||
toName := ctx.OtherModuleName(to)
|
||||
|
||||
// If `to` is not actually in the same APEX as `from` then it does not need apex_available and neither
|
||||
// do any of its dependencies.
|
||||
if am, ok := from.(android.DepIsInSameApex); ok && !am.DepIsInSameApex(ctx, to) {
|
||||
// As soon as the dependency graph crosses the APEX boundary, don't go further.
|
||||
return false
|
||||
}
|
||||
|
||||
// The dynamic linker and crash_dump tool in the runtime APEX is the only exception to this rule.
|
||||
// It can't make the static dependencies dynamic because it can't
|
||||
// do the dynamic linking for itself.
|
||||
if apexName == "com.android.runtime" && (fromName == "linker" || fromName == "crash_dump") {
|
||||
return false
|
||||
}
|
||||
|
||||
isStubLibraryFromOtherApex := ccm.HasStubsVariants() && !android.DirectlyInApex(apexName, toName)
|
||||
if isStubLibraryFromOtherApex && !externalDep {
|
||||
ctx.ModuleErrorf("%q required by %q is a native library providing stub. "+
|
||||
"It shouldn't be included in this APEX via static linking. Dependency path: %s", to.String(), fromName, ctx.GetPathString(false))
|
||||
}
|
||||
|
||||
}
|
||||
return true
|
||||
})
|
||||
}
|
||||
|
||||
func (a *apexBundle) GenerateAndroidBuildActions(ctx android.ModuleContext) {
|
||||
buildFlattenedAsDefault := ctx.Config().FlattenApex() && !ctx.Config().UnbundledBuild()
|
||||
switch a.properties.ApexType {
|
||||
@@ -1895,6 +1933,7 @@ func (a *apexBundle) GenerateAndroidBuildActions(ctx android.ModuleContext) {
|
||||
|
||||
a.checkApexAvailability(ctx)
|
||||
a.checkUpdatable(ctx)
|
||||
a.checkStaticLinkingToStubLibraries(ctx)
|
||||
|
||||
handleSpecialLibs := !android.Bool(a.properties.Ignore_system_library_special_case)
|
||||
|
||||
|
Reference in New Issue
Block a user