diff options
Diffstat (limited to 'fuzz/build.mk')
-rw-r--r-- | fuzz/build.mk | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/fuzz/build.mk b/fuzz/build.mk new file mode 100644 index 00000000..5d7ab903 --- /dev/null +++ b/fuzz/build.mk @@ -0,0 +1,82 @@ +# This directory contains support for Google's oss-fuzz project. See +# https://github.com/google/oss-fuzz/tree/master/projects/qpdf + +FUZZERS = \ + qpdf_read_memory_fuzzer + +DEFAULT_FUZZ_RUNNER := standalone_fuzz_target_runner +OBJ_DEFAULT_FUZZ := fuzz/$(OUTPUT_DIR)/$(DEFAULT_FUZZ_RUNNER).$(OBJ) + +BINS_fuzz = $(foreach B,$(FUZZERS),fuzz/$(OUTPUT_DIR)/$(call binname,$(B))) +TARGETS_fuzz = $(OBJ_DEFAULT_FUZZ) $(BINS_fuzz) + +INCLUDES_fuzz = include + +# LIB_FUZZING_ENGINE is overridden by oss-fuzz +LIB_FUZZING_ENGINE ?= $(OBJ_DEFAULT_FUZZ) + +# Depend on OBJ_DEFAULT_FUZZ to ensure that it is always compiled. +# Don't depend on LIB_FUZZING_ENGINE, which we can't build. When used +# by oss-fuzz, it will be there. +$(BINS_fuzz): $(TARGETS_libqpdf) $(OBJ_DEFAULT_FUZZ) + +# ----- + +$(foreach B,$(FUZZERS),$(eval \ + OBJS_$(B) = $(call src_to_obj,fuzz/$(B).cc))) + +ifeq ($(GENDEPS),1) +-include $(foreach B,$(FUZZERS),$(call obj_to_dep,$(OBJS_$(B)))) +endif + +$(foreach B,$(DEFAULT_FUZZ_RUNNER),$(eval \ + fuzz/$(OUTPUT_DIR)/%.$(OBJ): fuzz/$(B).cc ; \ + $(call compile,fuzz/$(B).cc,$(INCLUDES_fuzz)))) + +$(foreach B,$(FUZZERS),$(eval \ + $(OBJS_$(B)): fuzz/$(OUTPUT_DIR)/%.$(OBJ): fuzz/$(B).cc ; \ + $(call compile,fuzz/$(B).cc,$(INCLUDES_fuzz)))) + +ifeq ($(suffix $(LIB_FUZZING_ENGINE)),.$(OBJ)) + FUZZ_as_obj := $(LIB_FUZZING_ENGINE) + FUZZ_as_lib := +else + FUZZ_as_obj := + FUZZ_as_lib := $(LIB_FUZZING_ENGINE) +endif + +$(foreach B,$(FUZZERS),$(eval \ + fuzz/$(OUTPUT_DIR)/$(call binname,$(B)): $(OBJS_$(B)) ; \ + $(call makebin,$(OBJS_$(B)) $(FUZZ_as_obj),$$@,$(LDFLAGS_libqpdf) $(LDFLAGS),$(FUZZ_as_lib) $(LIBS_libqpdf) $(LIBS)))) + +ifeq ($(OSS_FUZZ),1) + +# Build fuzzers linked with static libraries and installed into a +# location provided by oss-fuzz. This is specifically to support the +# oss-fuzz project. These rules won't on systems that don't allow main +# to be in a library or don't name their libraries libsomething.a. + +STATIC_BINS_fuzz := $(foreach B,$(FUZZERS),fuzz/$(OUTPUT_DIR)/static/$(call binname,$(B))) +$(STATIC_BINS_fuzz): $(TARGETS_libqpdf) $(OBJ_DEFAULT_FUZZ) + +# OUT is provided in the oss-fuzz environment +OUT ?= $(CURDIR)/fuzz/$(OUTPUT_DIR)/fuzz-install + +# These are not fully static, but they statically link with qpdf and +# our external dependencies other than system libraries. +$(foreach B,$(FUZZERS),$(eval \ + fuzz/$(OUTPUT_DIR)/static/$(call binname,$(B)): $(OBJS_$(B)) ; \ + $(call makebin,$(OBJS_$(B)),$$@,$(LDFLAGS_libqpdf) $(LDFLAGS),$(LIB_FUZZING_ENGINE) $(patsubst -l%,-l:lib%.a,$(LIBS_libqpdf) $(LIBS))))) + +# The install_fuzz target is used by build.sh in oss-fuzz's qpdf project. +install_fuzz: $(STATIC_BINS_fuzz) + mkdir -p $(OUT) + cp fuzz/pdf.dict $(STATIC_BINS_fuzz) $(OUT)/ + for B in $(FUZZERS); do \ + cp fuzz/options $(OUT)/$${B}.options; \ + if test -d fuzz/$${B}_seed_corpus; then \ + (cd fuzz/$${B}_seed_corpus; zip -q -r $(OUT)/$${B}_seed_corpus.zip .); \ + fi; \ + done + +endif # OSS_FUZZ |