port patch from
@@ -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;
@@ -400,6 +401,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;
}
@@ -564,6 +568,22 @@ static void edit_params(u32 argc, char **argv, char **envp) {
}
+ 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) {
