diff options
Diffstat (limited to 'rust/fuzz.go')
-rw-r--r-- | rust/fuzz.go | 121 |
1 files changed, 27 insertions, 94 deletions
diff --git a/rust/fuzz.go b/rust/fuzz.go index 6faf55cf6..d7e7ddfff 100644 --- a/rust/fuzz.go +++ b/rust/fuzz.go @@ -16,8 +16,6 @@ package rust import ( "path/filepath" - "sort" - "strings" "android/soong/android" "android/soong/cc" @@ -27,14 +25,14 @@ import ( func init() { android.RegisterModuleType("rust_fuzz", RustFuzzFactory) - android.RegisterSingletonType("rust_fuzz_packaging", rustFuzzPackagingFactory) } type fuzzDecorator struct { *binaryDecorator - fuzzPackagedModule fuzz.FuzzPackagedModule - sharedLibraries android.Paths + fuzzPackagedModule fuzz.FuzzPackagedModule + sharedLibraries android.Paths + installedSharedDeps []string } var _ compiler = (*fuzzDecorator)(nil) @@ -64,9 +62,14 @@ func (fuzzer *fuzzDecorator) compilerFlags(ctx ModuleContext, flags Flags) Flags flags = fuzzer.binaryDecorator.compilerFlags(ctx, flags) // `../lib` for installed fuzz targets (both host and device), and `./lib` for fuzz target packages. - flags.LinkFlags = append(flags.LinkFlags, `-Wl,-rpath,\$$ORIGIN/../lib`) flags.LinkFlags = append(flags.LinkFlags, `-Wl,-rpath,\$$ORIGIN/lib`) + if ctx.InstallInVendor() { + flags.LinkFlags = append(flags.LinkFlags, `-Wl,-rpath,\$$ORIGIN/../../lib`) + } else { + flags.LinkFlags = append(flags.LinkFlags, `-Wl,-rpath,\$$ORIGIN/../lib`) + + } return flags } @@ -88,10 +91,8 @@ func (fuzzer *fuzzDecorator) compilerProps() []interface{} { } func (fuzzer *fuzzDecorator) compile(ctx ModuleContext, flags Flags, deps PathDeps) buildOutput { - out := fuzzer.binaryDecorator.compile(ctx, flags, deps) - // Grab the list of required shared libraries. - fuzzer.sharedLibraries, _ = cc.CollectAllSharedDependencies(ctx) + out := fuzzer.binaryDecorator.compile(ctx, flags, deps) return out } @@ -104,83 +105,6 @@ func (fuzzer *fuzzDecorator) autoDep(ctx android.BottomUpMutatorContext) autoDep return rlibAutoDep } -// Responsible for generating GNU Make rules that package fuzz targets into -// their architecture & target/host specific zip file. -type rustFuzzPackager struct { - fuzz.FuzzPackager -} - -func rustFuzzPackagingFactory() android.Singleton { - return &rustFuzzPackager{} -} - -func (s *rustFuzzPackager) GenerateBuildActions(ctx android.SingletonContext) { - // Map between each architecture + host/device combination. - archDirs := make(map[fuzz.ArchOs][]fuzz.FileToZip) - - // List of individual fuzz targets. - s.FuzzTargets = make(map[string]bool) - - // Map tracking whether each shared library has an install rule to avoid duplicate install rules from - // multiple fuzzers that depend on the same shared library. - sharedLibraryInstalled := make(map[string]bool) - - ctx.VisitAllModules(func(module android.Module) { - // Discard non-fuzz targets. - rustModule, ok := module.(*Module) - if !ok { - return - } - - if ok := fuzz.IsValid(rustModule.FuzzModule); !ok || rustModule.Properties.PreventInstall { - return - } - - fuzzModule, ok := rustModule.compiler.(*fuzzDecorator) - if !ok { - return - } - - hostOrTargetString := "target" - if rustModule.Host() { - hostOrTargetString = "host" - } - - archString := rustModule.Arch().ArchType.String() - archDir := android.PathForIntermediates(ctx, "fuzz", hostOrTargetString, archString) - archOs := fuzz.ArchOs{HostOrTarget: hostOrTargetString, Arch: archString, Dir: archDir.String()} - - var files []fuzz.FileToZip - builder := android.NewRuleBuilder(pctx, ctx) - - // Package the artifacts (data, corpus, config and dictionary into a zipfile. - files = s.PackageArtifacts(ctx, module, fuzzModule.fuzzPackagedModule, archDir, builder) - - // The executable. - files = append(files, fuzz.FileToZip{rustModule.UnstrippedOutputFile(), ""}) - - // Package shared libraries - files = append(files, cc.GetSharedLibsToZip(fuzzModule.sharedLibraries, rustModule, &s.FuzzPackager, archString, "lib", &sharedLibraryInstalled)...) - - archDirs[archOs], ok = s.BuildZipFile(ctx, module, fuzzModule.fuzzPackagedModule, files, builder, archDir, archString, hostOrTargetString, archOs, archDirs) - if !ok { - return - } - - }) - s.CreateFuzzPackage(ctx, archDirs, fuzz.Rust, pctx) -} - -func (s *rustFuzzPackager) MakeVars(ctx android.MakeVarsContext) { - packages := s.Packages.Strings() - sort.Strings(packages) - - ctx.Strict("SOONG_RUST_FUZZ_PACKAGING_ARCH_MODULES", strings.Join(packages, " ")) - - // Preallocate the slice of fuzz targets to minimize memory allocations. - s.PreallocateSlice(ctx, "ALL_RUST_FUZZ_TARGETS") -} - func (fuzz *fuzzDecorator) install(ctx ModuleContext) { fuzz.binaryDecorator.baseCompiler.dir = filepath.Join( "fuzz", ctx.Target().Arch.ArchType.String(), ctx.ModuleName()) @@ -188,13 +112,22 @@ func (fuzz *fuzzDecorator) install(ctx ModuleContext) { "fuzz", ctx.Target().Arch.ArchType.String(), ctx.ModuleName()) fuzz.binaryDecorator.baseCompiler.install(ctx) - if fuzz.fuzzPackagedModule.FuzzProperties.Corpus != nil { - fuzz.fuzzPackagedModule.Corpus = android.PathsForModuleSrc(ctx, fuzz.fuzzPackagedModule.FuzzProperties.Corpus) - } - if fuzz.fuzzPackagedModule.FuzzProperties.Data != nil { - fuzz.fuzzPackagedModule.Data = android.PathsForModuleSrc(ctx, fuzz.fuzzPackagedModule.FuzzProperties.Data) - } - if fuzz.fuzzPackagedModule.FuzzProperties.Dictionary != nil { - fuzz.fuzzPackagedModule.Dictionary = android.PathForModuleSrc(ctx, *fuzz.fuzzPackagedModule.FuzzProperties.Dictionary) + fuzz.fuzzPackagedModule = cc.PackageFuzzModule(ctx, fuzz.fuzzPackagedModule, pctx) + + installBase := "fuzz" + + // Grab the list of required shared libraries. + fuzz.sharedLibraries, _ = cc.CollectAllSharedDependencies(ctx) + + for _, lib := range fuzz.sharedLibraries { + fuzz.installedSharedDeps = append(fuzz.installedSharedDeps, + cc.SharedLibraryInstallLocation( + lib, ctx.Host(), 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(lib, installBase, ctx.Arch().ArchType.String())) + } } } |