[cc_fuzz] Collect shared deps by name, not by module.
cc_fuzz relies on an invariant that's not exactly true. We assume that for each fuzz target, we'll only have a dependency on a single sanitized variant of a shared library. In a few instances, this is proven not to be true, as we end up with a transitive dependency on a shared library with sanitizer coverage instrumentation, and one without sancov. This results in breaking the packaging for some fuzz targets. This then goes on to break `make haiku` in some scenarios. While this isn't a completely technically correct solution (as we basically resolve one of the sanitized variants pseduorandomly), it does resolve the issue for now. Realistically, we should select *both* of them, and set the DT_RUNPATHS on the shared libraries to point to the dependencies that have the sanitization that they're expecting. In practice - this shouldn't break sancov (we might just silently drop some coverage) or hwasan (we might just silently drop some hwasanification). I believe that the walk order of VisitDirectDeps is deterministic, and as such this shouldn't affect the reproducability of fuzz target builds (and thus won't blow up the Soong rebuilds). ccross@ or dwillemsen@ can speak better to this than I can though. Bug: 148306195 Bug: 151102177 Bug: 155123587 Test: lunch flame_hwasan-userdebug && make haiku Change-Id: I8d4001d93da33e4e5d21f740beb88a20fcc26e2a
This commit is contained in:
14
cc/fuzz.go
14
cc/fuzz.go
@@ -126,7 +126,7 @@ func (fuzz *fuzzBinary) linkerFlags(ctx ModuleContext, flags Flags) Flags {
|
||||
func collectAllSharedDependencies(ctx android.SingletonContext, module android.Module) android.Paths {
|
||||
var fringe []android.Module
|
||||
|
||||
seen := make(map[android.Module]bool)
|
||||
seen := make(map[string]bool)
|
||||
|
||||
// Enumerate the first level of dependencies, as we discard all non-library
|
||||
// modules in the BFS loop below.
|
||||
@@ -140,15 +140,15 @@ func collectAllSharedDependencies(ctx android.SingletonContext, module android.M
|
||||
|
||||
for i := 0; i < len(fringe); i++ {
|
||||
module := fringe[i]
|
||||
if seen[module] {
|
||||
if seen[module.Name()] {
|
||||
continue
|
||||
}
|
||||
seen[module] = true
|
||||
seen[module.Name()] = true
|
||||
|
||||
ccModule := module.(*Module)
|
||||
sharedLibraries = append(sharedLibraries, ccModule.UnstrippedOutputFile())
|
||||
ctx.VisitDirectDeps(module, func(dep android.Module) {
|
||||
if isValidSharedDependency(dep) && !seen[dep] {
|
||||
if isValidSharedDependency(dep) && !seen[dep.Name()] {
|
||||
fringe = append(fringe, dep)
|
||||
}
|
||||
})
|
||||
@@ -255,13 +255,13 @@ func (fuzz *fuzzBinary) install(ctx ModuleContext, file android.Path) {
|
||||
}
|
||||
|
||||
// Grab the list of required shared libraries.
|
||||
seen := make(map[android.Module]bool)
|
||||
seen := make(map[string]bool)
|
||||
var sharedLibraries android.Paths
|
||||
ctx.WalkDeps(func(child, parent android.Module) bool {
|
||||
if seen[child] {
|
||||
if seen[child.Name()] {
|
||||
return false
|
||||
}
|
||||
seen[child] = true
|
||||
seen[child.Name()] = true
|
||||
|
||||
if isValidSharedDependency(child) {
|
||||
sharedLibraries = append(sharedLibraries, child.(*Module).UnstrippedOutputFile())
|
||||
|
Reference in New Issue
Block a user