157 lines
4.6 KiB
Go
157 lines
4.6 KiB
Go
//
|
|
// Copyright (C) 2017 The Android Open Source Project
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
//
|
|
|
|
package clangprebuilts
|
|
|
|
import (
|
|
"path"
|
|
"path/filepath"
|
|
"strings"
|
|
|
|
"github.com/google/blueprint/proptools"
|
|
|
|
"android/soong/android"
|
|
"android/soong/cc"
|
|
"android/soong/cc/config"
|
|
)
|
|
|
|
// This module is used to generate libfuzzer static libraries and libclang_rt.* shared libraries. When
|
|
// LLVM_PREBUILTS_VERSION and LLVM_RELEASE_VERSION are set, the library will
|
|
// generated from the given path.
|
|
|
|
func init() {
|
|
android.RegisterModuleType("libfuzzer_prebuilt_library_static",
|
|
libfuzzerPrebuiltLibraryStaticFactory)
|
|
android.RegisterModuleType("libclang_rt_prebuilt_library_shared",
|
|
libClangRtPrebuiltLibrarySharedFactory)
|
|
}
|
|
|
|
func getClangDirs(ctx android.LoadHookContext) (libDir string, headerDir string) {
|
|
clangDir := path.Join(
|
|
"./",
|
|
ctx.AConfig().GetenvWithDefault("LLVM_PREBUILTS_VERSION", config.ClangDefaultVersion),
|
|
)
|
|
headerDir = path.Join(clangDir, "prebuilt_include", "llvm", "lib", "Fuzzer")
|
|
releaseVersion := ctx.AConfig().GetenvWithDefault("LLVM_RELEASE_VERSION",
|
|
config.ClangDefaultShortVersion)
|
|
libDir = path.Join(clangDir, "lib64", "clang", releaseVersion, "lib", "linux")
|
|
return
|
|
}
|
|
|
|
type archProps struct {
|
|
Android_arm struct {
|
|
Srcs []string
|
|
}
|
|
Android_arm64 struct {
|
|
Srcs []string
|
|
}
|
|
Android_mips struct {
|
|
Srcs []string
|
|
}
|
|
Android_mips64 struct {
|
|
Srcs []string
|
|
}
|
|
Android_x86 struct {
|
|
Srcs []string
|
|
}
|
|
Android_x86_64 struct {
|
|
Srcs []string
|
|
}
|
|
}
|
|
|
|
func libfuzzerPrebuiltLibraryStatic(ctx android.LoadHookContext) {
|
|
// Because of b/38393317, changing clang base dir is not allowed. Mark
|
|
// libFuzzer as disabled if LLVM_PREBUILTS_BASE is used to specify a
|
|
// different base dir other than $ANDROID_BUILD_TOP/prebuilts/clang/host
|
|
// (i.e. $CWD/..). libFuzzer would be unavailable only for the stage2
|
|
// of the aosp-llvm build, where it is not needed.
|
|
var enableLibFuzzer bool
|
|
enableLibFuzzer = true
|
|
if prebuiltsBase := ctx.AConfig().Getenv("LLVM_PREBUILTS_BASE"); prebuiltsBase != "" {
|
|
prebuiltsBaseAbs, err1 := filepath.Abs(prebuiltsBase)
|
|
moduleBaseAbs, err2 := filepath.Abs("..")
|
|
if err1 == nil && err2 == nil && prebuiltsBaseAbs != moduleBaseAbs {
|
|
enableLibFuzzer = false
|
|
}
|
|
}
|
|
|
|
libDir, headerDir := getClangDirs(ctx)
|
|
|
|
type props struct {
|
|
Enabled *bool
|
|
Export_include_dirs []string
|
|
Target archProps
|
|
}
|
|
|
|
p := &props{}
|
|
|
|
p.Enabled = proptools.BoolPtr(enableLibFuzzer)
|
|
p.Export_include_dirs = []string{headerDir}
|
|
p.Target.Android_arm.Srcs = []string{path.Join(libDir, "arm/libFuzzer.a")}
|
|
p.Target.Android_arm64.Srcs = []string{path.Join(libDir, "aarch64/libFuzzer.a")}
|
|
p.Target.Android_mips.Srcs = []string{path.Join(libDir, "mips/libFuzzer.a")}
|
|
p.Target.Android_mips64.Srcs = []string{path.Join(libDir, "mips64/libFuzzer.a")}
|
|
p.Target.Android_x86.Srcs = []string{path.Join(libDir, "i386/libFuzzer.a")}
|
|
p.Target.Android_x86_64.Srcs = []string{path.Join(libDir, "x86_64/libFuzzer.a")}
|
|
ctx.AppendProperties(p)
|
|
}
|
|
|
|
func libClangRtPrebuiltLibraryShared(ctx android.LoadHookContext) {
|
|
if ctx.AConfig().IsEnvTrue("FORCE_BUILD_SANITIZER_SHARED_OBJECTS") {
|
|
return
|
|
}
|
|
|
|
libDir, _ := getClangDirs(ctx)
|
|
|
|
type props struct {
|
|
Srcs []string
|
|
System_shared_libs []string
|
|
Sanitize struct {
|
|
Never bool
|
|
}
|
|
Strip struct {
|
|
None bool
|
|
}
|
|
Pack_relocations *bool
|
|
Stl *string
|
|
}
|
|
|
|
p := &props{}
|
|
|
|
name := strings.Replace(ctx.ModuleName(), "prebuilt_", "", 1)
|
|
|
|
p.Srcs = []string{path.Join(libDir, name+".so")}
|
|
p.System_shared_libs = []string{}
|
|
p.Sanitize.Never = true
|
|
p.Strip.None = true
|
|
disable := false
|
|
p.Pack_relocations = &disable
|
|
none := "none"
|
|
p.Stl = &none
|
|
ctx.AppendProperties(p)
|
|
}
|
|
|
|
func libfuzzerPrebuiltLibraryStaticFactory() android.Module {
|
|
module, _ := cc.NewPrebuiltStaticLibrary(android.HostAndDeviceSupported)
|
|
android.AddLoadHook(module, libfuzzerPrebuiltLibraryStatic)
|
|
return module.Init()
|
|
}
|
|
|
|
func libClangRtPrebuiltLibrarySharedFactory() android.Module {
|
|
module, _ := cc.NewPrebuiltSharedLibrary(android.DeviceSupported)
|
|
android.AddLoadHook(module, libClangRtPrebuiltLibraryShared)
|
|
return module.Init()
|
|
}
|