From e3d7a0d062c611f3410f3148bce265c5971fd67f Mon Sep 17 00:00:00 2001 From: Logan Chien Date: Thu, 17 Jan 2019 00:18:02 +0800 Subject: [PATCH] Add a header_abi_checker section This commit adds a header_abi_checker section so that the library owner can have a fine-grained control over the ABIs that must be checked. For example, a library "libexample" may have following configurations: cc_library { name: "libexample", header_abi_checker: { symbol_file: "libexample.map.txt", exclude_symbol_versions: ["LIBEXAMPLE_PRIVATE"], exclude_symbol_tags: ["platform", "apex"], }, } Bug: 122845490 Test: Add header_abi_checker to libc to filter out LIBC_PRIVATE Change-Id: I60cfea868f815afe6213c242ed0ca818161d55c6 --- cc/builder.go | 19 +++++++++++++++++-- cc/library.go | 18 +++++++++++++++++- 2 files changed, 34 insertions(+), 3 deletions(-) diff --git a/cc/builder.go b/cc/builder.go index b012d6f06..645b3c23c 100644 --- a/cc/builder.go +++ b/cc/builder.go @@ -663,18 +663,33 @@ func TransformObjToDynamicBinary(ctx android.ModuleContext, // Generate a rule to combine .dump sAbi dump files from multiple source files // into a single .ldump sAbi dump file func TransformDumpToLinkedDump(ctx android.ModuleContext, sAbiDumps android.Paths, soFile android.Path, - baseName, exportedHeaderFlags string) android.OptionalPath { + baseName, exportedHeaderFlags string, symbolFile android.OptionalPath, + excludedSymbolVersions, excludedSymbolTags []string) android.OptionalPath { + outputFile := android.PathForModuleOut(ctx, baseName+".lsdump") sabiLock.Lock() lsdumpPaths = append(lsdumpPaths, outputFile.String()) sabiLock.Unlock() + + implicits := android.Paths{soFile} symbolFilterStr := "-so " + soFile.String() + + if symbolFile.Valid() { + implicits = append(implicits, symbolFile.Path()) + symbolFilterStr += " -v " + symbolFile.String() + } + for _, ver := range excludedSymbolVersions { + symbolFilterStr += " --exclude-symbol-version " + ver + } + for _, tag := range excludedSymbolTags { + symbolFilterStr += " --exclude-symbol-tag " + tag + } ctx.Build(pctx, android.BuildParams{ Rule: sAbiLink, Description: "header-abi-linker " + outputFile.Base(), Output: outputFile, Inputs: sAbiDumps, - Implicit: soFile, + Implicits: implicits, Args: map[string]string{ "symbolFilter": symbolFilterStr, "arch": ctx.Arch().ArchType.Name, diff --git a/cc/library.go b/cc/library.go index ad07db47c..138ba43b0 100644 --- a/cc/library.go +++ b/cc/library.go @@ -87,6 +87,19 @@ type LibraryProperties struct { // binaries would be installed by default (in PRODUCT_PACKAGES) the other library will be removed // from PRODUCT_PACKAGES. Overrides []string + + // Properties for ABI compatibility checker + Header_abi_checker struct { + // Path to a symbol file that specifies the symbols to be included in the generated + // ABI dump file + Symbol_file *string + + // Symbol versions that should be ignored from the symbol file + Exclude_symbol_versions []string + + // Symbol tags that should be ignored from the symbol file + Exclude_symbol_tags []string + } } type LibraryMutatedProperties struct { @@ -760,7 +773,10 @@ func (library *libraryDecorator) linkSAbiDumpFiles(ctx ModuleContext, objs Objec SourceAbiFlags = append(SourceAbiFlags, reexportedInclude) } exportedHeaderFlags := strings.Join(SourceAbiFlags, " ") - library.sAbiOutputFile = TransformDumpToLinkedDump(ctx, objs.sAbiDumpFiles, soFile, fileName, exportedHeaderFlags) + library.sAbiOutputFile = TransformDumpToLinkedDump(ctx, objs.sAbiDumpFiles, soFile, fileName, exportedHeaderFlags, + android.OptionalPathForModuleSrc(ctx, library.Properties.Header_abi_checker.Symbol_file), + library.Properties.Header_abi_checker.Exclude_symbol_versions, + library.Properties.Header_abi_checker.Exclude_symbol_tags) refAbiDumpFile := getRefAbiDumpFile(ctx, vndkVersion, fileName) if refAbiDumpFile != nil {