blob: e2ba1e1ca1ac2aae3eef1e703184bc18e8ae0a1b [file] [log] [blame]
# Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
LIBDIR = lib
PRELOADPATH = \"/$(LIBDIR)/libminijailpreload.so\"
CFLAGS += -fPIC -Wall -Wextra -Werror -DPRELOADPATH="$(PRELOADPATH)"
CFLAGS += -fvisibility=internal
all : minijail0 libminijail.so libminijailpreload.so
tests : libminijail_unittest.wrapper syscall_filter_unittest
minijail0 : libsyscalls.gen.o libminijail.o syscall_filter.o bpf.o minijail0.c
$(CC) $(CFLAGS) -o $@ $^ -lcap
libminijail.so : libminijail.o syscall_filter.o bpf.o libsyscalls.gen.o
$(CC) $(CFLAGS) -shared -o $@ $^ -lcap
# Allow unittests to access what are normally internal symbols.
libminijail_unittest.wrapper :
$(MAKE) $(MAKEARGS) test-clean
$(MAKE) $(MAKEARGS) libminijail_unittest
$(MAKE) $(MAKEARGS) test-clean
libminijail_unittest : CFLAGS := $(filter-out -fvisibility=%,$(CFLAGS))
libminijail_unittest : libminijail_unittest.o libminijail.o \
syscall_filter.o bpf.o libsyscalls.gen.o
$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(filter-out $(CFLAGS_FILE),$^) -lcap
libminijailpreload.so : libminijailpreload.c libminijail.o libsyscalls.gen.o \
syscall_filter.o bpf.o
$(CC) $(CFLAGS) -shared -o $@ $^ -ldl -lcap
libminijail.o : libminijail.c libminijail.h
libminijail_unittest.o : libminijail_unittest.c test_harness.h
$(CC) $(CFLAGS) -c -o $@ $<
libsyscalls.gen.o : libsyscalls.gen.c libsyscalls.h
syscall_filter_unittest : syscall_filter_unittest.o syscall_filter.o bpf.o \
libsyscalls.gen.o test_harness.h
$(CC) $(CFLAGS) -o $@ $^
syscall_filter_unittest.o : syscall_filter_unittest.c test_harness.h
$(CC) $(CFLAGS) -c -o $@ $<
syscall_filter.o : syscall_filter.c syscall_filter.h
bpf.o : bpf.c bpf.h
# sed expression which extracts system calls that are
# defined via asm/unistd.h. It converts them from:
# #define __NR_read
# to:
# #ifdef __NR_read
# { "read", __NR_read },
# #endif
# All other lines will not be emitted. The sed expression lives in its
# own macro to allow clean line wrapping.
define sed-multiline
's/#define \(__NR_\)\([a-z0-9_]*\)$$/#ifdef \1\2\n\
{ "\2", \1\2 },\n#endif/g p;'
endef
# Generates a header file with a system call table made up of "name",
# syscall_nr entries by including the build target <asm/unistd.h> and
# emitting the list of defines. Use of the compiler is needed to
# dereference the actual provider of syscall definitions.
# E.g., asm/unistd_32.h or asm/unistd_64.h, etc.
define gen_syscalls
(set -e; \
echo '/* GENERATED BY MAKEFILE */'; \
echo '#include <stddef.h>'; \
echo '#include <asm/unistd.h>'; \
echo '#include "libsyscalls.h"'; \
echo "const struct syscall_entry syscall_table[] = {"; \
echo "#include <asm/unistd.h>" | \
$(CC) $(CFLAGS) -dN - -E | sed -ne $(sed-multiline); \
echo " { NULL, -1 },"; \
echo "};" ) > $1
endef
# Only regenerate libsyscalls.gen.c if the Makefile or header changes.
# NOTE! This will not detect if the file is not appropriate for the target.
libsyscalls.gen.c : Makefile libsyscalls.h
@printf "Generating target-arch specific $@ . . . "
@$(call gen_syscalls,$@)
@printf "done.\n"
# Only clean up files affected by the CFLAGS change for testing.
test-clean :
@rm -f libminijail.o libminijail_unittest.o libsyscalls.gen.o
clean : test-clean
@rm -f libminijail.o libminijailpreload.so minijail0
@rm -f libminijail.so
@rm -f libminijail_unittest
@rm -f libsyscalls.gen.c
@rm -f syscall_filter.o bpf.o
@rm -f syscall_filter_unittest syscall_filter_unittest.o