From ea2f112016170e0c8d786f48d3dacf88cddf169a Mon Sep 17 00:00:00 2001 From: Martin Nyhus Date: Fri, 14 Feb 2025 12:16:46 +0100 Subject: [PATCH 01/15] Fix debug prefix for afl-cc, llvm-rt After the llvm_mode directory was removed in 996986bed5 and compilation started happening from the root, adding llvm_mode to the debug path is incorrect and causes source file lookups to fail when debugging e.g. afl-cc or the llvm pass. --- GNUmakefile.llvm | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/GNUmakefile.llvm b/GNUmakefile.llvm index 2d9cc51a..cc270c4a 100644 --- a/GNUmakefile.llvm +++ b/GNUmakefile.llvm @@ -272,12 +272,6 @@ ifeq "$(LLVM_LTO)" "1" endif endif -ifeq "$(shell echo 'int main() {return 0; }' | $(CLANG_BIN) -x c - -fdebug-prefix-map=$(CURDIR)=llvm_mode -o .test 2>/dev/null && echo 1 || echo 0 ; rm -f .test )" "1" - AFL_CLANG_DEBUG_PREFIX = -fdebug-prefix-map="$(CURDIR)=llvm_mode" -else - AFL_CLANG_DEBUG_PREFIX = -endif - CFLAGS ?= -O3 -funroll-loops -fPIC # -D_FORTIFY_SOURCE=1 CFLAGS_SAFE := -Wall -g -Wno-cast-qual -Wno-variadic-macros -Wno-pointer-sign \ @@ -288,7 +282,7 @@ CFLAGS_SAFE := -Wall -g -Wno-cast-qual -Wno-variadic-macros -Wno-pointer-sig -DAFL_CLANG_FLTO=\"$(AFL_CLANG_FLTO)\" -DAFL_REAL_LD=\"$(AFL_REAL_LD)\" \ -DAFL_CLANG_LDPATH=\"$(AFL_CLANG_LDPATH)\" -DAFL_CLANG_FUSELD=\"$(AFL_CLANG_FUSELD)\" \ -DCLANG_BIN=\"$(CLANG_BIN)\" -DCLANGPP_BIN=\"$(CLANGPP_BIN)\" -DUSE_BINDIR=$(USE_BINDIR) \ - -Wno-unused-function $(AFL_CLANG_DEBUG_PREFIX) + -Wno-unused-function ifndef LLVM_DEBUG CFLAGS_SAFE += -Wno-deprecated endif From 6c4b2f0c8ede7620009c0d3daba8bf7fc7ed1eee Mon Sep 17 00:00:00 2001 From: vanhauser-thc Date: Sat, 15 Feb 2025 12:15:09 +0100 Subject: [PATCH 02/15] fix compile warnings --- src/afl-fuzz-bitmap.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/afl-fuzz-bitmap.c b/src/afl-fuzz-bitmap.c index 877b120e..bd3378f9 100644 --- a/src/afl-fuzz-bitmap.c +++ b/src/afl-fuzz-bitmap.c @@ -29,7 +29,7 @@ #include #include "asanfuzz.h" -static u16 count_class_lookup16[65536]; +u16 count_class_lookup16[65536]; /* Destructively simplify trace by eliminating hit count information and replacing it with 0x80 or 0x01 depending on whether the tuple From 54890db08e884ed558caaa4c77264bc916541a7d Mon Sep 17 00:00:00 2001 From: mio Date: Sat, 15 Feb 2025 23:50:43 +0800 Subject: [PATCH 03/15] Also set /usr/bin/c++ or this fails cc-rs --- Dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/Dockerfile b/Dockerfile index 99998a61..ece1239c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -61,6 +61,7 @@ RUN apt-get update && \ RUN update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-${GCC_VERSION} 0 && \ update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-${GCC_VERSION} 0 && \ + update-alternatives --install /usr/bin/c++ c++ /usr/bin/g++-${GCC_VERSION} 0 && \ update-alternatives --install /usr/bin/clang clang /usr/bin/clang-${LLVM_VERSION} 0 && \ update-alternatives --install /usr/bin/clang++ clang++ /usr/bin/clang++-${LLVM_VERSION} 0 From bd5ccc69772c4c025de6a669f19b65c1065b9bf5 Mon Sep 17 00:00:00 2001 From: Han Zheng Date: Mon, 17 Feb 2025 08:30:57 +0100 Subject: [PATCH 04/15] add doc for deterministic mode --- docs/skipdet_mode.md | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 docs/skipdet_mode.md diff --git a/docs/skipdet_mode.md b/docs/skipdet_mode.md new file mode 100644 index 00000000..87271734 --- /dev/null +++ b/docs/skipdet_mode.md @@ -0,0 +1,29 @@ +# MendelFuzz: The Return of the Deterministic Stage. + +* Authors: Han Zheng, Flavio Toffalini, Marcel Böhme, and Mathias Payer. + +* Maintainer: [Han Zheng](https://github.com/kdsjZh) + +* Preprint: Accepted by [FSE 2025](https://mpi-softsec.github.io/papers/FSE25-mendelfuzz.pdf) + +* Artifact: https://github.com/hexhive/mendelFuzz-Artifact/ + +## Motivation + +Prior works observed that the deterministic stage is not efficient in real-world fuzzing practice. +Therefore, AFL++ disabled it by default since `++3.00c`. While the setup notably boosts the exploration, it is not always the best option. + +In this work, we analyze the overhead and the contributions of the deterministic stage. Our observations suggest that 1) deterministic stage can contribute to coverage, but consumes too much (> 90%) time +in the campaign. 2) mutating a small percentage of (0.5%) bytes and (20%) seeds contributes to >80% of new paths found in the deterministic stage. + +Inspired by these takeaways, we developed MendelFuzz to identify these critical bytes and seeds to boost the deterministic stage. MendelFuzz retains the benefits of the classic deterministic stage by +only enumerating a tiny part of the total deterministic state space. + +## Usage + +MendelFuzz is the default mode in AFL++. Just follow the standard fuzzing practice! + + +## Code Structure + +The implementation is mainly available at `src/afl-fuzz-skipdet.c`. From f37f0b4ee41ff4ccbb775dd1af0d916b532f46a5 Mon Sep 17 00:00:00 2001 From: vanhauser-thc Date: Mon, 17 Feb 2025 08:40:57 +0100 Subject: [PATCH 05/15] easier LTO CTX activation --- src/afl-cc.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/afl-cc.c b/src/afl-cc.c index 56627566..89ff9558 100644 --- a/src/afl-cc.c +++ b/src/afl-cc.c @@ -1152,7 +1152,8 @@ void instrument_mode_by_environ(aflcc_state_t *aflcc) { static void instrument_opt_mode_exclude(aflcc_state_t *aflcc) { if ((aflcc->instrument_opt_mode & INSTRUMENT_OPT_CTX) && - (aflcc->instrument_opt_mode & INSTRUMENT_OPT_CALLER)) { + (aflcc->instrument_opt_mode & INSTRUMENT_OPT_CALLER) && + aflcc->compiler_mode != LTO) { FATAL("you cannot set CTX and CALLER together"); From 2b143688a61ec1444d7072714c30e436e91778ce Mon Sep 17 00:00:00 2001 From: vanhauser-thc Date: Mon, 17 Feb 2025 09:01:01 +0100 Subject: [PATCH 06/15] disable arm64 image due workflow problems --- .github/workflows/container.yml | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/.github/workflows/container.yml b/.github/workflows/container.yml index 5c44f714..2fafa70f 100644 --- a/.github/workflows/container.yml +++ b/.github/workflows/container.yml @@ -45,10 +45,10 @@ jobs: steps: - name: Checkout uses: actions/checkout@v3 - - name: Set up QEMU - uses: docker/setup-qemu-action@v2 - with: - platforms: arm64 + #- name: Set up QEMU + # uses: docker/setup-qemu-action@v2 + # with: + # platforms: arm64 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v2 - name: Login to docker.io @@ -69,7 +69,8 @@ jobs: uses: docker/build-push-action@v3 with: context: . - platforms: linux/amd64,linux/arm64 + platforms: linux/amd64 + #,linux/arm64 push: true tags: ${{ steps.push-tags.outputs.PUSH_TAGS }} cache-from: type=gha From 68f5c4811e67d02245a1520fc3649b287337b596 Mon Sep 17 00:00:00 2001 From: Han Zheng Date: Mon, 17 Feb 2025 09:40:58 +0100 Subject: [PATCH 07/15] move to feature --- docs/features.md | 1 + docs/skipdet_mode.md | 29 ----------------------------- 2 files changed, 1 insertion(+), 29 deletions(-) delete mode 100644 docs/skipdet_mode.md diff --git a/docs/features.md b/docs/features.md index b75c103c..07abb9da 100644 --- a/docs/features.md +++ b/docs/features.md @@ -106,6 +106,7 @@ Among others, the following features and patches have been integrated: * Win32 PE binary-only fuzzing with QEMU and Wine * AFLfast's power schedules by Marcel Böhme: [https://github.com/mboehme/aflfast](https://github.com/mboehme/aflfast) +* The new deterministic mode [MendelFuzz](https://mpi-softsec.github.io/papers/FSE25-mendelfuzz.pdf) * The MOpt mutator: [https://github.com/puppet-meteor/MOpt-AFL](https://github.com/puppet-meteor/MOpt-AFL) * LLVM mode Ngram coverage by Adrian Herrera diff --git a/docs/skipdet_mode.md b/docs/skipdet_mode.md deleted file mode 100644 index 87271734..00000000 --- a/docs/skipdet_mode.md +++ /dev/null @@ -1,29 +0,0 @@ -# MendelFuzz: The Return of the Deterministic Stage. - -* Authors: Han Zheng, Flavio Toffalini, Marcel Böhme, and Mathias Payer. - -* Maintainer: [Han Zheng](https://github.com/kdsjZh) - -* Preprint: Accepted by [FSE 2025](https://mpi-softsec.github.io/papers/FSE25-mendelfuzz.pdf) - -* Artifact: https://github.com/hexhive/mendelFuzz-Artifact/ - -## Motivation - -Prior works observed that the deterministic stage is not efficient in real-world fuzzing practice. -Therefore, AFL++ disabled it by default since `++3.00c`. While the setup notably boosts the exploration, it is not always the best option. - -In this work, we analyze the overhead and the contributions of the deterministic stage. Our observations suggest that 1) deterministic stage can contribute to coverage, but consumes too much (> 90%) time -in the campaign. 2) mutating a small percentage of (0.5%) bytes and (20%) seeds contributes to >80% of new paths found in the deterministic stage. - -Inspired by these takeaways, we developed MendelFuzz to identify these critical bytes and seeds to boost the deterministic stage. MendelFuzz retains the benefits of the classic deterministic stage by -only enumerating a tiny part of the total deterministic state space. - -## Usage - -MendelFuzz is the default mode in AFL++. Just follow the standard fuzzing practice! - - -## Code Structure - -The implementation is mainly available at `src/afl-fuzz-skipdet.c`. From 2c2a0471cdc64f9f348fd28948ca0ee51dcc4468 Mon Sep 17 00:00:00 2001 From: Han Zheng Date: Mon, 17 Feb 2025 09:42:56 +0100 Subject: [PATCH 08/15] fix --- docs/features.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/features.md b/docs/features.md index 07abb9da..6d67ac1f 100644 --- a/docs/features.md +++ b/docs/features.md @@ -106,7 +106,7 @@ Among others, the following features and patches have been integrated: * Win32 PE binary-only fuzzing with QEMU and Wine * AFLfast's power schedules by Marcel Böhme: [https://github.com/mboehme/aflfast](https://github.com/mboehme/aflfast) -* The new deterministic mode [MendelFuzz](https://mpi-softsec.github.io/papers/FSE25-mendelfuzz.pdf) +* The new deterministic mode by Han Zheng: [https://github.com/hexhive/mendelFuzz-Artifact/](https://github.com/hexhive/mendelFuzz-Artifact/) * The MOpt mutator: [https://github.com/puppet-meteor/MOpt-AFL](https://github.com/puppet-meteor/MOpt-AFL) * LLVM mode Ngram coverage by Adrian Herrera From 29f48ab3e7c1d7639c8682b10c2e2c4360bc56f5 Mon Sep 17 00:00:00 2001 From: Han Zheng Date: Mon, 17 Feb 2025 09:43:59 +0100 Subject: [PATCH 09/15] update --- docs/features.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/features.md b/docs/features.md index 6d67ac1f..e98d60fe 100644 --- a/docs/features.md +++ b/docs/features.md @@ -106,7 +106,7 @@ Among others, the following features and patches have been integrated: * Win32 PE binary-only fuzzing with QEMU and Wine * AFLfast's power schedules by Marcel Böhme: [https://github.com/mboehme/aflfast](https://github.com/mboehme/aflfast) -* The new deterministic mode by Han Zheng: [https://github.com/hexhive/mendelFuzz-Artifact/](https://github.com/hexhive/mendelFuzz-Artifact/) +* The fast deterministic stage by Han Zheng: [https://github.com/hexhive/mendelFuzz-Artifact/](https://github.com/hexhive/mendelFuzz-Artifact/) * The MOpt mutator: [https://github.com/puppet-meteor/MOpt-AFL](https://github.com/puppet-meteor/MOpt-AFL) * LLVM mode Ngram coverage by Adrian Herrera From 6f018b3d80e8eddeef10159fa7c308dce5fb2dd0 Mon Sep 17 00:00:00 2001 From: "Dongjia \"toka\" Zhang" Date: Tue, 18 Feb 2025 14:09:43 +0100 Subject: [PATCH 10/15] del --- utils/aflpp_driver/aflpp_driver.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/utils/aflpp_driver/aflpp_driver.c b/utils/aflpp_driver/aflpp_driver.c index 9b79ef9b..6cf62dab 100644 --- a/utils/aflpp_driver/aflpp_driver.c +++ b/utils/aflpp_driver/aflpp_driver.c @@ -392,10 +392,6 @@ __attribute__((weak)) int LLVMFuzzerRunDriver( __afl_manual_init(); - // Call LLVMFuzzerTestOneInput here so that coverage caused by initialization - // on the first execution of LLVMFuzzerTestOneInput is ignored. - callback(dummy_input, 4); - __asan_poison_memory_region(__afl_fuzz_ptr, MAX_FILE); size_t prev_length = 0; From 2843b7eb0275a50a157884b32cadfa652873909f Mon Sep 17 00:00:00 2001 From: intrigus-lgtm <60750685+intrigus-lgtm@users.noreply.github.com> Date: Mon, 17 Feb 2025 19:00:49 +0000 Subject: [PATCH 11/15] feat: enable arm runners in CI --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ffb0e908..21fddfbf 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -14,7 +14,7 @@ jobs: runs-on: "${{ matrix.os }}" strategy: matrix: - os: [ubuntu-24.04, ubuntu-22.04] + os: [ubuntu-24.04, ubuntu-22.04, ubuntu-24.04-arm] env: AFL_SKIP_CPUFREQ: 1 AFL_I_DONT_CARE_ABOUT_MISSING_CRASHES: 1 From 6f433b5d73798cf20c15d525e76c57f6a43949fc Mon Sep 17 00:00:00 2001 From: intrigus-lgtm <60750685+intrigus-lgtm@users.noreply.github.com> Date: Mon, 17 Feb 2025 19:03:51 +0000 Subject: [PATCH 12/15] feat: re-enable arm64 docker containers. Use GH arm runners --- .github/workflows/container.yml | 32 ++++++++++++++++++++++++++------ 1 file changed, 26 insertions(+), 6 deletions(-) diff --git a/.github/workflows/container.yml b/.github/workflows/container.yml index 2fafa70f..4a4fa028 100644 --- a/.github/workflows/container.yml +++ b/.github/workflows/container.yml @@ -35,20 +35,41 @@ jobs: apt-get install -y libcmocka-dev && make -i tests " + build-and-test-arm64: + name: Test arm64 image + runs-on: ubuntu-24.04-arm + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + - name: Build arm64 + uses: docker/build-push-action@v6 + with: + context: . + tags: aflplusplus:test-arm64 + load: true + cache-to: type=gha,mode=max + build-args: | + TEST_BUILD=1 + - name: Test arm64 + run: > + docker run --rm aflplusplus:test-arm64 bash -c " + apt-get update && + apt-get install -y libcmocka-dev && + make -i tests + " push: name: Push amd64 and arm64 images runs-on: ubuntu-latest needs: - build-and-test-amd64 + - build-and-test-arm64 if: ${{ github.event_name == 'push' && github.repository == 'AFLplusplus/AFLplusplus' }} steps: - name: Checkout uses: actions/checkout@v3 - #- name: Set up QEMU - # uses: docker/setup-qemu-action@v2 - # with: - # platforms: arm64 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v2 - name: Login to docker.io @@ -69,8 +90,7 @@ jobs: uses: docker/build-push-action@v3 with: context: . - platforms: linux/amd64 - #,linux/arm64 + platforms: linux/amd64,linux/arm64 push: true tags: ${{ steps.push-tags.outputs.PUSH_TAGS }} cache-from: type=gha From 870e22246ad186e6ad97765d8aa9b8327530909b Mon Sep 17 00:00:00 2001 From: David Carlier Date: Wed, 19 Feb 2025 21:03:21 +0000 Subject: [PATCH 13/15] preparing for LLVM 20 with new sanitizer. note: no real valuable option atm. --- docs/env_variables.md | 1 + src/afl-cc.c | 10 ++++++++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/docs/env_variables.md b/docs/env_variables.md index 727feb16..ed44c256 100644 --- a/docs/env_variables.md +++ b/docs/env_variables.md @@ -107,6 +107,7 @@ fairly broad use of environment variables instead: conditions - `AFL_USE_UBSAN=1` - activates the undefined behavior sanitizer - `AFL_UBSAN_VERBOSE=1` - outputs detailed diagnostic information when undefined behavior is detected, instead of simply terminating with "Illegal Instruction" + . `AFL_USE_RTSAN` . activates the realtime sanitizer (realtime violations in deterministic run time constraints). (clang 20 minimum) - Note: both `AFL_CFISAN_VERBOSE=1` and `AFL_UBSAN_VERBOSE=1` are disabled by default as verbose output can significantly slow down fuzzing performance. Use these options only during debugging or when additional crash diagnostics are required diff --git a/src/afl-cc.c b/src/afl-cc.c index 89ff9558..12a361a8 100644 --- a/src/afl-cc.c +++ b/src/afl-cc.c @@ -181,7 +181,7 @@ typedef struct aflcc_state { have_pic, have_c, shared_linking, partial_linking, non_dash, have_fp, have_flto, have_hidden, have_fortify, have_fcf, have_staticasan, have_rust_asanrt, have_asan, have_msan, have_ubsan, have_lsan, have_tsan, - have_cfisan; + have_cfisan, have_rtsan; // u8 *march_opt; u8 need_aflpplib; @@ -2032,6 +2032,11 @@ void add_sanitizers(aflcc_state_t *aflcc, char **envp) { } + if (getenv("AFL_USE_RTSAN") && !aflcc->have_rtsan) { + insert_param(aflcc, "-fsanitize=realtime"); + aflcc->have_rtsan = 1; + } + if (getenv("AFL_USE_CFISAN") || aflcc->have_cfisan) { if (aflcc->compiler_mode == GCC_PLUGIN || aflcc->compiler_mode == GCC) { @@ -2972,7 +2977,8 @@ static void maybe_usage(aflcc_state_t *aflcc, int argc, char **argv) { " AFL_USE_MSAN: activate memory sanitizer\n" " AFL_USE_UBSAN: activate undefined behaviour sanitizer\n" " AFL_USE_TSAN: activate thread sanitizer\n" - " AFL_USE_LSAN: activate leak-checker sanitizer\n"); + " AFL_USE_LSAN: activate leak-checker sanitizer\n" + " AFL_USE_RTSAN: activate realtime sanitizer\n"); if (aflcc->have_gcc_plugin) SAYF( From 6aaba974b68f8834de5bda374d5aeb82bd5a39ef Mon Sep 17 00:00:00 2001 From: John Samuels Date: Fri, 21 Feb 2025 12:06:14 -0500 Subject: [PATCH 14/15] Update LTO documentation to reference LLVM 19 in all examples --- instrumentation/README.lto.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/instrumentation/README.lto.md b/instrumentation/README.lto.md index 6c26c7d3..6c2915d8 100644 --- a/instrumentation/README.lto.md +++ b/instrumentation/README.lto.md @@ -79,11 +79,11 @@ LLVM 13 to 19 should be available in all current Linux repositories. That part is easy. Just set `LLVM_CONFIG` to the llvm-config-VERSION and build AFL++, e.g. for -LLVM 15: +LLVM 19: ``` cd ~/AFLplusplus -export LLVM_CONFIG=llvm-config-15 +export LLVM_CONFIG=llvm-config-19 make sudo make install ``` @@ -96,7 +96,7 @@ Also, the instrument file listing (AFL_LLVM_ALLOWLIST/AFL_LLVM_DENYLIST -> [README.instrument_list.md](README.instrument_list.md)) and laf-intel/compcov (AFL_LLVM_LAF_* -> [README.laf-intel.md](README.laf-intel.md)) work. -Example (note that you might need to add the version, e.g. `llvm-ar-15`: +Example (note that you might need to add the version, e.g. `llvm-ar-19`: ``` CC=afl-clang-lto CXX=afl-clang-lto++ RANLIB=llvm-ranlib AR=llvm-ar AS=llvm-as ./configure From a635aa8cba7751d2cb45bdfbcb2cb12e564d0b6a Mon Sep 17 00:00:00 2001 From: vanhauser-thc Date: Sun, 23 Feb 2025 13:11:40 +0100 Subject: [PATCH 15/15] potential macos fix --- GNUmakefile.llvm | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/GNUmakefile.llvm b/GNUmakefile.llvm index cc270c4a..da03a57f 100644 --- a/GNUmakefile.llvm +++ b/GNUmakefile.llvm @@ -237,20 +237,21 @@ ifeq "$(LLVM_LTO)" "1" ifeq "$(AFL_REAL_LD)" "" ifneq "$(shell readlink $(LLVM_BINDIR)/ld.lld 2>&1)" "" AFL_REAL_LD = $(LLVM_BINDIR)/ld.lld - else ifneq "$(shell command -v ld.lld 2>/dev/null)" "" - AFL_REAL_LD = $(shell command -v ld.lld) - TMP_LDLDD_VERSION = $(shell $(AFL_REAL_LD) --version | awk '{ print $$2 }') - ifeq "$(LLVMVER)" "$(TMP_LDLDD_VERSION)" - $(warning ld.lld found in a weird location ($(AFL_REAL_LD)), but its the same version as LLVM so we will allow it) + else + ifneq "$(shell command -v ld.lld 2>/dev/null)" "" + AFL_REAL_LD = $(shell command -v ld.lld) + TMP_LDLDD_VERSION = $(shell $(AFL_REAL_LD) --version | awk '{ print $$2 }') + ifeq "$(LLVMVER)" "$(TMP_LDLDD_VERSION)" + $(warning ld.lld found in a weird location ($(AFL_REAL_LD)), but its the same version as LLVM so we will allow it) + else + $(warning ld.lld found in a weird location ($(AFL_REAL_LD)) and its of a different version than LLMV ($(TMP_LDLDD_VERSION) vs. $(LLVMVER)) - cannot enable LTO mode) + AFL_REAL_LD= + LLVM_LTO = 0 + endif else - $(warning ld.lld found in a weird location ($(AFL_REAL_LD)) and its of a different version than LLMV ($(TMP_LDLDD_VERSION) vs. $(LLVMVER)) - cannot enable LTO mode) - AFL_REAL_LD= + $(warning ld.lld not found, cannot enable LTO mode) LLVM_LTO = 0 endif - undefine TMP_LDLDD_VERSION - else - $(warning ld.lld not found, cannot enable LTO mode) - LLVM_LTO = 0 endif endif else