about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--llvm_mode/afl-clang-fast.c22
1 files changed, 21 insertions, 1 deletions
diff --git a/llvm_mode/afl-clang-fast.c b/llvm_mode/afl-clang-fast.c
index f75adf1e..750a6fbd 100644
--- a/llvm_mode/afl-clang-fast.c
+++ b/llvm_mode/afl-clang-fast.c
@@ -161,7 +161,8 @@ static void find_obj(u8 *argv0) {
 
 static void edit_params(u32 argc, char **argv, char **envp) {
 
-  u8  fortify_set = 0, asan_set = 0, x_set = 0, bit_mode = 0;
+  u8  fortify_set = 0, asan_set = 0, x_set = 0, bit_mode = 0,
+      shared_linking = 0, preprocessor_only = 0;
   u8  have_pic = 0;
   u8 *name;
 
@@ -399,6 +400,9 @@ static void edit_params(u32 argc, char **argv, char **envp) {
 
     if (lto_mode && !strncmp(cur, "-fuse-ld=", 9)) continue;
     if (lto_mode && !strncmp(cur, "--ld-path=", 10)) continue;
+    
+    if (!strcmp(cur, "-E")) preprocessor_only = 1;
+    if (!strcmp(cur, "-shared")) shared_linking = 1;
 
     cc_params[cc_par_cnt++] = cur;
 
@@ -563,6 +567,22 @@ static void edit_params(u32 argc, char **argv, char **envp) {
     cc_params[cc_par_cnt++] = "none";
 
   }
+  
+  if (preprocessor_only || shared_linking) {
+    /* In the preprocessor_only case (-E), we are not actually compiling at
+       all but requesting the compiler to output preprocessed sources only.
+       We must not add the runtime in this case because the compiler will
+       simply output its binary content back on stdout, breaking any build
+       systems that rely on a separate source preprocessing step.
+       The shared_linking case (-shared) is more complex. This flag should
+       only be passed when linking a shared object. When loading such a shared
+       object into a binary that has also been built with AFL, two AFL runtimes
+       will exist side-by-side. This is only a problem in the dynamic loading
+       case because for static linking, the compiler can de-duplicate the
+       runtime. We must hence avoid attaching the runtime to shared objects. */
+    cc_params[cc_par_cnt] = NULL;
+    return;
+  }
 
 #ifndef __ANDROID__
   switch (bit_mode) {