Add an env to afl-clang-fast to disable setting rpath if LLVM path isn't

recognized
This commit is contained in:
Jesse Schwartzentruber
2023-10-19 17:14:31 -04:00
parent eaa6a1754a
commit cf458a7d25
3 changed files with 23 additions and 11 deletions

View File

@ -135,6 +135,12 @@ subset of the settings discussed in section 1, with the exception of:
- `TMPDIR` and `AFL_KEEP_ASSEMBLY`, since no temporary assembly files are - `TMPDIR` and `AFL_KEEP_ASSEMBLY`, since no temporary assembly files are
created. created.
- LLVM modes compiling C++ will normally set rpath in the binary if LLVM is
not in a usual location (/usr or /lib). Setting `AFL_LLVM_NO_RPATH=1`
disables this behaviour in case it isn't desired. For example, the compiling
toolchain might be in a custom location, but the target machine has LLVM
runtime libs in the search path.
Then there are a few specific features that are only available in Then there are a few specific features that are only available in
instrumentation mode: instrumentation mode:

View File

@ -162,6 +162,7 @@ static char *afl_environment_variables[] = {
"AFL_LLVM_MAP_DYNAMIC", "AFL_LLVM_MAP_DYNAMIC",
"AFL_LLVM_NGRAM_SIZE", "AFL_LLVM_NGRAM_SIZE",
"AFL_NGRAM_SIZE", "AFL_NGRAM_SIZE",
"AFL_LLVM_NO_RPATH",
"AFL_LLVM_NOT_ZERO", "AFL_LLVM_NOT_ZERO",
"AFL_LLVM_INSTRUMENT_FILE", "AFL_LLVM_INSTRUMENT_FILE",
"AFL_LLVM_THREADSAFE_INST", "AFL_LLVM_THREADSAFE_INST",

View File

@ -1144,19 +1144,22 @@ static void edit_params(u32 argc, char **argv, char **envp) {
if (!have_pic) { cc_params[cc_par_cnt++] = "-fPIC"; } if (!have_pic) { cc_params[cc_par_cnt++] = "-fPIC"; }
// in case LLVM is installed not via a package manager or "make install" if (!getenv("AFL_LLVM_NO_RPATH")) {
// e.g. compiled download or compiled from github then its ./lib directory // in case LLVM is installed not via a package manager or "make install"
// might not be in the search path. Add it if so. // e.g. compiled download or compiled from github then its ./lib directory
u8 *libdir = strdup(LLVM_LIBDIR); // might not be in the search path. Add it if so.
if (plusplus_mode && strlen(libdir) && strncmp(libdir, "/usr", 4) && u8 *libdir = strdup(LLVM_LIBDIR);
strncmp(libdir, "/lib", 4)) { if (plusplus_mode && strlen(libdir) && strncmp(libdir, "/usr", 4) &&
strncmp(libdir, "/lib", 4)) {
cc_params[cc_par_cnt++] = "-Wl,-rpath"; cc_params[cc_par_cnt++] = "-Wl,-rpath";
cc_params[cc_par_cnt++] = libdir; cc_params[cc_par_cnt++] = libdir;
} else { } else {
free(libdir); free(libdir);
}
} }
@ -2289,7 +2292,9 @@ int main(int argc, char **argv, char **envp) {
" AFL_LLVM_CTX: use full context sensitive coverage (for " " AFL_LLVM_CTX: use full context sensitive coverage (for "
"CLASSIC)\n" "CLASSIC)\n"
" AFL_LLVM_NGRAM_SIZE: use ngram prev_loc count coverage (for " " AFL_LLVM_NGRAM_SIZE: use ngram prev_loc count coverage (for "
"CLASSIC)\n"); "CLASSIC)\n"
" AFL_LLVM_NO_RPATH: disable rpath setting for custom LLVM "
"locations\n");
#ifdef AFL_CLANG_FLTO #ifdef AFL_CLANG_FLTO
if (have_lto) if (have_lto)