{ stdenv, fetchFromGitHub, callPackage, makeWrapper , clang, llvm, gcc, which, libcgroup, python, perl, gmp , wine ? null }: # wine fuzzing is only known to work for win32 binaries, and using a mixture of # 32 and 64-bit libraries ... complicates things, so it's recommended to build # a full 32bit version of this package if you want to do wine fuzzing assert (wine != null) -> (stdenv.targetPlatform.system == "i686-linux"); let aflplusplus-qemu = callPackage ./qemu.nix { inherit aflplusplus; }; qemu-exe-name = if stdenv.targetPlatform.system == "x86_64-linux" then "qemu-x86_64" else if stdenv.targetPlatform.system == "i686-linux" then "qemu-i386" else throw "aflplusplus: no support for ${stdenv.targetPlatform.system}!"; libdislocator = callPackage ./libdislocator.nix { inherit aflplusplus; }; libtokencap = callPackage ./libtokencap.nix { inherit aflplusplus; }; aflplusplus = stdenv.mkDerivation rec { pname = "aflplusplus"; version = "2.59c"; src = fetchFromGitHub { owner = "vanhauser-thc"; repo = "AFLplusplus"; rev = version; sha256 = "1ik33ifk4n96762iv1h4kl4jf9yvsq2hgs097wkiy589siw44g5r"; }; enableParallelBuilding = true; # Note: libcgroup isn't needed for building, just for the afl-cgroup # script. nativeBuildInputs = [ makeWrapper which ]; buildInputs = [ llvm python gmp ] ++ stdenv.lib.optional (wine != null) python.pkgs.wrapPython; makeFlags = [ "PREFIX=$(out)" ]; buildPhase = '' common="$makeFlags -j$NIX_BUILD_CORES" make all $common make radamsa $common make -C gcc_plugin CC=${gcc}/bin/gcc CXX=${gcc}/bin/g++ $common make -C llvm_mode $common make -C qemu_mode/libcompcov $common make -C qemu_mode/unsigaction $common ''; postInstall = '' # the makefile neglects to install unsigaction cp qemu_mode/unsigaction/unsigaction*.so $out/lib/afl/ # Install the custom QEMU emulator for binary blob fuzzing. cp ${aflplusplus-qemu}/bin/${qemu-exe-name} $out/bin/afl-qemu-trace # give user a convenient way of accessing libcompconv.so, libdislocator.so, libtokencap.so cat > $out/bin/get-afl-qemu-libcompcov-so <