1#!/bin/bash 2# Copyright 2021 Google LLC 3# 4# Licensed under the Apache License, Version 2.0 (the "License"); 5# you may not use this file except in compliance with the License. 6# You may obtain a copy of the License at 7# 8# http://www.apache.org/licenses/LICENSE-2.0 9# 10# Unless required by applicable law or agreed to in writing, software 11# distributed under the License is distributed on an "AS IS" BASIS, 12# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13# See the License for the specific language governing permissions and 14# limitations under the License. 15# 16################################################################################ 17 18( 19cd $SRC/ 20GITHUB_RELEASE="https://github.com/google/lldb-eval/releases/download/oss-fuzz-ubuntu-20.04" 21 22if [ "$SANITIZER" = "address" ] 23then 24 LLVM_ARCHIVE="llvm-12.0.1-x86_64-linux-release-address.tar.gz" 25elif [ "$SANITIZER" = "memory" ] 26then 27 LLVM_ARCHIVE="llvm-12.0.1-x86_64-linux-release-memory.tar.gz" 28elif [ "$SANITIZER" = "undefined" ] 29then 30 LLVM_ARCHIVE="llvm-12.0.1-x86_64-linux-release.tar.gz" 31elif [ "$SANITIZER" = "coverage" ] 32then 33 # For coverage we also need the original source code. 34 wget --quiet $GITHUB_RELEASE/llvm-12.0.1-source.tar.gz 35 tar -xzf llvm-12.0.1-source.tar.gz 36 wget --quiet $GITHUB_RELEASE/llvm-12.0.1-x86_64-linux-release-genfiles.tar.gz 37 tar -xzf llvm-12.0.1-x86_64-linux-release-genfiles.tar.gz 38 39 LLVM_ARCHIVE="llvm-12.0.1-x86_64-linux-release.tar.gz" 40else 41 echo "Unknown sanitizer: $SANITIZER" 42 exit 1 43fi 44 45wget --quiet $GITHUB_RELEASE/$LLVM_ARCHIVE 46mkdir -p llvm && tar -xzf $LLVM_ARCHIVE --strip-components 1 -C llvm 47) 48export LLVM_INSTALL_PATH=$SRC/llvm 49 50if [ "$SANITIZER" = "undefined" ] 51then 52 # Disable vptr because it's not allowed with '-fno-rtti' 53 CFLAGS="$CFLAGS -fno-sanitize=function,vptr" 54 CXXFLAGS="$CXXFLAGS -fno-sanitize=function,vptr" 55fi 56 57# Undefine NDEBUG to enable asserts. 58export BAZEL_EXTRA_BUILD_FLAGS="--copt=-UNDEBUG" 59 60# Run the build! 61bazel_build_fuzz_tests 62 63# OSS-Fuzz rule doesn't build data dependencies 64bazel build //testdata:fuzzer_binary_gen 65 66# OSS-Fuzz rule doesn't handle dynamic dependencies 67# Copy liblldb.so 68mkdir -p $OUT/lib 69cp $SRC/llvm/lib/liblldb.so* $OUT/lib 70 71# List of targets to fuzz. 72TARGETS=( 73 lldb_eval_libfuzzer_test 74 lldb_vs_lldb_eval_libfuzzer_test 75) 76 77# Preparation of each target. 78for target in ${TARGETS[@]}; do 79 # OSS-Fuzz rule doesn't package runfiles yet: 80 # https://github.com/bazelbuild/rules_fuzzing/issues/100 81 mkdir -p $OUT/$target.runfiles 82 # fuzzer_binary 83 mkdir -p $OUT/$target.runfiles/lldb_eval/testdata 84 cp $SRC/lldb-eval/bazel-bin/testdata/fuzzer_binary $OUT/$target.runfiles/lldb_eval/testdata/ 85 cp $SRC/lldb-eval/testdata/fuzzer_binary.cc $OUT/$target.runfiles/lldb_eval/testdata/ 86 # lldb-server 87 mkdir -p $OUT/$target.runfiles/llvm_project/bin 88 cp $SRC/llvm/bin/lldb-server $OUT/$target.runfiles/llvm_project/bin/lldb-server 89 # Patch RPATH of the fuzz target 90 patchelf --set-rpath '$ORIGIN/lib' $OUT/$target 91done 92 93cp $SRC/lldb_vs_lldb_eval_libfuzzer_test.options $OUT/ 94