#!/bin/bash -eux # build-oss-fuzz.sh # # Build script which is executed by oss-fuzz build.sh # # $SRC: location of code checkouts # $OUT: location to put fuzzing targets and corpus # $WORK: writable directory where all compilation should be executed # # /!\ Do not override any CC, CXX, CFLAGS, ... variables # rm -rf $WORK/* rm -rf $OUT/lib $OUT/*_seed_corpus.zip # Prefix where we will temporarily install everything PREFIX=$WORK/prefix mkdir -p $PREFIX # always try getting the arguments for static compilation/linking # Fixes GModule not being picked when gstreamer-1.0.pc is looked up by meson # more or less https://github.com/mesonbuild/meson/pull/6629 export PKG_CONFIG="`which pkg-config` --static" export PKG_CONFIG_PATH=$PREFIX/lib/pkgconfig export PATH=$PREFIX/bin:$PATH # Minimize gst-debug level/code export CFLAGS="$CFLAGS -DGST_LEVEL_MAX=2" echo "CFLAGS : " $CFLAGS echo "CXXFLAGS : " $CXXFLAGS # Switch to work directory cd $WORK mkdir -p $OUT/lib/gstreamer-1.0 # build ogg pushd $SRC/ogg ./autogen.sh ./configure --prefix="$PREFIX" --libdir="$PREFIX/lib" make clean make -j$(nproc) make install popd # build vorbis pushd $SRC/vorbis ./autogen.sh ./configure --prefix="$PREFIX" --libdir="$PREFIX/lib" make clean make -j$(nproc) make install popd # build theora pushd $SRC/theora ./autogen.sh ./configure --prefix="$PREFIX" --libdir="$PREFIX/lib" make clean make -j$(nproc) make install popd # Note: We don't use/build orc since it still seems to be problematic # with clang and the various sanitizers. # For now we only build core and base. Add other modules when/if needed meson \ --prefix=$PREFIX \ --libdir=lib \ --default-library=shared \ --force-fallback-for=zlib \ -Db_lundef=false \ -Doss_fuzz=enabled \ -Dglib:oss_fuzz=enabled \ -Dglib:libmount=disabled \ -Dglib:tests=false \ -Ddoc=disabled \ -Dexamples=disabled \ -Dintrospection=disabled \ -Dgood=disabled \ -Dugly=disabled \ -Dbad=disabled \ -Dlibav=disabled \ -Dges=disabled \ -Dvaapi=disabled \ -Dsharp=disabled \ -Drs=disabled \ -Dpython=disabled \ -Dlibnice=disabled \ -Ddevtools=disabled \ -Drtsp_server=disabled \ -Dgst-examples=disabled \ -Dqt5=disabled \ -Dorc=disabled \ -Dgtk_doc=disabled \ -Dgstreamer:tracer_hooks=false \ -Dgst-plugins-base:opus=disabled \ -Dgst-plugins-base:pango=disabled \ _builddir \ $SRC/gstreamer ninja -C _builddir ninja -C _builddir install # copy out the fuzzing binaries for BINARY in $(find _builddir/ci/fuzzing -type f -executable -print) do BASENAME=${BINARY##*/} rm -rf "$OUT/$BASENAME*" cp $BINARY $OUT/$BASENAME patchelf --set-rpath '$ORIGIN/lib' $OUT/$BASENAME done # copy any relevant corpus for CORPUS in $(find "$SRC/gstreamer/ci/fuzzing" -type f -name "*.corpus"); do BASENAME=${CORPUS##*/} pushd "$SRC/gstreamer" zip $OUT/${BASENAME%%.*}_seed_corpus.zip . -ws -r -i@$CORPUS popd done # copy dependant libraries find "$PREFIX/lib" -maxdepth 1 -type f -name "*.so*" -exec cp -d "{}" $OUT/lib \; -print # add rpath that point to the correct place to all shared libraries find "$OUT/lib" -maxdepth 1 -type f -name "*.so*" -exec patchelf --debug --set-rpath '$ORIGIN' {} \; find "$PREFIX/lib" -maxdepth 1 -type l -name "*.so*" -exec cp -d "{}" $OUT/lib \; -print find "$PREFIX/lib/gstreamer-1.0" -maxdepth 1 -type f -name "*.so" -exec cp -d "{}" $OUT/lib/gstreamer-1.0 \; find "$OUT/lib/gstreamer-1.0" -type f -name "*.so*" -exec patchelf --debug --set-rpath '$ORIGIN/..' {} \; # make it easier to spot dependency issues find "$OUT/lib/gstreamer-1.0" -maxdepth 1 -type f -name "*.so" -print -exec ldd {} \;