From 19631851f6c7ecac42fb76ff70314f4e0777d3f3 Mon Sep 17 00:00:00 2001 From: Andrea Fioraldi Date: Wed, 5 Aug 2020 12:53:46 +0200 Subject: dynamic symbols export for dlopen --- llvm_mode/afl-clang-fast.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) (limited to 'llvm_mode/afl-clang-fast.c') diff --git a/llvm_mode/afl-clang-fast.c b/llvm_mode/afl-clang-fast.c index 16f2c9c0..10717124 100644 --- a/llvm_mode/afl-clang-fast.c +++ b/llvm_mode/afl-clang-fast.c @@ -162,7 +162,7 @@ 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, - preprocessor_only = 0; + shared_linking = 0, preprocessor_only = 0; u8 have_pic = 0; u8 *name; @@ -402,6 +402,7 @@ static void edit_params(u32 argc, char **argv, char **envp) { 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; @@ -567,12 +568,18 @@ static void edit_params(u32 argc, char **argv, char **envp) { } - if (preprocessor_only) { + 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. */ + 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; } @@ -619,6 +626,10 @@ static void edit_params(u32 argc, char **argv, char **envp) { } + if (!shared_linking) + cc_params[cc_par_cnt++] = alloc_printf("-Wl,--dynamic-list=%s/dynamic_list.txt", obj_path); + + #endif cc_params[cc_par_cnt] = NULL; -- cgit 1.4.1