1*08b48e0bSAndroid Build Coastguard Worker# 2*08b48e0bSAndroid Build Coastguard Worker# american fuzzy lop++ - GCC plugin instrumentation 3*08b48e0bSAndroid Build Coastguard Worker# ----------------------------------------------- 4*08b48e0bSAndroid Build Coastguard Worker# 5*08b48e0bSAndroid Build Coastguard Worker# Written by Austin Seipp <[email protected]> and 6*08b48e0bSAndroid Build Coastguard Worker# Laszlo Szekeres <[email protected]> and 7*08b48e0bSAndroid Build Coastguard Worker# Michal Zalewski and 8*08b48e0bSAndroid Build Coastguard Worker# Heiko Eißfeldt <[email protected]> 9*08b48e0bSAndroid Build Coastguard Worker# 10*08b48e0bSAndroid Build Coastguard Worker# GCC integration design is based on the LLVM design, which comes 11*08b48e0bSAndroid Build Coastguard Worker# from Laszlo Szekeres. 12*08b48e0bSAndroid Build Coastguard Worker# 13*08b48e0bSAndroid Build Coastguard Worker# Copyright 2015 Google Inc. All rights reserved. 14*08b48e0bSAndroid Build Coastguard Worker# Copyright 2019-2024 AFLplusplus Project. All rights reserved. 15*08b48e0bSAndroid Build Coastguard Worker# 16*08b48e0bSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License"); 17*08b48e0bSAndroid Build Coastguard Worker# you may not use this file except in compliance with the License. 18*08b48e0bSAndroid Build Coastguard Worker# You may obtain a copy of the License at: 19*08b48e0bSAndroid Build Coastguard Worker# 20*08b48e0bSAndroid Build Coastguard Worker# https://www.apache.org/licenses/LICENSE-2.0 21*08b48e0bSAndroid Build Coastguard Worker# 22*08b48e0bSAndroid Build Coastguard Worker#TEST_MMAP=1 23*08b48e0bSAndroid Build Coastguard WorkerPREFIX ?= /usr/local 24*08b48e0bSAndroid Build Coastguard WorkerHELPER_PATH ?= $(PREFIX)/lib/afl 25*08b48e0bSAndroid Build Coastguard WorkerBIN_PATH ?= $(PREFIX)/bin 26*08b48e0bSAndroid Build Coastguard WorkerDOC_PATH ?= $(PREFIX)/share/doc/afl 27*08b48e0bSAndroid Build Coastguard WorkerMAN_PATH ?= $(PREFIX)/share/man/man8 28*08b48e0bSAndroid Build Coastguard Worker 29*08b48e0bSAndroid Build Coastguard WorkerVERSION = $(shell grep '^$(HASH)define VERSION ' ./config.h | cut -d '"' -f2) 30*08b48e0bSAndroid Build Coastguard Worker 31*08b48e0bSAndroid Build Coastguard WorkerCFLAGS ?= -O3 -g -funroll-loops 32*08b48e0bSAndroid Build Coastguard Worker# -D_FORTIFY_SOURCE=1 33*08b48e0bSAndroid Build Coastguard WorkerCFLAGS_SAFE := -Wall -Iinclude -Wno-pointer-sign \ 34*08b48e0bSAndroid Build Coastguard Worker -DAFL_PATH=\"$(HELPER_PATH)\" -DBIN_PATH=\"$(BIN_PATH)\" \ 35*08b48e0bSAndroid Build Coastguard Worker -DGCC_VERSION=\"$(GCCVER)\" -DGCC_BINDIR=\"$(GCCBINDIR)\" \ 36*08b48e0bSAndroid Build Coastguard Worker -Wno-unused-function 37*08b48e0bSAndroid Build Coastguard Workeroverride CFLAGS += $(CFLAGS_SAFE) 38*08b48e0bSAndroid Build Coastguard Worker 39*08b48e0bSAndroid Build Coastguard WorkerCXXFLAGS ?= -O3 -g -funroll-loops 40*08b48e0bSAndroid Build Coastguard Worker# -D_FORTIFY_SOURCE=1 41*08b48e0bSAndroid Build Coastguard WorkerCXXEFLAGS := $(CXXFLAGS) $(CPPFLAGS) -Wall -std=c++11 42*08b48e0bSAndroid Build Coastguard Worker 43*08b48e0bSAndroid Build Coastguard WorkerCC ?= gcc 44*08b48e0bSAndroid Build Coastguard WorkerCXX ?= g++ 45*08b48e0bSAndroid Build Coastguard Worker 46*08b48e0bSAndroid Build Coastguard WorkerSYS = $(shell uname -s) 47*08b48e0bSAndroid Build Coastguard Worker 48*08b48e0bSAndroid Build Coastguard Workerifeq "clang" "$(CC)" 49*08b48e0bSAndroid Build Coastguard Worker CC = gcc 50*08b48e0bSAndroid Build Coastguard Worker CXX = g++ 51*08b48e0bSAndroid Build Coastguard Workerendif 52*08b48e0bSAndroid Build Coastguard Worker 53*08b48e0bSAndroid Build Coastguard Workerifeq "clang++" "$(CXX)" 54*08b48e0bSAndroid Build Coastguard Worker CC = gcc 55*08b48e0bSAndroid Build Coastguard Worker CXX = g++ 56*08b48e0bSAndroid Build Coastguard Workerendif 57*08b48e0bSAndroid Build Coastguard Worker 58*08b48e0bSAndroid Build Coastguard Workerifeq "$(findstring Foundation,$(shell $(CC) --version))" "" 59*08b48e0bSAndroid Build Coastguard Worker CC = gcc 60*08b48e0bSAndroid Build Coastguard Worker CXX = g++ 61*08b48e0bSAndroid Build Coastguard Workerendif 62*08b48e0bSAndroid Build Coastguard Worker 63*08b48e0bSAndroid Build Coastguard WorkerPLUGIN_BASE = "$(shell $(CC) -print-file-name=plugin)" 64*08b48e0bSAndroid Build Coastguard WorkerPLUGIN_FLAGS = -fPIC -fno-rtti -fno-exceptions -I$(PLUGIN_BASE)/include -I$(PLUGIN_BASE) 65*08b48e0bSAndroid Build Coastguard WorkerHASH=\# 66*08b48e0bSAndroid Build Coastguard Worker 67*08b48e0bSAndroid Build Coastguard WorkerGCCVER = $(shell $(CC) --version 2>/dev/null | awk 'NR == 1 {print $$NF}') 68*08b48e0bSAndroid Build Coastguard WorkerGCCBINDIR = $(shell dirname `command -v $(CC)` 2>/dev/null ) 69*08b48e0bSAndroid Build Coastguard Worker 70*08b48e0bSAndroid Build Coastguard Workerifeq "$(shell echo '$(HASH)include <sys/ipc.h>@$(HASH)include <sys/shm.h>@int main() { int _id = shmget(IPC_PRIVATE, 65536, IPC_CREAT | IPC_EXCL | 0600); shmctl(_id, IPC_RMID, 0); return 0;}' | tr @ '\n' | $(CC) -x c - -o .test2 2>/dev/null && echo 1 || echo 0 ; rm -f .test2 )" "1" 71*08b48e0bSAndroid Build Coastguard Worker SHMAT_OK=1 72*08b48e0bSAndroid Build Coastguard Workerelse 73*08b48e0bSAndroid Build Coastguard Worker SHMAT_OK=0 74*08b48e0bSAndroid Build Coastguard Worker override CFLAGS_SAFE += -DUSEMMAP=1 75*08b48e0bSAndroid Build Coastguard Workerendif 76*08b48e0bSAndroid Build Coastguard Worker 77*08b48e0bSAndroid Build Coastguard Workerifeq "$(TEST_MMAP)" "1" 78*08b48e0bSAndroid Build Coastguard Worker SHMAT_OK=0 79*08b48e0bSAndroid Build Coastguard Worker override CFLAGS_SAFE += -DUSEMMAP=1 80*08b48e0bSAndroid Build Coastguard Workerendif 81*08b48e0bSAndroid Build Coastguard Worker 82*08b48e0bSAndroid Build Coastguard Workerifneq "$(SYS)" "Haiku" 83*08b48e0bSAndroid Build Coastguard Workerifneq "$(SYS)" "OpenBSD" 84*08b48e0bSAndroid Build Coastguard Worker LDFLAGS += -lrt 85*08b48e0bSAndroid Build Coastguard Workerendif 86*08b48e0bSAndroid Build Coastguard Workerelse 87*08b48e0bSAndroid Build Coastguard Worker CFLAGS_SAFE += -DUSEMMAP=1 88*08b48e0bSAndroid Build Coastguard Workerendif 89*08b48e0bSAndroid Build Coastguard Worker 90*08b48e0bSAndroid Build Coastguard Workerifeq "$(SYS)" "OpenBSD" 91*08b48e0bSAndroid Build Coastguard Worker CC = egcc 92*08b48e0bSAndroid Build Coastguard Worker CXX = eg++ 93*08b48e0bSAndroid Build Coastguard Worker PLUGIN_FLAGS += -I/usr/local/include 94*08b48e0bSAndroid Build Coastguard Workerendif 95*08b48e0bSAndroid Build Coastguard Worker 96*08b48e0bSAndroid Build Coastguard Workerifeq "$(SYS)" "DragonFly" 97*08b48e0bSAndroid Build Coastguard Worker PLUGIN_FLAGS += -I/usr/local/include 98*08b48e0bSAndroid Build Coastguard Workerendif 99*08b48e0bSAndroid Build Coastguard Worker 100*08b48e0bSAndroid Build Coastguard Workerifeq "$(SYS)" "SunOS" 101*08b48e0bSAndroid Build Coastguard Worker PLUGIN_FLAGS += -I/usr/include/gmp 102*08b48e0bSAndroid Build Coastguard Workerendif 103*08b48e0bSAndroid Build Coastguard Worker 104*08b48e0bSAndroid Build Coastguard Worker 105*08b48e0bSAndroid Build Coastguard WorkerPASSES = ./afl-gcc-pass.so ./afl-gcc-cmplog-pass.so ./afl-gcc-cmptrs-pass.so 106*08b48e0bSAndroid Build Coastguard Worker 107*08b48e0bSAndroid Build Coastguard WorkerPROGS = $(PASSES) ./afl-compiler-rt.o ./afl-compiler-rt-32.o ./afl-compiler-rt-64.o 108*08b48e0bSAndroid Build Coastguard Worker 109*08b48e0bSAndroid Build Coastguard Worker.PHONY: all 110*08b48e0bSAndroid Build Coastguard Workerall: test_shm test_deps $(PROGS) test_build all_done 111*08b48e0bSAndroid Build Coastguard Worker 112*08b48e0bSAndroid Build Coastguard Worker.PHONY: test_shm 113*08b48e0bSAndroid Build Coastguard Workerifeq "$(SHMAT_OK)" "1" 114*08b48e0bSAndroid Build Coastguard Workertest_shm: 115*08b48e0bSAndroid Build Coastguard Worker @echo "[+] shmat seems to be working." 116*08b48e0bSAndroid Build Coastguard Worker @rm -f .test2 117*08b48e0bSAndroid Build Coastguard Workerelse 118*08b48e0bSAndroid Build Coastguard Workertest_shm: 119*08b48e0bSAndroid Build Coastguard Worker @echo "[-] shmat seems not to be working, switching to mmap implementation" 120*08b48e0bSAndroid Build Coastguard Workerendif 121*08b48e0bSAndroid Build Coastguard Worker 122*08b48e0bSAndroid Build Coastguard Worker.PHONY: test_deps 123*08b48e0bSAndroid Build Coastguard Workertest_deps: 124*08b48e0bSAndroid Build Coastguard Worker @echo "[*] Checking for working '$(CC)'..." 125*08b48e0bSAndroid Build Coastguard Worker @command -v $(CC) >/dev/null 2>&1 || ( echo "[-] Oops, can't find '$(CC)'. Make sure that it's in your \$$PATH (or set \$$CC and \$$CXX)."; exit 1 ) 126*08b48e0bSAndroid Build Coastguard Worker# @echo "[*] Checking for gcc for plugin support..." 127*08b48e0bSAndroid Build Coastguard Worker# @$(CC) -v 2>&1 | grep -q -- --enable-plugin || ( echo "[-] Oops, this gcc has not been configured with plugin support."; exit 1 ) 128*08b48e0bSAndroid Build Coastguard Worker @echo "[*] Checking for gcc plugin development header files..." 129*08b48e0bSAndroid Build Coastguard Worker @test -d `$(CC) -print-file-name=plugin`/include || ( echo "[-] Oops, can't find gcc header files. Be sure to install 'gcc-X-plugin-dev'."; exit 1 ) 130*08b48e0bSAndroid Build Coastguard Worker @echo "[*] Checking for './afl-showmap'..." 131*08b48e0bSAndroid Build Coastguard Worker @test -f ./afl-showmap || ( echo "[-] Oops, can't find './afl-showmap'. Be sure to compile AFL first."; exit 1 ) 132*08b48e0bSAndroid Build Coastguard Worker @echo "[+] All set and ready to build." 133*08b48e0bSAndroid Build Coastguard Worker 134*08b48e0bSAndroid Build Coastguard Workerafl-common.o: ./src/afl-common.c 135*08b48e0bSAndroid Build Coastguard Worker $(CC) $(CFLAGS) $(CPPFLAGS) -c $< -o $@ $(LDFLAGS) 136*08b48e0bSAndroid Build Coastguard Worker 137*08b48e0bSAndroid Build Coastguard Worker./afl-compiler-rt.o: instrumentation/afl-compiler-rt.o.c 138*08b48e0bSAndroid Build Coastguard Worker $(CC) $(CFLAGS_SAFE) $(CPPFLAGS) -O3 -Wno-unused-result -fPIC -c $< -o $@ 139*08b48e0bSAndroid Build Coastguard Worker 140*08b48e0bSAndroid Build Coastguard Worker./afl-compiler-rt-32.o: instrumentation/afl-compiler-rt.o.c 141*08b48e0bSAndroid Build Coastguard Worker @printf "[*] Building 32-bit variant of the runtime (-m32)... " 142*08b48e0bSAndroid Build Coastguard Worker @$(CC) $(CFLAGS_SAFE) $(CPPFLAGS) -O3 -Wno-unused-result -m32 -fPIC -c $< -o $@ 2>/dev/null; if [ "$$?" = "0" ]; then echo "success!"; else echo "failed (that's fine)"; fi 143*08b48e0bSAndroid Build Coastguard Worker 144*08b48e0bSAndroid Build Coastguard Worker./afl-compiler-rt-64.o: instrumentation/afl-compiler-rt.o.c 145*08b48e0bSAndroid Build Coastguard Worker @printf "[*] Building 64-bit variant of the runtime (-m64)... " 146*08b48e0bSAndroid Build Coastguard Worker @$(CC) $(CFLAGS_SAFE) $(CPPFLAGS) -O3 -Wno-unused-result -m64 -fPIC -c $< -o $@ 2>/dev/null; if [ "$$?" = "0" ]; then echo "success!"; else echo "failed (that's fine)"; fi 147*08b48e0bSAndroid Build Coastguard Worker 148*08b48e0bSAndroid Build Coastguard Worker$(PASSES): instrumentation/afl-gcc-common.h 149*08b48e0bSAndroid Build Coastguard Worker 150*08b48e0bSAndroid Build Coastguard Worker./afl-gcc-pass.so: instrumentation/afl-gcc-pass.so.cc | test_deps 151*08b48e0bSAndroid Build Coastguard Worker $(CXX) $(CXXEFLAGS) $(PLUGIN_FLAGS) -shared $< -o $@ 152*08b48e0bSAndroid Build Coastguard Worker ln -sf afl-cc afl-gcc-fast 153*08b48e0bSAndroid Build Coastguard Worker ln -sf afl-cc afl-g++-fast 154*08b48e0bSAndroid Build Coastguard Worker ln -sf afl-cc.8 afl-gcc-fast.8 155*08b48e0bSAndroid Build Coastguard Worker ln -sf afl-cc.8 afl-g++-fast.8 156*08b48e0bSAndroid Build Coastguard Worker 157*08b48e0bSAndroid Build Coastguard Worker./afl-gcc-cmplog-pass.so: instrumentation/afl-gcc-cmplog-pass.so.cc | test_deps 158*08b48e0bSAndroid Build Coastguard Worker $(CXX) $(CXXEFLAGS) $(PLUGIN_FLAGS) -shared $< -o $@ 159*08b48e0bSAndroid Build Coastguard Worker 160*08b48e0bSAndroid Build Coastguard Worker./afl-gcc-cmptrs-pass.so: instrumentation/afl-gcc-cmptrs-pass.so.cc | test_deps 161*08b48e0bSAndroid Build Coastguard Worker $(CXX) $(CXXEFLAGS) $(PLUGIN_FLAGS) -shared $< -o $@ 162*08b48e0bSAndroid Build Coastguard Worker 163*08b48e0bSAndroid Build Coastguard Worker.PHONY: test_build 164*08b48e0bSAndroid Build Coastguard Workertest_build: $(PROGS) 165*08b48e0bSAndroid Build Coastguard Worker @echo "[*] Testing the CC wrapper and instrumentation output..." 166*08b48e0bSAndroid Build Coastguard Worker unset AFL_USE_ASAN AFL_USE_MSAN; ASAN_OPTIONS=detect_leaks=0 AFL_QUIET=1 AFL_INST_RATIO=100 AFL_PATH=. AFL_CC=$(CC) ./afl-gcc-fast $(CFLAGS) $(CPPFLAGS) ./test-instr.c -o test-instr $(LDFLAGS) 167*08b48e0bSAndroid Build Coastguard Worker ASAN_OPTIONS=detect_leaks=0 ./afl-showmap -m none -q -o .test-instr0 ./test-instr </dev/null 168*08b48e0bSAndroid Build Coastguard Worker echo 1 | ASAN_OPTIONS=detect_leaks=0 ./afl-showmap -m none -q -o .test-instr1 ./test-instr 169*08b48e0bSAndroid Build Coastguard Worker @rm -f test-instr 170*08b48e0bSAndroid Build Coastguard Worker @cmp -s .test-instr0 .test-instr1; DR="$$?"; rm -f .test-instr0 .test-instr1; if [ "$$DR" = "0" ]; then echo; echo "Oops, the instrumentation does not seem to be behaving correctly!"; echo; echo "Please post to https://github.com/AFLplusplus/AFLplusplus/issues to troubleshoot the issue."; echo; exit 1; fi 171*08b48e0bSAndroid Build Coastguard Worker @echo "[+] All right, the instrumentation seems to be working!" 172*08b48e0bSAndroid Build Coastguard Worker 173*08b48e0bSAndroid Build Coastguard Worker.PHONY: all_done 174*08b48e0bSAndroid Build Coastguard Workerall_done: test_build 175*08b48e0bSAndroid Build Coastguard Worker @echo "[+] All done! You can now use './afl-gcc-fast' to compile programs." 176*08b48e0bSAndroid Build Coastguard Worker 177*08b48e0bSAndroid Build Coastguard Worker.NOTPARALLEL: clean 178*08b48e0bSAndroid Build Coastguard Worker 179*08b48e0bSAndroid Build Coastguard Worker%.8: % 180*08b48e0bSAndroid Build Coastguard Worker @echo .TH $* 8 `date "+%Y-%m-%d"` "AFL++" > ./$@ 181*08b48e0bSAndroid Build Coastguard Worker @echo .SH NAME >> ./$@ 182*08b48e0bSAndroid Build Coastguard Worker @echo .B $* >> ./$@ 183*08b48e0bSAndroid Build Coastguard Worker @echo >> ./$@ 184*08b48e0bSAndroid Build Coastguard Worker @echo .SH SYNOPSIS >> ./$@ 185*08b48e0bSAndroid Build Coastguard Worker @./$* -h 2>&1 | head -n 3 | tail -n 1 | sed 's/^\.\///' >> ./$@ 186*08b48e0bSAndroid Build Coastguard Worker @echo >> ./$@ 187*08b48e0bSAndroid Build Coastguard Worker @echo .SH OPTIONS >> ./$@ 188*08b48e0bSAndroid Build Coastguard Worker @echo .nf >> ./$@ 189*08b48e0bSAndroid Build Coastguard Worker @./$* -h 2>&1 | tail -n +4 >> ./$@ 190*08b48e0bSAndroid Build Coastguard Worker @echo >> ./$@ 191*08b48e0bSAndroid Build Coastguard Worker @echo .SH AUTHOR >> ./$@ 192*08b48e0bSAndroid Build Coastguard Worker @echo "AFL++ was written by Michal \"lcamtuf\" Zalewski and is maintained by Marc \"van Hauser\" Heuse <[email protected]>, Dominik Maier <[email protected]>, Andrea Fioraldi <[email protected]> and Heiko \"hexcoder-\" Eissfeldt <[email protected]>" >> ./$@ 193*08b48e0bSAndroid Build Coastguard Worker @echo The homepage of AFL++ is: https://github.com/AFLplusplus/AFLplusplus >> ./$@ 194*08b48e0bSAndroid Build Coastguard Worker @echo >> ./$@ 195*08b48e0bSAndroid Build Coastguard Worker @echo .SH LICENSE >> ./$@ 196*08b48e0bSAndroid Build Coastguard Worker @echo Apache License Version 2.0, January 2004 >> ./$@ 197*08b48e0bSAndroid Build Coastguard Worker ln -sf afl-cc.8 ./afl-g++-fast.8 198*08b48e0bSAndroid Build Coastguard Worker 199*08b48e0bSAndroid Build Coastguard Worker.PHONY: install 200*08b48e0bSAndroid Build Coastguard Workerinstall: all 201*08b48e0bSAndroid Build Coastguard Worker ln -sf afl-cc $${DESTDIR}$(BIN_PATH)/afl-gcc-fast 202*08b48e0bSAndroid Build Coastguard Worker ln -sf afl-c++ $${DESTDIR}$(BIN_PATH)/afl-g++-fast 203*08b48e0bSAndroid Build Coastguard Worker ln -sf afl-compiler-rt.o $${DESTDIR}$(HELPER_PATH)/afl-gcc-rt.o 204*08b48e0bSAndroid Build Coastguard Worker install -m 755 ./afl-gcc-pass.so $${DESTDIR}$(HELPER_PATH) 205*08b48e0bSAndroid Build Coastguard Worker install -m 755 ./afl-gcc-cmplog-pass.so $${DESTDIR}$(HELPER_PATH) 206*08b48e0bSAndroid Build Coastguard Worker install -m 755 ./afl-gcc-cmptrs-pass.so $${DESTDIR}$(HELPER_PATH) 207*08b48e0bSAndroid Build Coastguard Worker install -m 644 -T instrumentation/README.gcc_plugin.md $${DESTDIR}$(DOC_PATH)/README.gcc_plugin.md 208*08b48e0bSAndroid Build Coastguard Worker 209*08b48e0bSAndroid Build Coastguard Worker.PHONY: clean 210*08b48e0bSAndroid Build Coastguard Workerclean: 211*08b48e0bSAndroid Build Coastguard Worker rm -f *.o *.so *~ a.out core core.[1-9][0-9]* test-instr .test-instr0 .test-instr1 .test2 212*08b48e0bSAndroid Build Coastguard Worker rm -f $(PROGS) afl-common.o ./afl-g++-fast ./afl-g*-fast.8 instrumentation/*.o 213