oss-fuzz/projects/poppler/build.sh

295 lines
9.7 KiB
Bash
Executable File

#!/bin/bash -eu
# Copyright 2018 Google Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
################################################################################
PREFIX=$WORK/prefix
mkdir -p $PREFIX
export PKG_CONFIG="`which pkg-config` --static"
export PKG_CONFIG_PATH=$PREFIX/lib/pkgconfig
export PATH=$PREFIX/bin:$PATH
BUILD=$WORK/build
rm -rf $WORK/*
rm -rf $BUILD
mkdir -p $BUILD
# Install Boost headers
cd $SRC/
tar jxf boost_1_76_0.tar.bz2
cd boost_1_76_0/
CFLAGS="" CXXFLAGS="" ./bootstrap.sh
CFLAGS="" CXXFLAGS="" ./b2 headers
cp -R boost/ /usr/include/
pushd $SRC/zlib
CFLAGS=-fPIC ./configure --static --prefix=$PREFIX
make install -j$(nproc)
pushd $SRC
tar zxf nss-3.75-with-nspr-4.32.tar.gz
cd nss-3.75
nss_flag=""
SAVE_CFLAGS="$CFLAGS"
SAVE_CXXFLAGS="$CXXFLAGS"
if [ "$SANITIZER" = "memory" ]; then
nss_flag="--msan"
elif [ "$SANITIZER" = "address" ]; then
nss_flag="--asan"
elif [ "$SANITIZER" = "undefined" ]; then
nss_flag="--ubsan"
elif [ "$SANITIZER" = "coverage" ]; then
# some parts of nss don't like -fcoverage-mapping nor -fprofile-instr-generate :/
CFLAGS="${CFLAGS/"-fcoverage-mapping"/" "}"
CFLAGS="${CFLAGS/"-fprofile-instr-generate"/" "}"
CXXFLAGS="${CXXFLAGS/"-fcoverage-mapping"/" "}"
CXXFLAGS="${CXXFLAGS/"-fprofile-instr-generate"/" "}"
fi
./nss/build.sh $nss_flag --disable-tests --static -v -Dmozilla_client=1 -Dzlib_libs=$PREFIX/lib/libz.a -Dsign_libs=0
CFLAGS="$SAVE_CFLAGS"
CXXFLAGS="$SAVE_CXXFLAGS"
# NSS has a .pc.in file but doesn't do anything with it
cp nss/pkg/pkg-config/nss.pc.in $PREFIX/lib/pkgconfig/nss.pc
sed -i "s#\${libdir}#${SRC}/nss-3.75/dist/Debug/lib#g" $PREFIX/lib/pkgconfig/nss.pc
sed -i "s#\${includedir}#${SRC}/nss-3.75/dist/public/nss#g" $PREFIX/lib/pkgconfig/nss.pc
sed -i "s#%NSS_VERSION%#3.75#g" $PREFIX/lib/pkgconfig/nss.pc
cp dist/Debug/lib/pkgconfig/nspr.pc $PREFIX/lib/pkgconfig/
pushd $SRC/freetype
./autogen.sh
./configure --prefix="$PREFIX" --disable-shared PKG_CONFIG_PATH="$PKG_CONFIG_PATH"
make -j$(nproc)
make install
pushd $SRC/Little-CMS
./autogen.sh --prefix="$PREFIX" --disable-shared PKG_CONFIG_PATH="$PKG_CONFIG_PATH"
make -j$(nproc)
make install
mkdir -p $SRC/openjpeg/build
pushd $SRC/openjpeg/build
sed -i "s#\${LCMS_LIBNAME}#-L$PREFIX/lib \${LCMS_LIBNAME}#" ../src/bin/jp2/CMakeLists.txt
PKG_CONFIG=`which pkg-config` cmake .. -DBUILD_SHARED_LIBS=OFF -DCMAKE_INSTALL_PREFIX=$PREFIX
make -j$(nproc) install
if [ "$SANITIZER" != "memory" ]; then
pushd $SRC/fontconfig
meson \
--prefix=$PREFIX \
--libdir=lib \
--default-library=static \
_builddir
ninja -C _builddir
ninja -C _builddir install
popd
pushd $SRC/glib-2.70.0
# remove once there's a released glib that contains https://gitlab.gnome.org/GNOME/glib/-/merge_requests/2324
sed -i s#https://ftp.pcre.org/pub/pcre/pcre-8.37.tar.bz2#https://sourceforge.net/projects/pcre/files/pcre/8.37/pcre-8.37.tar.bz2# subprojects/libpcre.wrap
meson \
--prefix=$PREFIX \
--libdir=lib \
--default-library=static \
-Db_lundef=false \
-Doss_fuzz=enabled \
-Dlibmount=disabled \
_builddir
ninja -C _builddir
ninja -C _builddir install
popd
pushd $SRC/libpng
autoreconf -fi
CPPFLAGS=-I$PREFIX/include LDFLAGS=-L$PREFIX/lib ./configure --prefix="$PREFIX" --disable-shared --disable-dependency-tracking
make -j$(nproc)
make install
pushd $SRC/cairo
meson \
--prefix=$PREFIX \
--libdir=lib \
--default-library=static \
_builddir
ninja -C _builddir
ninja -C _builddir install
popd
pushd $SRC/pango
CFLAGS="$CFLAGS -fno-sanitize=vptr" CXXFLAGS="$CXXFLAGS -fno-sanitize=vptr" meson \
-Ddefault_library=static \
--prefix=$PREFIX \
--libdir=lib \
_builddir
sed -i -e 's/ -Werror=implicit-fallthrough//g' _builddir/build.ninja
ninja -C _builddir
ninja -C _builddir install
popd
fi
pushd $SRC/qtbase
# add the flags to Qt build too
sed -i -e "s/QMAKE_CXXFLAGS += -stdlib=libc++/QMAKE_CXXFLAGS += -stdlib=libc++ $CXXFLAGS\nQMAKE_CFLAGS += $CFLAGS/g" mkspecs/linux-clang-libc++/qmake.conf
sed -i -e "s/QMAKE_LFLAGS += -stdlib=libc++/QMAKE_LFLAGS += -stdlib=libc++ -lpthread $CXXFLAGS/g" mkspecs/linux-clang-libc++/qmake.conf
# disable sanitize=vptr for harfbuzz since it compiles without rtti
sed -i -e "s/TARGET = qtharfbuzz/TARGET = qtharfbuzz\nQMAKE_CXXFLAGS += -fno-sanitize=vptr/g" src/3rdparty/harfbuzz-ng/harfbuzz-ng.pro
# make qmake compile faster
sed -i -e "s/MAKE\")/MAKE\" -j$(nproc))/g" configure
# Fix memory stuff in qt 5.15 unfixable since branch is closed now
sed -i -e "s/struct statx statxBuffer/struct statx statxBuffer = {}/g" src/corelib/io/qfilesystemengine_unix.cpp
./configure --glib=no --libpng=qt -opensource -confirm-license -static -no-opengl -no-icu -no-pkg-config -platform linux-clang-libc++ -nomake tests -nomake examples -prefix $PREFIX -D QT_NO_DEPRECATED_WARNINGS
make -j$(nproc)
make install
popd
# Poppler complains when PKG_CONFIG is set to `which pkg-config --static` so
# temporarily removing it
export PKG_CONFIG="`which pkg-config`"
if [ "$SANITIZER" != "memory" ]; then
POPPLER_ENABLE_GLIB=ON
POPPLER_FONT_CONFIGURATION=fontconfig
else
POPPLER_ENABLE_GLIB=OFF
POPPLER_FONT_CONFIGURATION=generic
fi
mkdir -p $SRC/poppler/build
pushd $SRC/poppler/build
cmake .. \
-DCMAKE_BUILD_TYPE=debug \
-DBUILD_SHARED_LIBS=OFF \
-DENABLE_FUZZER=OFF \
-DFONT_CONFIGURATION=$POPPLER_FONT_CONFIGURATION \
-DENABLE_DCTDECODER=none \
-DENABLE_GOBJECT_INTROSPECTION=OFF \
-DENABLE_LIBPNG=OFF \
-DENABLE_ZLIB=OFF \
-DENABLE_LIBTIFF=OFF \
-DENABLE_LIBJPEG=OFF \
-DENABLE_GLIB=$POPPLER_ENABLE_GLIB \
-DENABLE_LIBCURL=OFF \
-DENABLE_QT5=ON \
-DENABLE_UTILS=OFF \
-DWITH_Cairo=$POPPLER_ENABLE_GLIB \
-DCMAKE_INSTALL_PREFIX=$PREFIX
export PKG_CONFIG="`which pkg-config` --static"
make -j$(nproc) poppler poppler-cpp poppler-qt5
if [ "$SANITIZER" != "memory" ]; then
make -j$(nproc) poppler-glib
fi
PREDEPS_LDFLAGS="-Wl,-Bdynamic -ldl -lm -lc -lz -pthread -lrt -lpthread"
DEPS="freetype2 lcms2 libopenjp2"
if [ "$SANITIZER" != "memory" ]; then
DEPS="$DEPS fontconfig libpng"
fi
BUILD_CFLAGS="$CFLAGS `pkg-config --static --cflags $DEPS`"
BUILD_LDFLAGS="-Wl,-static `pkg-config --static --libs $DEPS`"
# static linking is hard ^_^
NSS_STATIC_LIBS=`ls $SRC/nss-3.75/dist/Debug/lib/lib*.a`
NSS_STATIC_LIBS="$NSS_STATIC_LIBS $NSS_STATIC_LIBS $NSS_STATIC_LIBS"
BUILD_LDFLAGS="$BUILD_LDFLAGS $NSS_STATIC_LIBS"
fuzzers=$(find $SRC/poppler/cpp/tests/fuzzing/ -name "*_fuzzer.cc")
for f in $fuzzers; do
fuzzer_name=$(basename $f .cc)
$CXX $CXXFLAGS -std=c++11 -I$SRC/poppler/cpp -I$SRC/poppler/build/cpp \
$BUILD_CFLAGS \
$f -o $OUT/$fuzzer_name \
$PREDEPS_LDFLAGS \
$SRC/poppler/build/cpp/libpoppler-cpp.a \
$SRC/poppler/build/libpoppler.a \
$BUILD_LDFLAGS \
$LIB_FUZZING_ENGINE \
$LIB_FUZZING_ENGINE \
-Wl,-Bdynamic
done
if [ "$SANITIZER" != "memory" ]; then
DEPS="gmodule-2.0 glib-2.0 gio-2.0 gobject-2.0 freetype2 lcms2 libopenjp2 cairo cairo-gobject pango fontconfig libpng"
BUILD_CFLAGS="$CFLAGS `pkg-config --static --cflags $DEPS`"
BUILD_LDFLAGS="-Wl,-static `pkg-config --static --libs $DEPS`"
BUILD_LDFLAGS="$BUILD_LDFLAGS $NSS_STATIC_LIBS"
fuzzers=$(find $SRC/poppler/glib/tests/fuzzing/ -name "*_fuzzer.cc")
for f in $fuzzers; do
fuzzer_name=$(basename $f .cc)
$CXX $CXXFLAGS -std=c++11 -I$SRC/poppler/glib -I$SRC/poppler/build/glib \
$BUILD_CFLAGS \
$f -o $OUT/$fuzzer_name \
$PREDEPS_LDFLAGS \
$SRC/poppler/build/glib/libpoppler-glib.a \
$SRC/poppler/build/cpp/libpoppler-cpp.a \
$SRC/poppler/build/libpoppler.a \
$BUILD_LDFLAGS \
$LIB_FUZZING_ENGINE \
-Wl,-Bdynamic
done
fi
PREDEPS_LDFLAGS="-Wl,-Bdynamic -ldl -lm -lc -lz -pthread -lrt -lpthread"
DEPS="freetype2 lcms2 libopenjp2 Qt5Core Qt5Gui Qt5Xml"
if [ "$SANITIZER" != "memory" ]; then
DEPS="$DEPS fontconfig libpng"
fi
BUILD_CFLAGS="$CFLAGS `pkg-config --static --cflags $DEPS`"
BUILD_LDFLAGS="-Wl,-static `pkg-config --static --libs $DEPS`"
BUILD_LDFLAGS="$BUILD_LDFLAGS $NSS_STATIC_LIBS"
fuzzers=$(find $SRC/poppler/qt5/tests/fuzzing/ -name "*_fuzzer.cc")
for f in $fuzzers; do
fuzzer_name=$(basename $f .cc)
$CXX $CXXFLAGS -std=c++11 -fPIC \
-I$SRC/poppler/qt5/src -I$SRC/poppler/build/qt5/src \
$BUILD_CFLAGS \
$f -o $OUT/$fuzzer_name \
$PREDEPS_LDFLAGS \
$SRC/poppler/build/qt5/src/libpoppler-qt5.a \
$SRC/poppler/build/cpp/libpoppler-cpp.a \
$SRC/poppler/build/libpoppler.a \
$BUILD_LDFLAGS \
$LIB_FUZZING_ENGINE \
-Wl,-Bdynamic
done
mv $SRC/{*.zip,*.dict} $OUT
if [ ! -f "${OUT}/poppler_seed_corpus.zip" ]; then
echo "missing seed corpus"
exit 1
fi
if [ ! -f "${OUT}/poppler.dict" ]; then
echo "missing dictionary"
exit 1
fi
fuzzers=$(find $OUT -name "*_fuzzer")
for f in $fuzzers; do
fuzzer_name=$(basename $f)
ln -sf $OUT/poppler_seed_corpus.zip $OUT/${fuzzer_name}_seed_corpus.zip
ln -sf $OUT/poppler.dict $OUT/${fuzzer_name}.dict
done