blob: 83f003741cf7a8508c7c117cda4d57543619c621 [file] [log] [blame]
Mitch Phillipsda9a4632019-07-15 09:34:09 -07001// Copyright 2016 Google Inc. All rights reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package cc
16
17import (
Mitch Phillips4de896e2019-08-28 16:04:36 -070018 "path/filepath"
Mitch Phillipse1ee1a12019-10-17 19:20:41 -070019 "sort"
Mitch Phillipsa0a5e192019-09-27 14:00:06 -070020 "strings"
Mitch Phillips4de896e2019-08-28 16:04:36 -070021
Victor Chang00c144f2021-02-09 12:30:33 +000022 "github.com/google/blueprint/proptools"
23
Mitch Phillipsda9a4632019-07-15 09:34:09 -070024 "android/soong/android"
25 "android/soong/cc/config"
hamzehc0a671f2021-07-22 12:05:08 -070026 "android/soong/fuzz"
Mitch Phillipsda9a4632019-07-15 09:34:09 -070027)
28
29func init() {
30 android.RegisterModuleType("cc_fuzz", FuzzFactory)
Mitch Phillipsd3254b42019-09-24 13:03:28 -070031 android.RegisterSingletonType("cc_fuzz_packaging", fuzzPackagingFactory)
Mitch Phillipsda9a4632019-07-15 09:34:09 -070032}
33
34// cc_fuzz creates a host/device fuzzer binary. Host binaries can be found at
35// $ANDROID_HOST_OUT/fuzz/, and device binaries can be found at /data/fuzz on
36// your device, or $ANDROID_PRODUCT_OUT/data/fuzz in your build tree.
37func FuzzFactory() android.Module {
38 module := NewFuzz(android.HostAndDeviceSupported)
39 return module.Init()
40}
41
42func NewFuzzInstaller() *baseInstaller {
43 return NewBaseInstaller("fuzz", "fuzz", InstallInData)
44}
45
46type fuzzBinary struct {
47 *binaryDecorator
48 *baseCompiler
Mitch Phillips4e4ab8a2019-09-13 17:32:50 -070049
hamzehc0a671f2021-07-22 12:05:08 -070050 fuzzPackagedModule fuzz.FuzzPackagedModule
hamzeh41ad8812021-07-07 14:00:07 -070051
52 installedSharedDeps []string
Mitch Phillipsda9a4632019-07-15 09:34:09 -070053}
54
55func (fuzz *fuzzBinary) linkerProps() []interface{} {
56 props := fuzz.binaryDecorator.linkerProps()
hamzeh41ad8812021-07-07 14:00:07 -070057 props = append(props, &fuzz.fuzzPackagedModule.FuzzProperties)
Mitch Phillipsda9a4632019-07-15 09:34:09 -070058 return props
59}
60
61func (fuzz *fuzzBinary) linkerInit(ctx BaseModuleContext) {
Mitch Phillipsda9a4632019-07-15 09:34:09 -070062 fuzz.binaryDecorator.linkerInit(ctx)
63}
64
65func (fuzz *fuzzBinary) linkerDeps(ctx DepsContext, deps Deps) Deps {
66 deps.StaticLibs = append(deps.StaticLibs,
67 config.LibFuzzerRuntimeLibrary(ctx.toolchain()))
68 deps = fuzz.binaryDecorator.linkerDeps(ctx, deps)
69 return deps
70}
71
72func (fuzz *fuzzBinary) linkerFlags(ctx ModuleContext, flags Flags) Flags {
73 flags = fuzz.binaryDecorator.linkerFlags(ctx, flags)
Mitch Phillips1f7f54f2019-11-14 14:50:47 -080074 // RunPaths on devices isn't instantiated by the base linker. `../lib` for
75 // installed fuzz targets (both host and device), and `./lib` for fuzz
76 // target packages.
Mitch Phillipse1ee1a12019-10-17 19:20:41 -070077 flags.Local.LdFlags = append(flags.Local.LdFlags, `-Wl,-rpath,\$$ORIGIN/../lib`)
Mitch Phillips1f7f54f2019-11-14 14:50:47 -080078 flags.Local.LdFlags = append(flags.Local.LdFlags, `-Wl,-rpath,\$$ORIGIN/lib`)
Mitch Phillipsda9a4632019-07-15 09:34:09 -070079 return flags
80}
81
Mitch Phillipse1ee1a12019-10-17 19:20:41 -070082// This function performs a breadth-first search over the provided module's
83// dependencies using `visitDirectDeps` to enumerate all shared library
84// dependencies. We require breadth-first expansion, as otherwise we may
85// incorrectly use the core libraries (sanitizer runtimes, libc, libdl, etc.)
86// from a dependency. This may cause issues when dependencies have explicit
87// sanitizer tags, as we may get a dependency on an unsanitized libc, etc.
Colin Crossdc809f92019-11-20 15:58:32 -080088func collectAllSharedDependencies(ctx android.SingletonContext, module android.Module) android.Paths {
Mitch Phillipse1ee1a12019-10-17 19:20:41 -070089 var fringe []android.Module
90
Mitch Phillipsc0b442f2020-04-27 16:44:58 -070091 seen := make(map[string]bool)
Colin Crossdc809f92019-11-20 15:58:32 -080092
Mitch Phillipse1ee1a12019-10-17 19:20:41 -070093 // Enumerate the first level of dependencies, as we discard all non-library
94 // modules in the BFS loop below.
95 ctx.VisitDirectDeps(module, func(dep android.Module) {
Colin Crossdc809f92019-11-20 15:58:32 -080096 if isValidSharedDependency(dep) {
Mitch Phillipsf50bddb2019-11-12 14:03:31 -080097 fringe = append(fringe, dep)
98 }
Mitch Phillipse1ee1a12019-10-17 19:20:41 -070099 })
100
Colin Crossdc809f92019-11-20 15:58:32 -0800101 var sharedLibraries android.Paths
102
Mitch Phillipse1ee1a12019-10-17 19:20:41 -0700103 for i := 0; i < len(fringe); i++ {
104 module := fringe[i]
Mitch Phillipsc0b442f2020-04-27 16:44:58 -0700105 if seen[module.Name()] {
Mitch Phillipse1ee1a12019-10-17 19:20:41 -0700106 continue
107 }
Mitch Phillipsc0b442f2020-04-27 16:44:58 -0700108 seen[module.Name()] = true
Mitch Phillipse1ee1a12019-10-17 19:20:41 -0700109
110 ccModule := module.(*Module)
Colin Crossdc809f92019-11-20 15:58:32 -0800111 sharedLibraries = append(sharedLibraries, ccModule.UnstrippedOutputFile())
Mitch Phillipse1ee1a12019-10-17 19:20:41 -0700112 ctx.VisitDirectDeps(module, func(dep android.Module) {
Mitch Phillipsc0b442f2020-04-27 16:44:58 -0700113 if isValidSharedDependency(dep) && !seen[dep.Name()] {
Mitch Phillipsf50bddb2019-11-12 14:03:31 -0800114 fringe = append(fringe, dep)
115 }
Mitch Phillipse1ee1a12019-10-17 19:20:41 -0700116 })
117 }
Colin Crossdc809f92019-11-20 15:58:32 -0800118
119 return sharedLibraries
Mitch Phillipse1ee1a12019-10-17 19:20:41 -0700120}
121
122// This function takes a module and determines if it is a unique shared library
123// that should be installed in the fuzz target output directories. This function
124// returns true, unless:
Victor Chang00c144f2021-02-09 12:30:33 +0000125// - The module is not an installable shared library, or
Kris Alder756ec8d2021-08-27 22:08:29 +0000126// - The module is a header or stub, or
Martin Stjernholm02460ab2020-10-06 02:36:43 +0100127// - The module is a prebuilt and its source is available, or
128// - The module is a versioned member of an SDK snapshot.
Colin Crossdc809f92019-11-20 15:58:32 -0800129func isValidSharedDependency(dependency android.Module) bool {
Mitch Phillipse1ee1a12019-10-17 19:20:41 -0700130 // TODO(b/144090547): We should be parsing these modules using
131 // ModuleDependencyTag instead of the current brute-force checking.
132
Colin Cross31076b32020-10-23 17:22:06 -0700133 linkable, ok := dependency.(LinkableInterface)
134 if !ok || !linkable.CcLibraryInterface() {
135 // Discard non-linkables.
136 return false
137 }
138
139 if !linkable.Shared() {
140 // Discard static libs.
141 return false
142 }
143
Colin Cross31076b32020-10-23 17:22:06 -0700144 if lib := moduleLibraryInterface(dependency); lib != nil && lib.buildStubs() && linkable.CcLibrary() {
Mitch Phillipsf50bddb2019-11-12 14:03:31 -0800145 // Discard stubs libs (only CCLibrary variants). Prebuilt libraries should not
146 // be excluded on the basis of they're not CCLibrary()'s.
Mitch Phillipse1ee1a12019-10-17 19:20:41 -0700147 return false
148 }
149
Mitch Phillipsf50bddb2019-11-12 14:03:31 -0800150 // We discarded module stubs libraries above, but the LLNDK prebuilts stubs
151 // libraries must be handled differently - by looking for the stubDecorator.
152 // Discard LLNDK prebuilts stubs as well.
153 if ccLibrary, isCcLibrary := dependency.(*Module); isCcLibrary {
154 if _, isLLndkStubLibrary := ccLibrary.linker.(*stubDecorator); isLLndkStubLibrary {
155 return false
156 }
Victor Chang00c144f2021-02-09 12:30:33 +0000157 // Discard installable:false libraries because they are expected to be absent
158 // in runtime.
159 if !proptools.BoolDefault(ccLibrary.Properties.Installable, true) {
160 return false
161 }
Mitch Phillipsf50bddb2019-11-12 14:03:31 -0800162 }
163
Martin Stjernholm02460ab2020-10-06 02:36:43 +0100164 // If the same library is present both as source and a prebuilt we must pick
165 // only one to avoid a conflict. Always prefer the source since the prebuilt
166 // probably won't be built with sanitizers enabled.
Paul Duffinf7c99f52021-04-28 10:41:21 +0100167 if prebuilt := android.GetEmbeddedPrebuilt(dependency); prebuilt != nil && prebuilt.SourceExists() {
Martin Stjernholm02460ab2020-10-06 02:36:43 +0100168 return false
169 }
170
171 // Discard versioned members of SDK snapshots, because they will conflict with
172 // unversioned ones.
173 if sdkMember, ok := dependency.(android.SdkAware); ok && !sdkMember.ContainingSdk().Unversioned() {
174 return false
175 }
176
Mitch Phillipse1ee1a12019-10-17 19:20:41 -0700177 return true
178}
179
180func sharedLibraryInstallLocation(
181 libraryPath android.Path, isHost bool, archString string) string {
182 installLocation := "$(PRODUCT_OUT)/data"
183 if isHost {
184 installLocation = "$(HOST_OUT)"
185 }
186 installLocation = filepath.Join(
187 installLocation, "fuzz", archString, "lib", libraryPath.Base())
188 return installLocation
189}
190
Mitch Phillips0bf97132020-03-06 09:38:12 -0800191// Get the device-only shared library symbols install directory.
192func sharedLibrarySymbolsInstallLocation(libraryPath android.Path, archString string) string {
193 return filepath.Join("$(PRODUCT_OUT)/symbols/data/fuzz/", archString, "/lib/", libraryPath.Base())
194}
195
Mitch Phillipsda9a4632019-07-15 09:34:09 -0700196func (fuzz *fuzzBinary) install(ctx ModuleContext, file android.Path) {
Mitch Phillips4e4ab8a2019-09-13 17:32:50 -0700197 fuzz.binaryDecorator.baseInstaller.dir = filepath.Join(
198 "fuzz", ctx.Target().Arch.ArchType.String(), ctx.ModuleName())
199 fuzz.binaryDecorator.baseInstaller.dir64 = filepath.Join(
200 "fuzz", ctx.Target().Arch.ArchType.String(), ctx.ModuleName())
Mitch Phillipsda9a4632019-07-15 09:34:09 -0700201 fuzz.binaryDecorator.baseInstaller.install(ctx, file)
Mitch Phillips4e4ab8a2019-09-13 17:32:50 -0700202
hamzeh41ad8812021-07-07 14:00:07 -0700203 fuzz.fuzzPackagedModule.Corpus = android.PathsForModuleSrc(ctx, fuzz.fuzzPackagedModule.FuzzProperties.Corpus)
Colin Crossf1a035e2020-11-16 17:32:30 -0800204 builder := android.NewRuleBuilder(pctx, ctx)
Mitch Phillips8a2bc0b2019-10-17 15:04:01 -0700205 intermediateDir := android.PathForModuleOut(ctx, "corpus")
hamzeh41ad8812021-07-07 14:00:07 -0700206 for _, entry := range fuzz.fuzzPackagedModule.Corpus {
Mitch Phillips8a2bc0b2019-10-17 15:04:01 -0700207 builder.Command().Text("cp").
208 Input(entry).
209 Output(intermediateDir.Join(ctx, entry.Base()))
210 }
Colin Crossf1a035e2020-11-16 17:32:30 -0800211 builder.Build("copy_corpus", "copy corpus")
hamzeh41ad8812021-07-07 14:00:07 -0700212 fuzz.fuzzPackagedModule.CorpusIntermediateDir = intermediateDir
Mitch Phillips8a2bc0b2019-10-17 15:04:01 -0700213
hamzeh41ad8812021-07-07 14:00:07 -0700214 fuzz.fuzzPackagedModule.Data = android.PathsForModuleSrc(ctx, fuzz.fuzzPackagedModule.FuzzProperties.Data)
Colin Crossf1a035e2020-11-16 17:32:30 -0800215 builder = android.NewRuleBuilder(pctx, ctx)
Tri Voad172d82019-11-27 13:45:45 -0800216 intermediateDir = android.PathForModuleOut(ctx, "data")
hamzeh41ad8812021-07-07 14:00:07 -0700217 for _, entry := range fuzz.fuzzPackagedModule.Data {
Tri Voad172d82019-11-27 13:45:45 -0800218 builder.Command().Text("cp").
219 Input(entry).
220 Output(intermediateDir.Join(ctx, entry.Rel()))
221 }
Colin Crossf1a035e2020-11-16 17:32:30 -0800222 builder.Build("copy_data", "copy data")
hamzeh41ad8812021-07-07 14:00:07 -0700223 fuzz.fuzzPackagedModule.DataIntermediateDir = intermediateDir
Tri Voad172d82019-11-27 13:45:45 -0800224
hamzeh41ad8812021-07-07 14:00:07 -0700225 if fuzz.fuzzPackagedModule.FuzzProperties.Dictionary != nil {
226 fuzz.fuzzPackagedModule.Dictionary = android.PathForModuleSrc(ctx, *fuzz.fuzzPackagedModule.FuzzProperties.Dictionary)
227 if fuzz.fuzzPackagedModule.Dictionary.Ext() != ".dict" {
Mitch Phillips4e4ab8a2019-09-13 17:32:50 -0700228 ctx.PropertyErrorf("dictionary",
229 "Fuzzer dictionary %q does not have '.dict' extension",
hamzeh41ad8812021-07-07 14:00:07 -0700230 fuzz.fuzzPackagedModule.Dictionary.String())
Mitch Phillips4e4ab8a2019-09-13 17:32:50 -0700231 }
232 }
Kris Alderf979ee32019-10-22 10:52:01 -0700233
hamzeh41ad8812021-07-07 14:00:07 -0700234 if fuzz.fuzzPackagedModule.FuzzProperties.Fuzz_config != nil {
Kris Alderdb97af42019-10-30 10:17:04 -0700235 configPath := android.PathForModuleOut(ctx, "config").Join(ctx, "config.json")
hamzeh41ad8812021-07-07 14:00:07 -0700236 android.WriteFileRule(ctx, configPath, fuzz.fuzzPackagedModule.FuzzProperties.Fuzz_config.String())
237 fuzz.fuzzPackagedModule.Config = configPath
Kris Alderf979ee32019-10-22 10:52:01 -0700238 }
Mitch Phillipse1ee1a12019-10-17 19:20:41 -0700239
240 // Grab the list of required shared libraries.
Mitch Phillipsc0b442f2020-04-27 16:44:58 -0700241 seen := make(map[string]bool)
Colin Crossdc809f92019-11-20 15:58:32 -0800242 var sharedLibraries android.Paths
Mitch Phillipse1ee1a12019-10-17 19:20:41 -0700243 ctx.WalkDeps(func(child, parent android.Module) bool {
Mitch Phillipsc0b442f2020-04-27 16:44:58 -0700244 if seen[child.Name()] {
Colin Crossdc809f92019-11-20 15:58:32 -0800245 return false
246 }
Mitch Phillipsc0b442f2020-04-27 16:44:58 -0700247 seen[child.Name()] = true
Colin Crossdc809f92019-11-20 15:58:32 -0800248
249 if isValidSharedDependency(child) {
250 sharedLibraries = append(sharedLibraries, child.(*Module).UnstrippedOutputFile())
Mitch Phillipse1ee1a12019-10-17 19:20:41 -0700251 return true
252 }
253 return false
254 })
255
256 for _, lib := range sharedLibraries {
257 fuzz.installedSharedDeps = append(fuzz.installedSharedDeps,
258 sharedLibraryInstallLocation(
259 lib, ctx.Host(), ctx.Arch().ArchType.String()))
Mitch Phillips0bf97132020-03-06 09:38:12 -0800260
261 // Also add the dependency on the shared library symbols dir.
262 if !ctx.Host() {
263 fuzz.installedSharedDeps = append(fuzz.installedSharedDeps,
264 sharedLibrarySymbolsInstallLocation(lib, ctx.Arch().ArchType.String()))
265 }
Mitch Phillipse1ee1a12019-10-17 19:20:41 -0700266 }
Mitch Phillipsda9a4632019-07-15 09:34:09 -0700267}
268
269func NewFuzz(hod android.HostOrDeviceSupported) *Module {
270 module, binary := NewBinary(hod)
271
Mitch Phillipsda9a4632019-07-15 09:34:09 -0700272 binary.baseInstaller = NewFuzzInstaller()
Ivan Lozano3968d8f2020-12-14 11:27:52 -0500273 module.sanitize.SetSanitizer(Fuzzer, true)
Mitch Phillipsda9a4632019-07-15 09:34:09 -0700274
275 fuzz := &fuzzBinary{
276 binaryDecorator: binary,
277 baseCompiler: NewBaseCompiler(),
278 }
279 module.compiler = fuzz
280 module.linker = fuzz
281 module.installer = fuzz
Colin Crosseec9b282019-07-18 16:20:52 -0700282
283 // The fuzzer runtime is not present for darwin host modules, disable cc_fuzz modules when targeting darwin.
284 android.AddLoadHook(module, func(ctx android.LoadHookContext) {
Alex Light71123ec2019-07-24 13:34:19 -0700285 disableDarwinAndLinuxBionic := struct {
Colin Crosseec9b282019-07-18 16:20:52 -0700286 Target struct {
287 Darwin struct {
288 Enabled *bool
289 }
Alex Light71123ec2019-07-24 13:34:19 -0700290 Linux_bionic struct {
291 Enabled *bool
292 }
Colin Crosseec9b282019-07-18 16:20:52 -0700293 }
294 }{}
Alex Light71123ec2019-07-24 13:34:19 -0700295 disableDarwinAndLinuxBionic.Target.Darwin.Enabled = BoolPtr(false)
296 disableDarwinAndLinuxBionic.Target.Linux_bionic.Enabled = BoolPtr(false)
297 ctx.AppendProperties(&disableDarwinAndLinuxBionic)
Colin Crosseec9b282019-07-18 16:20:52 -0700298 })
299
Mitch Phillipsda9a4632019-07-15 09:34:09 -0700300 return module
301}
Mitch Phillipsd3254b42019-09-24 13:03:28 -0700302
303// Responsible for generating GNU Make rules that package fuzz targets into
304// their architecture & target/host specific zip file.
hamzeh41ad8812021-07-07 14:00:07 -0700305type ccFuzzPackager struct {
hamzehc0a671f2021-07-22 12:05:08 -0700306 fuzz.FuzzPackager
Mitch Phillipse1ee1a12019-10-17 19:20:41 -0700307 sharedLibInstallStrings []string
Mitch Phillipsd3254b42019-09-24 13:03:28 -0700308}
309
310func fuzzPackagingFactory() android.Singleton {
hamzeh41ad8812021-07-07 14:00:07 -0700311 return &ccFuzzPackager{}
Mitch Phillipsd3254b42019-09-24 13:03:28 -0700312}
313
hamzeh41ad8812021-07-07 14:00:07 -0700314func (s *ccFuzzPackager) GenerateBuildActions(ctx android.SingletonContext) {
Mitch Phillipsd3254b42019-09-24 13:03:28 -0700315 // Map between each architecture + host/device combination, and the files that
316 // need to be packaged (in the tuple of {source file, destination folder in
317 // archive}).
hamzehc0a671f2021-07-22 12:05:08 -0700318 archDirs := make(map[fuzz.ArchOs][]fuzz.FileToZip)
Mitch Phillipsd3254b42019-09-24 13:03:28 -0700319
Colin Crossdc809f92019-11-20 15:58:32 -0800320 // Map tracking whether each shared library has an install rule to avoid duplicate install rules from
321 // multiple fuzzers that depend on the same shared library.
322 sharedLibraryInstalled := make(map[string]bool)
Mitch Phillipse1ee1a12019-10-17 19:20:41 -0700323
324 // List of individual fuzz targets, so that 'make fuzz' also installs the targets
325 // to the correct output directories as well.
hamzeh41ad8812021-07-07 14:00:07 -0700326 s.FuzzTargets = make(map[string]bool)
Mitch Phillipse1ee1a12019-10-17 19:20:41 -0700327
Mitch Phillipsd3254b42019-09-24 13:03:28 -0700328 ctx.VisitAllModules(func(module android.Module) {
Mitch Phillipsd3254b42019-09-24 13:03:28 -0700329 ccModule, ok := module.(*Module)
hamzeh41ad8812021-07-07 14:00:07 -0700330 if !ok || ccModule.Properties.PreventInstall {
331 return
332 }
333
334 // Discard non-fuzz targets.
hamzehc0a671f2021-07-22 12:05:08 -0700335 if ok := fuzz.IsValid(ccModule.FuzzModule); !ok {
Mitch Phillipsd3254b42019-09-24 13:03:28 -0700336 return
337 }
Mitch Phillipse1ee1a12019-10-17 19:20:41 -0700338
Mitch Phillipsd3254b42019-09-24 13:03:28 -0700339 fuzzModule, ok := ccModule.compiler.(*fuzzBinary)
340 if !ok {
341 return
342 }
343
Mitch Phillipsd3254b42019-09-24 13:03:28 -0700344 hostOrTargetString := "target"
345 if ccModule.Host() {
346 hostOrTargetString = "host"
347 }
348
349 archString := ccModule.Arch().ArchType.String()
350 archDir := android.PathForIntermediates(ctx, "fuzz", hostOrTargetString, archString)
hamzehc0a671f2021-07-22 12:05:08 -0700351 archOs := fuzz.ArchOs{HostOrTarget: hostOrTargetString, Arch: archString, Dir: archDir.String()}
Mitch Phillipsd3254b42019-09-24 13:03:28 -0700352
Mitch Phillipse1ee1a12019-10-17 19:20:41 -0700353 // Grab the list of required shared libraries.
Colin Crossdc809f92019-11-20 15:58:32 -0800354 sharedLibraries := collectAllSharedDependencies(ctx, module)
Mitch Phillipse1ee1a12019-10-17 19:20:41 -0700355
hamzehc0a671f2021-07-22 12:05:08 -0700356 var files []fuzz.FileToZip
Colin Crossf1a035e2020-11-16 17:32:30 -0800357 builder := android.NewRuleBuilder(pctx, ctx)
Mitch Phillips2edbe8e2019-11-13 08:36:07 -0800358
hamzeh41ad8812021-07-07 14:00:07 -0700359 // Package the corpus, data, dict and config into a zipfile.
360 files = s.PackageArtifacts(ctx, module, fuzzModule.fuzzPackagedModule, archDir, builder)
Tri Voad172d82019-11-27 13:45:45 -0800361
Mitch Phillips2edbe8e2019-11-13 08:36:07 -0800362 // Find and mark all the transiently-dependent shared libraries for
363 // packaging.
Mitch Phillipse1ee1a12019-10-17 19:20:41 -0700364 for _, library := range sharedLibraries {
hamzehc0a671f2021-07-22 12:05:08 -0700365 files = append(files, fuzz.FileToZip{library, "lib"})
Mitch Phillips13ed3f52019-11-12 11:12:10 -0800366
Mitch Phillipse1ee1a12019-10-17 19:20:41 -0700367 // For each architecture-specific shared library dependency, we need to
368 // install it to the output directory. Setup the install destination here,
369 // which will be used by $(copy-many-files) in the Make backend.
Mitch Phillipse1ee1a12019-10-17 19:20:41 -0700370 installDestination := sharedLibraryInstallLocation(
371 library, ccModule.Host(), archString)
Colin Crossdc809f92019-11-20 15:58:32 -0800372 if sharedLibraryInstalled[installDestination] {
373 continue
374 }
375 sharedLibraryInstalled[installDestination] = true
Mitch Phillips0bf97132020-03-06 09:38:12 -0800376
Mitch Phillipse1ee1a12019-10-17 19:20:41 -0700377 // Escape all the variables, as the install destination here will be called
378 // via. $(eval) in Make.
379 installDestination = strings.ReplaceAll(
380 installDestination, "$", "$$")
381 s.sharedLibInstallStrings = append(s.sharedLibInstallStrings,
382 library.String()+":"+installDestination)
Mitch Phillips0bf97132020-03-06 09:38:12 -0800383
384 // Ensure that on device, the library is also reinstalled to the /symbols/
385 // dir. Symbolized DSO's are always installed to the device when fuzzing, but
386 // we want symbolization tools (like `stack`) to be able to find the symbols
387 // in $ANDROID_PRODUCT_OUT/symbols automagically.
388 if !ccModule.Host() {
389 symbolsInstallDestination := sharedLibrarySymbolsInstallLocation(library, archString)
390 symbolsInstallDestination = strings.ReplaceAll(symbolsInstallDestination, "$", "$$")
391 s.sharedLibInstallStrings = append(s.sharedLibInstallStrings,
392 library.String()+":"+symbolsInstallDestination)
393 }
Mitch Phillipse1ee1a12019-10-17 19:20:41 -0700394 }
395
Mitch Phillipsd3254b42019-09-24 13:03:28 -0700396 // The executable.
hamzehc0a671f2021-07-22 12:05:08 -0700397 files = append(files, fuzz.FileToZip{ccModule.UnstrippedOutputFile(), ""})
Mitch Phillipsd3254b42019-09-24 13:03:28 -0700398
hamzeh41ad8812021-07-07 14:00:07 -0700399 archDirs[archOs], ok = s.BuildZipFile(ctx, module, fuzzModule.fuzzPackagedModule, files, builder, archDir, archString, hostOrTargetString, archOs, archDirs)
400 if !ok {
401 return
Mitch Phillipsd3254b42019-09-24 13:03:28 -0700402 }
403 })
404
hamzehc0a671f2021-07-22 12:05:08 -0700405 s.CreateFuzzPackage(ctx, archDirs, fuzz.Cc, pctx)
Colin Crossdc809f92019-11-20 15:58:32 -0800406
Mitch Phillipsa0a5e192019-09-27 14:00:06 -0700407}
Mitch Phillipsd3254b42019-09-24 13:03:28 -0700408
hamzeh41ad8812021-07-07 14:00:07 -0700409func (s *ccFuzzPackager) MakeVars(ctx android.MakeVarsContext) {
410 packages := s.Packages.Strings()
Mitch Phillipse1ee1a12019-10-17 19:20:41 -0700411 sort.Strings(packages)
412 sort.Strings(s.sharedLibInstallStrings)
Mitch Phillipsa0a5e192019-09-27 14:00:06 -0700413 // TODO(mitchp): Migrate this to use MakeVarsContext::DistForGoal() when it's
414 // ready to handle phony targets created in Soong. In the meantime, this
415 // exports the phony 'fuzz' target and dependencies on packages to
416 // core/main.mk so that we can use dist-for-goals.
Mitch Phillipse1ee1a12019-10-17 19:20:41 -0700417 ctx.Strict("SOONG_FUZZ_PACKAGING_ARCH_MODULES", strings.Join(packages, " "))
418 ctx.Strict("FUZZ_TARGET_SHARED_DEPS_INSTALL_PAIRS",
419 strings.Join(s.sharedLibInstallStrings, " "))
420
421 // Preallocate the slice of fuzz targets to minimise memory allocations.
hamzeh41ad8812021-07-07 14:00:07 -0700422 s.PreallocateSlice(ctx, "ALL_FUZZ_TARGETS")
Mitch Phillipsd3254b42019-09-24 13:03:28 -0700423}