Add prebuilt ABI checker support to soong

This commit adds prebuilt ABI checker support to soong so that
`cc_prebuilt_library_shared` and `cc_prebuilt_binary` are checked.

To opt out the check, add `check_elf_files: false` to your module.

Bug: 119086738
Test: lunch aosp_sailfish-userdebug && CHECK_ELF_FILES=true make check-elf-files
Change-Id: Idb4290c8f48aad545894a7ae718a537cbf832233
This commit is contained in:
Logan Chien 2018-11-20 11:59:08 +08:00
parent 5c7c78a2e0
commit 4fcea3d9a3
4 changed files with 50 additions and 0 deletions

View File

@ -195,6 +195,8 @@ type productVariables struct {
Arc *bool `json:",omitempty"` Arc *bool `json:",omitempty"`
MinimizeJavaDebugInfo *bool `json:",omitempty"` MinimizeJavaDebugInfo *bool `json:",omitempty"`
Check_elf_files *bool `json:",omitempty"`
UncompressPrivAppDex *bool `json:",omitempty"` UncompressPrivAppDex *bool `json:",omitempty"`
ModulesLoadedByPrivilegedModules []string `json:",omitempty"` ModulesLoadedByPrivilegedModules []string `json:",omitempty"`

View File

@ -362,3 +362,40 @@ func (c *vendorPublicLibraryStubDecorator) AndroidMk(ctx AndroidMkContext, ret *
fmt.Fprintln(w, "LOCAL_NO_NOTICE_FILE := true") fmt.Fprintln(w, "LOCAL_NO_NOTICE_FILE := true")
}) })
} }
func (p *prebuiltLinker) AndroidMk(ctx AndroidMkContext, ret *android.AndroidMkData) {
ret.Extra = append(ret.Extra, func(w io.Writer, outputFile android.Path) {
if p.properties.Check_elf_files != nil {
fmt.Fprintln(w, "LOCAL_CHECK_ELF_FILES :=", *p.properties.Check_elf_files)
} else {
// soong_cc_prebuilt.mk does not include check_elf_file.mk by default
// because cc_library_shared and cc_binary use soong_cc_prebuilt.mk as well.
// In order to turn on prebuilt ABI checker, set `LOCAL_CHECK_ELF_FILES` to
// true if `p.properties.Check_elf_files` is not specified.
fmt.Fprintln(w, "LOCAL_CHECK_ELF_FILES := true")
}
})
}
func (p *prebuiltLibraryLinker) AndroidMk(ctx AndroidMkContext, ret *android.AndroidMkData) {
ctx.subAndroidMk(ret, p.libraryDecorator)
if p.shared() {
ctx.subAndroidMk(ret, &p.prebuiltLinker)
androidMkWriteAllowUndefinedSymbols(p.baseLinker, ret)
}
}
func (p *prebuiltBinaryLinker) AndroidMk(ctx AndroidMkContext, ret *android.AndroidMkData) {
ctx.subAndroidMk(ret, p.binaryDecorator)
ctx.subAndroidMk(ret, &p.prebuiltLinker)
androidMkWriteAllowUndefinedSymbols(p.baseLinker, ret)
}
func androidMkWriteAllowUndefinedSymbols(linker *baseLinker, ret *android.AndroidMkData) {
ret.Extra = append(ret.Extra, func(w io.Writer, outputFile android.Path) {
allow := linker.Properties.Allow_undefined_symbols
if allow != nil {
fmt.Fprintln(w, "LOCAL_ALLOW_UNDEFINED_SYMBOLS :=", *allow)
}
})
}

View File

@ -31,8 +31,13 @@ type prebuiltLinkerInterface interface {
type prebuiltLinker struct { type prebuiltLinker struct {
android.Prebuilt android.Prebuilt
properties struct { properties struct {
Srcs []string `android:"arch_variant"` Srcs []string `android:"arch_variant"`
// Check the prebuilt ELF files (e.g. DT_SONAME, DT_NEEDED, resolution of undefined
// symbols, etc), default true.
Check_elf_files *bool
} }
} }

View File

@ -60,6 +60,10 @@ type vndkPrebuiltProperties struct {
// Prebuilt files for each arch. // Prebuilt files for each arch.
Srcs []string `android:"arch_variant"` Srcs []string `android:"arch_variant"`
// Check the prebuilt ELF files (e.g. DT_SONAME, DT_NEEDED, resolution of undefined symbols,
// etc).
Check_elf_files *bool
} }
type vndkPrebuiltLibraryDecorator struct { type vndkPrebuiltLibraryDecorator struct {
@ -155,6 +159,8 @@ func vndkPrebuiltSharedLibrary() *Module {
libraryDecorator: library, libraryDecorator: library,
} }
prebuilt.properties.Check_elf_files = BoolPtr(false)
module.compiler = nil module.compiler = nil
module.linker = prebuilt module.linker = prebuilt
module.installer = prebuilt module.installer = prebuilt