syzkaller/Makefile
Dmitry Vyukov 17f8d6a03d Makefile: strip executor
We don't generate debug info for Go binaries to reduce their size.
Don't generate debug info for executor as well.
For akaros this reduces binary size from 4.5MB to 800KB.
2017-10-16 14:21:54 +02:00

259 lines
9.7 KiB
Makefile

# Copyright 2017 syzkaller project authors. All rights reserved.
# Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file.
# There are 4 OS/arch pairs:
# - BUILDOS/BUILDARCH: the current machine's pair used for build.
# - HOSTOS/HOSTARCH: pair where syz-manager will run.
# - TARGETOS/TARGETVMARCH: pair of the target OS under test.
# - TARGETOS/TARGETARCH: pair of the target test process.
#
# The last 2 differ for e.g. amd64 OS and 386 test processes (compat syscall testing).
# All pairs default to the current machine. All but BUILD can be overriden.
#
# For example, to test linux/amd64 on linux/amd64, you just run:
# make
# To test linux/arm64 from darwin/amd64 host, run:
# make HOSTOS=darwin HOSTARCH=amd64 TARGETOS=linux TARGETARCH=arm64
# To test x86 compat syscalls, run:
# make TARGETVMARCH=amd64 TARGETARCH=386
#
# There is a special case for Android builds:
# NDK=/path/to/android/ndk make TARGETOS=android TARGETARCH=arm64
# But you still need to specify "target": "linux/arm64" in syz-manager config.
BUILDOS := $(shell go env GOOS)
BUILDARCH := $(shell go env GOARCH)
HOSTOS ?= $(BUILDOS)
HOSTARCH ?= $(BUILDARCH)
TARGETOS ?= $(HOSTOS)
TARGETARCH ?= $(HOSTARCH)
TARGETVMARCH ?= $(TARGETARCH)
EXTRACTOS := $(TARGETOS)
GO := go
EXE :=
ifeq ("$(TARGETARCH)", "amd64")
CC = "x86_64-linux-gnu-gcc"
else ifeq ("$(TARGETARCH)", "386")
CC = "x86_64-linux-gnu-gcc"
ADDCFLAGS = "-m32"
else ifeq ("$(TARGETARCH)", "arm64")
CC = "aarch64-linux-gnu-gcc"
else ifeq ("$(TARGETARCH)", "arm")
CC = "arm-linux-gnueabihf-gcc"
ADDCFLAGS = "-march=armv6t2"
else ifeq ("$(TARGETARCH)", "ppc64le")
CC = "powerpc64le-linux-gnu-gcc"
endif
ifeq ("$(TARGETOS)", "android")
EXTRACTOS = android
override TARGETOS = linux
ANDROID_API = 24
BUILDGCCARCH = ""
ANDROIDARCH = ""
TOOLCHAIN = ""
GCCBIN = ""
ifeq ("$(TARGETARCH)", "amd64")
ANDROIDARCH = "x86_64"
TOOLCHAIN = "x86_64-4.9"
GCCBIN = "x86_64-linux-android-g++"
else ifeq ("$(TARGETARCH)", "386")
ANDROIDARCH = "x86"
TOOLCHAIN = "x86-4.9"
GCCBIN = "i686-linux-android-g++"
else ifeq ("$(TARGETARCH)", "arm64")
ANDROIDARCH = "arm64"
TOOLCHAIN = "aarch64-linux-android-4.9"
GCCBIN = "aarch64-linux-android-g++"
else ifeq ("$(TARGETARCH)", "arm")
ANDROIDARCH = "arm"
TOOLCHAIN = "arm-linux-androideabi-4.9"
GCCBIN = "arm-linux-androideabi-g++"
endif
ifeq ("$(BUILDARCH)", "amd64")
BUILDGCCARCH = "x86_64"
else ifeq ("$(BUILDARCH)", "arm64")
BUILDGCCARCH = "aarch64"
endif
CC = $(NDK)/toolchains/$(TOOLCHAIN)/prebuilt/$(BUILDOS)-$(BUILDGCCARCH)/bin/$(GCCBIN)
CFLAGS = -I $(NDK)/sources/cxx-stl/llvm-libc++/include --sysroot=$(NDK)/platforms/android-$(ANDROID_API)/arch-$(ANDROIDARCH) -static
endif
ifeq ("$(TARGETOS)", "fuchsia")
# SOURCEDIR should point to fuchsia checkout.
GO = $(SOURCEDIR)/buildtools/go
CC = $(SOURCEDIR)/buildtools/linux-x64/clang/bin/clang++
export CGO_ENABLED=1
NOSTATIC = 1
ifeq ("$(TARGETARCH)", "amd64")
ADDCFLAGS = --target=x86_64-fuchsia -lfdio -lzircon --sysroot $(SOURCEDIR)/out/build-zircon/build-zircon-pc-x86-64/sysroot
else ifeq ("$(TARGETARCH)", "arm64")
ADDCFLAGS = --target=aarch64-fuchsia -lfdio -lzircon --sysroot $(SOURCEDIR)/out/build-zircon/build-zircon-pc-x86-64/sysroot
endif
endif
ifeq ("$(TARGETOS)", "akaros")
# SOURCEDIR should point to bootstrapped akaros checkout.
# There is no up-to-date Go for akaros, so building Go will fail.
CC = $(SOURCEDIR)/install/x86_64-ucb-akaros-gcc/bin/x86_64-ucb-akaros-g++
# Most likely this is incorrect (why doesn't it know own sysroot?), but worked for me.
ADDCFLAGS = -I $(SOURCEDIR)/tools/compilers/gcc-glibc/x86_64-ucb-akaros-gcc-stage3-builddir/x86_64-ucb-akaros/libstdc++-v3/include/x86_64-ucb-akaros -I $(SOURCEDIR)/tools/compilers/gcc-glibc/x86_64-ucb-akaros-gcc-stage3-builddir/x86_64-ucb-akaros/libstdc++-v3/include -I $(SOURCEDIR)/tools/compilers/gcc-glibc/gcc-4.9.2/libstdc++-v3/libsupc++ -L $(SOURCEDIR)/tools/compilers/gcc-glibc/x86_64-ucb-akaros-gcc-stage3-builddir/x86_64-ucb-akaros/libstdc++-v3/src/.libs
endif
ifeq ("$(TARGETOS)", "windows")
EXE = .exe
endif
GITREV=$(shell git rev-parse HEAD)
ifeq ($(`git diff --shortstat`), "")
REV=$(GITREV)
else
REV=$(GITREV)+
endif
NOSTATIC ?= 0
ifeq ($(NOSTATIC), 0)
ADDCFLAGS += -static
endif
# Don't generate symbol table and DWARF debug info.
# Reduces build time and binary sizes considerably.
# That's only needed if you use gdb or nm.
# If you need that, build manually without these flags.
GOFLAGS := "-ldflags=-s -w -X github.com/google/syzkaller/sys.GitRevision=$(REV)"
ifneq ("$(GOTAGS)", "")
GOFLAGS += "-tags=$(GOTAGS)"
endif
.PHONY: all host target \
manager fuzzer executor \
ci hub \
execprog mutate prog2c stress repro upgrade db \
bin/syz-sysgen bin/syz-extract bin/syz-fmt \
extract generate \
format tidy test arch presubmit clean
all: host target
host:
GOOS=$(HOSTOS) GOARCH=$(HOSTARCH) $(GO) install ./syz-manager
$(MAKE) manager repro mutate prog2c db upgrade
target:
GOOS=$(TARGETOS) GOARCH=$(TARGETVMARCH) $(GO) install ./syz-fuzzer
$(MAKE) fuzzer execprog stress executor
# executor uses stacks of limited size, so no jumbo frames.
executor:
mkdir -p ./bin/$(TARGETOS)_$(TARGETARCH)
$(CC) -o ./bin/$(TARGETOS)_$(TARGETARCH)/syz-executor$(EXE) executor/executor_$(TARGETOS).cc \
-pthread -Wall -Wframe-larger-than=8192 -Wparentheses -Werror -O1 \
$(ADDCFLAGS) $(CFLAGS) -DGOOS=\"$(TARGETOS)\" -DGIT_REVISION=\"$(REV)\"
strip --strip-debug ./bin/$(TARGETOS)_$(TARGETARCH)/syz-executor$(EXE)
manager:
GOOS=$(HOSTOS) GOARCH=$(HOSTARCH) $(GO) build $(GOFLAGS) -o ./bin/syz-manager github.com/google/syzkaller/syz-manager
fuzzer:
GOOS=$(TARGETOS) GOARCH=$(TARGETVMARCH) $(GO) build $(GOFLAGS) -o ./bin/$(TARGETOS)_$(TARGETVMARCH)/syz-fuzzer$(EXE) github.com/google/syzkaller/syz-fuzzer
execprog:
GOOS=$(TARGETOS) GOARCH=$(TARGETVMARCH) $(GO) build $(GOFLAGS) -o ./bin/$(TARGETOS)_$(TARGETVMARCH)/syz-execprog$(EXE) github.com/google/syzkaller/tools/syz-execprog
ci:
GOOS=$(HOSTOS) GOARCH=$(HOSTARCH) $(GO) build $(GOFLAGS) -o ./bin/syz-ci github.com/google/syzkaller/syz-ci
hub:
GOOS=$(HOSTOS) GOARCH=$(HOSTARCH) $(GO) build $(GOFLAGS) -o ./bin/syz-hub github.com/google/syzkaller/syz-hub
repro:
GOOS=$(HOSTOS) GOARCH=$(HOSTARCH) $(GO) build $(GOFLAGS) -o ./bin/syz-repro github.com/google/syzkaller/tools/syz-repro
mutate:
GOOS=$(HOSTOS) GOARCH=$(HOSTARCH) $(GO) build $(GOFLAGS) -o ./bin/syz-mutate github.com/google/syzkaller/tools/syz-mutate
prog2c:
GOOS=$(HOSTOS) GOARCH=$(HOSTARCH) $(GO) build $(GOFLAGS) -o ./bin/syz-prog2c github.com/google/syzkaller/tools/syz-prog2c
stress:
GOOS=$(TARGETOS) GOARCH=$(TARGETVMARCH) $(GO) build $(GOFLAGS) -o ./bin/$(TARGETOS)_$(TARGETVMARCH)/syz-stress$(EXE) github.com/google/syzkaller/tools/syz-stress
db:
GOOS=$(HOSTOS) GOARCH=$(HOSTARCH) $(GO) build $(GOFLAGS) -o ./bin/syz-db github.com/google/syzkaller/tools/syz-db
upgrade:
GOOS=$(HOSTOS) GOARCH=$(HOSTARCH) $(GO) build $(GOFLAGS) -o ./bin/syz-upgrade github.com/google/syzkaller/tools/syz-upgrade
extract: bin/syz-extract
bin/syz-extract -build -os=$(EXTRACTOS) -sourcedir=$(SOURCEDIR)
bin/syz-extract:
$(GO) build $(GOFLAGS) -o $@ ./sys/syz-extract
generate: bin/syz-sysgen
bin/syz-sysgen
$(GO) generate ./pkg/csource ./executor ./pkg/ifuzz ./pkg/kernel
$(MAKE) format
bin/syz-sysgen:
$(GO) build $(GOFLAGS) -o $@ ./sys/syz-sysgen
format: bin/syz-fmt
$(GO) fmt ./...
clang-format --style=file -i executor/*.cc executor/*.h tools/kcovtrace/*.c
bin/syz-fmt sys/freebsd
bin/syz-fmt sys/linux
bin/syz-fmt sys/fuchsia
bin/syz-fmt sys/windows
bin/syz-fmt:
$(GO) build $(GOFLAGS) -o $@ ./tools/syz-fmt
tidy:
# A single check is enabled for now. But it's always fixable and proved to be useful.
clang-tidy -quiet -header-filter=.* -checks=-*,misc-definitions-in-headers -warnings-as-errors=* executor/*.cc
# Just check for compiler warnings.
$(CC) executor/test_executor.cc -c -o /dev/null -Wparentheses -Wno-unused -Wall
test:
$(GO) test -short ./...
$(GO) test -short -race ./...
arch:
env GOOG=darwin GOARCH=amd64 go install github.com/google/syzkaller/syz-manager
env HOSTOS=darwin HOSTARCH=amd64 $(MAKE) host
env GOOG=linux GOARCH=amd64 go install github.com/google/syzkaller/syz-manager
env HOSTOS=linux HOSTARCH=amd64 $(MAKE) host
env GOOG=linux GOARCH=amd64 go install github.com/google/syzkaller/syz-fuzzer
env TARGETOS=linux TARGETARCH=amd64 $(MAKE) target
env GOOG=linux GOARCH=arm64 go install github.com/google/syzkaller/syz-fuzzer
env TARGETOS=linux TARGETARCH=arm64 $(MAKE) target
env GOOG=linux GOARCH=ppc64le go install github.com/google/syzkaller/syz-fuzzer
env TARGETOS=linux TARGETARCH=ppc64le $(MAKE) target
# executor build on arm fails with:
# Error: alignment too large: 15 assumed
env GOOG=linux GOARCH=arm64 go install github.com/google/syzkaller/syz-fuzzer
env TARGETOS=linux TARGETARCH=arm64 TARGETVMARCH=arm $(MAKE) target
# executor build on 386 on travis fails with:
# fatal error: asm/errno.h: No such file or directory
# We install a bunch of additional packages in .travis.yml,
# but I can't guess the right one.
env GOOG=linux GOARCH=386 go install github.com/google/syzkaller/syz-fuzzer
env TARGETOS=linux TARGETARCH=amd64 TARGETVMARCH=386 $(MAKE) target
env GOOG=windows go install github.com/google/syzkaller/syz-fuzzer
env TARGETOS=windows TARGETARCH=amd64 $(MAKE) fuzzer execprog stress
env GOOG=freebsd go install github.com/google/syzkaller/syz-fuzzer
env TARGETOS=freebsd TARGETARCH=amd64 $(MAKE) fuzzer execprog stress
presubmit:
$(MAKE) generate
$(MAKE) all
$(MAKE) arch
$(MAKE) test
echo LGTM
clean:
rm -rf ./bin/
# For a tupical Ubuntu/Debian distribution, requires sudo.
install_prerequisites:
apt-get install libc6-dev-i386 lib32stdc++-4.8-dev linux-libc-dev g++-aarch64-linux-gnu g++-powerpc64le-linux-gnu g++-arm-linux-gnueabihf