diff options
author | Andrea Fioraldi <andreafioraldi@gmail.com> | 2020-08-05 10:01:58 +0200 |
---|---|---|
committer | Andrea Fioraldi <andreafioraldi@gmail.com> | 2020-08-05 10:01:58 +0200 |
commit | 8fc727e597f26161fde7f38af8b805a39497da52 (patch) | |
tree | 90aacdd52b77934471a5a37ddf0082c2021092d1 /llvm_mode | |
parent | 585ec0450331ec7fd8b9a79737cba6b6937422bf (diff) | |
download | afl++-8fc727e597f26161fde7f38af8b805a39497da52.tar.gz |
port patch from https://github.com/google/AFL/pull/112
Diffstat (limited to 'llvm_mode')
-rw-r--r-- | llvm_mode/afl-clang-fast.c | 22 |
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) { |