diff options
author | Trevor Radcliffe <tradical@google.com> | 2023-03-22 20:22:27 +0000 |
---|---|---|
committer | Trevor Radcliffe <tradical@google.com> | 2023-03-27 18:07:40 +0000 |
commit | 391a25d7fa3d4dd316b8263b0fd190aa5f33e4e8 (patch) | |
tree | d027c77bfc82c6cf3d07f8aeb3c8a41c78725593 | |
parent | a22c4b6a796477efa9802726da5073ae7e2ceef2 (diff) | |
download | soong-391a25d7fa3d4dd316b8263b0fd190aa5f33e4e8.tar.gz |
Supporting changes for CFI toolchain features
Mostly exporting variables to Bazel, but also allowlisting a BUILD
file.
Bug: 251217226
Test: Unit tests
Change-Id: Id87015a3cd5d970700c4058ec989bb0c14c36bcb
-rw-r--r-- | android/allowlists/allowlists.go | 2 | ||||
-rw-r--r-- | cc/config/global.go | 4 | ||||
-rw-r--r-- | cc/linker.go | 11 | ||||
-rw-r--r-- | cc/sanitize.go | 24 | ||||
-rw-r--r-- | tests/lib.sh | 1 |
5 files changed, 33 insertions, 9 deletions
diff --git a/android/allowlists/allowlists.go b/android/allowlists/allowlists.go index 33655d02d..db1349b34 100644 --- a/android/allowlists/allowlists.go +++ b/android/allowlists/allowlists.go @@ -388,6 +388,8 @@ var ( "external/protobuf":/* recursive = */ false, "external/python/absl-py":/* recursive = */ true, + "external/compiler-rt/lib/cfi":/* recursive = */ false, + // this BUILD file is globbed by //external/icu/icu4c/source:icu4c_test_data's "data/**/*". "external/icu/icu4c/source/data/unidata/norm2":/* recursive = */ false, diff --git a/cc/config/global.go b/cc/config/global.go index 4d703e4c3..3eb45773c 100644 --- a/cc/config/global.go +++ b/cc/config/global.go @@ -313,6 +313,8 @@ var ( "device/", "vendor/", } + + VersionScriptFlagPrefix = "-Wl,--version-script," ) // BazelCcToolchainVars generates bzl file content containing variables for @@ -401,6 +403,8 @@ func init() { exportedVars.ExportString("ExperimentalCStdVersion", ExperimentalCStdVersion) exportedVars.ExportString("ExperimentalCppStdVersion", ExperimentalCppStdVersion) + exportedVars.ExportString("VersionScriptFlagPrefix", VersionScriptFlagPrefix) + // Everything in these lists is a crime against abstraction and dependency tracking. // Do not add anything to this list. commonGlobalIncludes := []string{ diff --git a/cc/linker.go b/cc/linker.go index e49b97d0b..257fe86cf 100644 --- a/cc/linker.go +++ b/cc/linker.go @@ -15,11 +15,12 @@ package cc import ( - "android/soong/android" - "android/soong/cc/config" "fmt" "path/filepath" + "android/soong/android" + "android/soong/cc/config" + "github.com/google/blueprint" "github.com/google/blueprint/proptools" ) @@ -542,13 +543,13 @@ func (linker *baseLinker) linkerFlags(ctx ModuleContext, flags Flags) Flags { ctx.PropertyErrorf("version_script", "Not supported on Darwin") } else { flags.Local.LdFlags = append(flags.Local.LdFlags, - "-Wl,--version-script,"+versionScript.String()) + config.VersionScriptFlagPrefix+versionScript.String()) flags.LdFlagsDeps = append(flags.LdFlagsDeps, versionScript.Path()) if linker.sanitize.isSanitizerEnabled(cfi) { - cfiExportsMap := android.PathForSource(ctx, cfiExportsMapPath) + cfiExportsMap := android.PathForSource(ctx, cfiExportsMapPath+"/"+cfiExportsMapFilename) flags.Local.LdFlags = append(flags.Local.LdFlags, - "-Wl,--version-script,"+cfiExportsMap.String()) + config.VersionScriptFlagPrefix+cfiExportsMap.String()) flags.LdFlagsDeps = append(flags.LdFlagsDeps, cfiExportsMap) } } diff --git a/cc/sanitize.go b/cc/sanitize.go index c899cc47e..cc81d0ecb 100644 --- a/cc/sanitize.go +++ b/cc/sanitize.go @@ -62,14 +62,18 @@ var ( "-fast-isel=false", } - cfiCflags = []string{"-flto", "-fsanitize-cfi-cross-dso", - "-fsanitize-ignorelist=external/compiler-rt/lib/cfi/cfi_blocklist.txt"} + cfiBlocklistPath = "external/compiler-rt/lib/cfi" + cfiBlocklistFilename = "cfi_blocklist.txt" + cfiCflags = []string{"-flto", "-fsanitize-cfi-cross-dso", + "-fsanitize-ignorelist=" + cfiBlocklistPath + "/" + cfiBlocklistFilename} // -flto and -fvisibility are required by clang when -fsanitize=cfi is // used, but have no effect on assembly files cfiAsflags = []string{"-flto", "-fvisibility=default"} cfiLdflags = []string{"-flto", "-fsanitize-cfi-cross-dso", "-fsanitize=cfi", "-Wl,-plugin-opt,O1"} - cfiExportsMapPath = "build/soong/cc/config/cfi_exports.map" + cfiExportsMapPath = "build/soong/cc/config" + cfiExportsMapFilename = "cfi_exports.map" + cfiAssemblySupportFlag = "-fno-sanitize-cfi-canonical-jump-tables" intOverflowCflags = []string{"-fsanitize-ignorelist=build/soong/cc/config/integer_overflow_blocklist.txt"} @@ -388,6 +392,18 @@ func init() { exportedVars.ExportStringListStaticVariable("HostOnlySanitizeFlags", hostOnlySanitizeFlags) exportedVars.ExportStringList("DeviceOnlySanitizeFlags", deviceOnlySanitizeFlags) + // Leave out "-flto" from the slices exported to bazel, as we will use the + // dedicated LTO feature for this + exportedVars.ExportStringList("CfiCFlags", cfiCflags[1:]) + exportedVars.ExportStringList("CfiAsFlags", cfiAsflags[1:]) + exportedVars.ExportStringList("CfiLdFlags", cfiLdflags[1:]) + + exportedVars.ExportString("CfiBlocklistPath", cfiBlocklistPath) + exportedVars.ExportString("CfiBlocklistFilename", cfiBlocklistFilename) + exportedVars.ExportString("CfiExportsMapPath", cfiExportsMapPath) + exportedVars.ExportString("CfiExportsMapFilename", cfiExportsMapFilename) + exportedVars.ExportString("CfiAssemblySupportFlag", cfiAssemblySupportFlag) + android.RegisterMakeVarsProvider(pctx, cfiMakeVarsProvider) android.RegisterMakeVarsProvider(pctx, hwasanMakeVarsProvider) } @@ -810,7 +826,7 @@ func (s *sanitize) flags(ctx ModuleContext, flags Flags) Flags { flags.Local.CFlags = append(flags.Local.CFlags, cfiCflags...) flags.Local.AsFlags = append(flags.Local.AsFlags, cfiAsflags...) if Bool(s.Properties.Sanitize.Config.Cfi_assembly_support) { - flags.Local.CFlags = append(flags.Local.CFlags, "-fno-sanitize-cfi-canonical-jump-tables") + flags.Local.CFlags = append(flags.Local.CFlags, cfiAssemblySupportFlag) } // Only append the default visibility flag if -fvisibility has not already been set // to hidden. diff --git a/tests/lib.sh b/tests/lib.sh index 2bcb63089..26608b8f3 100644 --- a/tests/lib.sh +++ b/tests/lib.sh @@ -91,6 +91,7 @@ function create_mock_soong { symlink_directory prebuilts/go symlink_directory prebuilts/build-tools symlink_directory prebuilts/clang/host + symlink_directory external/compiler-rt symlink_directory external/go-cmp symlink_directory external/golang-protobuf symlink_directory external/starlark-go |