Merge "fuzz packaging: implement system/vendor split" into main

This commit is contained in:
Steven Moreland 2024-01-03 22:14:24 +00:00 committed by Gerrit Code Review
commit 62d10495eb
2 changed files with 43 additions and 13 deletions

View file

@ -144,20 +144,25 @@ func (fuzzBin *fuzzBinary) linkerDeps(ctx DepsContext, deps Deps) Deps {
}
func (fuzz *fuzzBinary) linkerFlags(ctx ModuleContext, flags Flags) Flags {
subdir := "lib"
if ctx.inVendor() {
subdir = "lib/vendor"
}
flags = fuzz.binaryDecorator.linkerFlags(ctx, flags)
// RunPaths on devices isn't instantiated by the base linker. `../lib` for
// installed fuzz targets (both host and device), and `./lib` for fuzz
// target packages.
flags.Local.LdFlags = append(flags.Local.LdFlags, `-Wl,-rpath,\$$ORIGIN/lib`)
flags.Local.LdFlags = append(flags.Local.LdFlags, `-Wl,-rpath,\$$ORIGIN/`+subdir)
// When running on device, fuzz targets with vendor: true set will be in
// fuzzer_name/vendor/fuzzer_name (note the extra 'vendor' and thus need to
// link with libraries in ../../lib/. Non-vendor binaries only need to look
// one level up, in ../lib/.
if ctx.inVendor() {
flags.Local.LdFlags = append(flags.Local.LdFlags, `-Wl,-rpath,\$$ORIGIN/../../lib`)
flags.Local.LdFlags = append(flags.Local.LdFlags, `-Wl,-rpath,\$$ORIGIN/../../`+subdir)
} else {
flags.Local.LdFlags = append(flags.Local.LdFlags, `-Wl,-rpath,\$$ORIGIN/../lib`)
flags.Local.LdFlags = append(flags.Local.LdFlags, `-Wl,-rpath,\$$ORIGIN/../`+subdir)
}
return flags
@ -221,19 +226,27 @@ func IsValidSharedDependency(dependency android.Module) bool {
}
func SharedLibraryInstallLocation(
libraryBase string, isHost bool, fuzzDir string, archString string) string {
libraryBase string, isHost bool, isVendor bool, fuzzDir string, archString string) string {
installLocation := "$(PRODUCT_OUT)/data"
if isHost {
installLocation = "$(HOST_OUT)"
}
subdir := "lib"
if isVendor {
subdir = "lib/vendor"
}
installLocation = filepath.Join(
installLocation, fuzzDir, archString, "lib", libraryBase)
installLocation, fuzzDir, archString, subdir, libraryBase)
return installLocation
}
// Get the device-only shared library symbols install directory.
func SharedLibrarySymbolsInstallLocation(libraryBase string, fuzzDir string, archString string) string {
return filepath.Join("$(PRODUCT_OUT)/symbols/data/", fuzzDir, archString, "/lib/", libraryBase)
func SharedLibrarySymbolsInstallLocation(libraryBase string, isVendor bool, fuzzDir string, archString string) string {
subdir := "lib"
if isVendor {
subdir = "lib/vendor"
}
return filepath.Join("$(PRODUCT_OUT)/symbols/data/", fuzzDir, archString, subdir, libraryBase)
}
func (fuzzBin *fuzzBinary) install(ctx ModuleContext, file android.Path) {
@ -244,16 +257,29 @@ func (fuzzBin *fuzzBinary) install(ctx ModuleContext, file android.Path) {
// Grab the list of required shared libraries.
fuzzBin.sharedLibraries, _ = CollectAllSharedDependencies(ctx)
// TODO: does not mirror Android linkernamespaces
// the logic here has special cases for vendor, but it would need more work to
// work in arbitrary partitions, so just surface errors early for a few cases
//
// Even without these, there are certain situations across linkernamespaces
// that this won't support. For instance, you might have:
//
// my_fuzzer (vendor) -> libbinder_ndk (core) -> libbinder (vendor)
//
// This dependency chain wouldn't be possible to express in the current
// logic because all the deps currently match the variant of the source
// module.
for _, ruleBuilderInstall := range fuzzBin.sharedLibraries {
install := ruleBuilderInstall.To
fuzzBin.installedSharedDeps = append(fuzzBin.installedSharedDeps,
SharedLibraryInstallLocation(
install, ctx.Host(), installBase, ctx.Arch().ArchType.String()))
install, ctx.Host(), ctx.inVendor(), installBase, ctx.Arch().ArchType.String()))
// Also add the dependency on the shared library symbols dir.
if !ctx.Host() {
fuzzBin.installedSharedDeps = append(fuzzBin.installedSharedDeps,
SharedLibrarySymbolsInstallLocation(install, installBase, ctx.Arch().ArchType.String()))
SharedLibrarySymbolsInstallLocation(install, ctx.inVendor(), installBase, ctx.Arch().ArchType.String()))
}
}
@ -412,6 +438,10 @@ func (s *ccRustFuzzPackager) GenerateBuildActions(ctx android.SingletonContext)
}
sharedLibsInstallDirPrefix := "lib"
if ccModule.InVendor() {
sharedLibsInstallDirPrefix = "lib/vendor"
}
if !ccModule.IsFuzzModule() {
return
}
@ -504,7 +534,7 @@ func GetSharedLibsToZip(sharedLibraries android.RuleBuilderInstalls, module Link
// install it to the output directory. Setup the install destination here,
// which will be used by $(copy-many-files) in the Make backend.
installDestination := SharedLibraryInstallLocation(
install, module.Host(), fuzzDir, archString)
install, module.Host(), module.InVendor(), fuzzDir, archString)
if (*sharedLibraryInstalled)[installDestination] {
continue
}
@ -522,7 +552,7 @@ func GetSharedLibsToZip(sharedLibraries android.RuleBuilderInstalls, module Link
// we want symbolization tools (like `stack`) to be able to find the symbols
// in $ANDROID_PRODUCT_OUT/symbols automagically.
if !module.Host() {
symbolsInstallDestination := SharedLibrarySymbolsInstallLocation(install, fuzzDir, archString)
symbolsInstallDestination := SharedLibrarySymbolsInstallLocation(install, module.InVendor(), fuzzDir, archString)
symbolsInstallDestination = strings.ReplaceAll(symbolsInstallDestination, "$", "$$")
s.SharedLibInstallStrings = append(s.SharedLibInstallStrings,
library.String()+":"+symbolsInstallDestination)

View file

@ -142,12 +142,12 @@ func (fuzz *fuzzDecorator) install(ctx ModuleContext) {
fuzz.installedSharedDeps = append(fuzz.installedSharedDeps,
cc.SharedLibraryInstallLocation(
install, ctx.Host(), installBase, ctx.Arch().ArchType.String()))
install, ctx.Host(), ctx.InstallInVendor(), installBase, ctx.Arch().ArchType.String()))
// Also add the dependency on the shared library symbols dir.
if !ctx.Host() {
fuzz.installedSharedDeps = append(fuzz.installedSharedDeps,
cc.SharedLibrarySymbolsInstallLocation(install, installBase, ctx.Arch().ArchType.String()))
cc.SharedLibrarySymbolsInstallLocation(install, ctx.InstallInVendor(), installBase, ctx.Arch().ArchType.String()))
}
}