aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Holler (:decoder) <choller@mozilla.com>2024-01-30 15:30:18 +0100
committerGitHub <noreply@github.com>2024-01-30 14:30:18 +0000
commit644e0694509d4019e6f5075c4b900d412f29df32 (patch)
treef50a160ec5ff6c9282bf7aaa52bf27f8c6edea94
parent75af391408086ee0f1cd892dadb6df2fb16d05c3 (diff)
downloadAFLplusplus-644e0694509d4019e6f5075c4b900d412f29df32.tar.gz
Fixes to afl-cc and documentation (#1974)
* Always compile with -ldl when building for CODE_COVERAGE When building with CODE_COVERAGE, the afl runtime contains code that calls `dladdr` which requires -ldl. Under most circumstances, clang already adds this (e.g. when building with pc-table), but there are some circumstances where it isn't added automatically. * Add visibility declaration to __afl_connected When building with hidden visibility, the use of __AFL_LOOP inside such code can cause linker errors due to __afl_connected being declared "hidden". * Update docs to clarify that CODE_COVERAGE=1 is required for dynamic_covfilter
-rw-r--r--GNUmakefile4
-rw-r--r--src/afl-cc.c7
-rw-r--r--utils/dynamic_covfilter/README.md7
3 files changed, 16 insertions, 2 deletions
diff --git a/GNUmakefile b/GNUmakefile
index b67f9c15..be5b8146 100644
--- a/GNUmakefile
+++ b/GNUmakefile
@@ -66,6 +66,10 @@ ifdef MSAN_BUILD
override LDFLAGS += -fsanitize=memory
endif
+ifdef CODE_COVERAGE
+ override CFLAGS += -D__AFL_CODE_COVERAGE=1
+endif
+
ifeq "$(findstring android, $(shell $(CC) --version 2>/dev/null))" ""
ifeq "$(shell echo 'int main() {return 0; }' | $(CC) $(CFLAGS) -Werror -x c - -flto=full -o .test 2>/dev/null && echo 1 || echo 0 ; rm -f .test )" "1"
CFLAGS_FLTO ?= -flto=full
diff --git a/src/afl-cc.c b/src/afl-cc.c
index 73487188..d11419b0 100644
--- a/src/afl-cc.c
+++ b/src/afl-cc.c
@@ -1521,7 +1521,7 @@ void add_defs_persistent_mode(aflcc_state_t *aflcc) {
"({ static volatile const char *_B __attribute__((used,unused)); "
" _B = (const char*)\"" PERSIST_SIG
"\"; "
- "extern int __afl_connected;"
+ "extern __attribute__((visibility(\"default\"))) int __afl_connected;"
#ifdef __APPLE__
"__attribute__((visibility(\"default\"))) "
"int _L(unsigned int) __asm__(\"___afl_persistent_loop\"); "
@@ -2311,6 +2311,11 @@ void add_runtime(aflcc_state_t *aflcc) {
}
+ #if __AFL_CODE_COVERAGE
+ // Required for dladdr used in afl-compiler-rt.o
+ insert_param(aflcc, "-ldl");
+ #endif
+
#if !defined(__APPLE__) && !defined(__sun)
if (!aflcc->shared_linking && !aflcc->partial_linking)
insert_object(aflcc, "dynamic_list.txt", "-Wl,--dynamic-list=%s", 0);
diff --git a/utils/dynamic_covfilter/README.md b/utils/dynamic_covfilter/README.md
index a64836f1..381e0855 100644
--- a/utils/dynamic_covfilter/README.md
+++ b/utils/dynamic_covfilter/README.md
@@ -7,7 +7,12 @@ where doing this dynamically without requiring a new build can be beneficial.
Especially when dealing with larger builds, it is much more convenient to
select the target code locations at runtime instead of doing so at build time.
-There are two ways of doing this in AFL++:
+There are two ways of doing this in AFL++. Both approaches require a build of
+AFL++ with `CODE_COVERAGE=1`, so make sure to build AFL++ first by invoking
+
+`CODE_COVERAGE=1 make`
+
+Once you have built AFL++, you can choose out of two approaches:
## Simple Selection with `AFL_PC_FILTER`