From d7f9fffab3462d2954b61f144f810256ca007e56 Mon Sep 17 00:00:00 2001 From: Alexander Potapenko Date: Thu, 14 May 2020 12:12:53 +0200 Subject: targets: syz-extract: add Clang support for Linux builds Allow targets.go use Clang instead of the default Linux compiler by setting the SYZ_CLANG=1 env var. Doing so changes the compiler to "clang" and the linker to "ld.ldd", assuming they are in $PATH, and adds the --target and -ferror-limit CFLAGS. Target also exports KernelCompiler and KernelLinker fields now, which allows overriding the compiler and linker in the kernel make invocation. Signed-off-by: Alexander Potapenko --- sys/syz-extract/linux.go | 6 ++++++ sys/targets/targets.go | 12 ++++++++++++ 2 files changed, 18 insertions(+) (limited to 'sys') diff --git a/sys/syz-extract/linux.go b/sys/syz-extract/linux.go index 5eca07daf..29d99d1de 100644 --- a/sys/syz-extract/linux.go +++ b/sys/syz-extract/linux.go @@ -96,6 +96,12 @@ func (*linux) prepareArch(arch *Arch) error { if target.Triple != "" { makeArgs = append(makeArgs, "CROSS_COMPILE="+target.Triple+"-") } + if target.KernelCompiler != "" { + makeArgs = append(makeArgs, "CC="+target.KernelCompiler) + } + if target.KernelLinker != "" { + makeArgs = append(makeArgs, "LD="+target.KernelLinker) + } out, err := osutil.RunCmd(time.Hour, kernelDir, "make", append(makeArgs, "defconfig")...) if err != nil { return fmt.Errorf("make defconfig failed: %v\n%s", err, out) diff --git a/sys/targets/targets.go b/sys/targets/targets.go index 1395b13ff..0bcba8a21 100644 --- a/sys/targets/targets.go +++ b/sys/targets/targets.go @@ -26,6 +26,8 @@ type Target struct { CFlags []string Triple string CCompiler string + KernelCompiler string // override CC when running kernel make + KernelLinker string // override LD when running kernel make KernelArch string KernelHeaderArch string BrokenCompiler string @@ -466,6 +468,15 @@ func initTarget(target *Target, OS, arch string) { target.CCompiler = target.Triple + "-" + target.CCompiler } } + if useClang { + target.CCompiler = "clang" + target.KernelCompiler = "clang" + target.KernelLinker = "ld.lld" + if target.Triple != "" { + target.CFlags = append(target.CFlags, "--target="+target.Triple) + } + target.CFlags = append(target.CFlags, "-ferror-limit=0") + } if target.CPP == "" { target.CPP = "cpp" } @@ -541,6 +552,7 @@ func checkFlagSupported(target *Target, flag string) bool { } var runningOnCI = os.Getenv("CI") != "" +var useClang = os.Getenv("SYZ_CLANG") != "" // is included by executor, so we test is as well. const simpleProg = ` -- cgit mrf-deployment