xmalloc.c \
xmalloc.h \
xstring.h \
+ $(strace_SOURCES_check) \
# end of strace_SOURCES
+strace_SOURCES_check = bpf_attr_check.c
+
if USE_LIBUNWIND
strace_SOURCES += unwind.c
strace_CPPFLAGS += $(libunwind_CPPFLAGS)
debian/strace64.install \
debian/strace64.manpages \
debian/watch \
+ gen_bpf_attr_check.sh \
generate_sen.sh \
ioctl_iocdef.c \
ioctlsort.c \
$(srcdir)/.version:
$(AM_V_GEN)echo $(VERSION) > $@-t && mv $@-t $@
+bpf_attr_check.c: $(srcdir)/bpf_attr.h $(srcdir)/gen_bpf_attr_check.sh
+ $(srcdir)/gen_bpf_attr_check.sh $< > $@-t && mv $@-t $@
+
strace_SOURCES_c = \
$(filter %.c,$(strace_SOURCES)) $(filter %.c,$(libstrace_a_SOURCES))
-sys_func.h: $(patsubst %,$(srcdir)/%,$(strace_SOURCES_c))
+sys_func_h_sources = $(filter-out $(strace_SOURCES_check),$(strace_SOURCES_c))
+
+sys_func.h: $(patsubst %,$(srcdir)/%,$(sys_func_h_sources))
for f in $^; do \
sed -n 's/^SYS_FUNC(.*/extern &;/p' $$f; \
done | sort -u > $@
cat $^ > $@
BUILT_SOURCES = $(ioctl_redefs_h) $(ioctlent_h) \
- native_printer_decls.h native_printer_defs.h printers.h sen.h sys_func.h .version
+ bpf_attr_check.c native_printer_decls.h native_printer_defs.h \
+ printers.h sen.h sys_func.h .version
CLEANFILES = $(ioctl_redefs_h) $(ioctlent_h) $(mpers_preproc_files) \
ioctl_iocdef.h ioctl_iocdef.i \
- native_printer_decls.h native_printer_defs.h printers.h sen.h sys_func.h
+ bpf_attr_check.c native_printer_decls.h native_printer_defs.h \
+ printers.h sen.h sys_func.h
DISTCLEANFILES = gnu/stubs-32.h gnu/stubs-x32.h
include scno.am
--- /dev/null
+#!/bin/sh -efu
+# Copyright (c) 2018 Dmitry V. Levin <ldv@altlinux.org>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+# 3. The name of the author may not be used to endorse or promote products
+# derived from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+input="$1"
+shift
+
+cat <<EOF
+/* Generated by $0 from $input; do not edit. */
+#include "defs.h"
+#ifdef HAVE_LINUX_BPF_H
+# include <linux/bpf.h>
+# include "bpf_attr.h"
+# include "static_assert.h"
+
+# define SoM(type_, member_) (sizeof(((type_ *)0)->member_))
+EOF
+
+for struct in $(sed -n 's/^struct \(BPF_[^[:space:]]\+_struct\) .*/\1/p' < "$input"); do
+ enum="$(sed -n 's/^struct '"$struct"' \/\* \([^[:space:]]\+\) \*\/ {.*/\1/p' < "$input")"
+ ENUM="$(printf %s "$enum" |tr '[:lower:]' '[:upper:]')"
+ enum="$enum${enum:+.}"
+ ENUM="$ENUM${ENUM:+_}"
+ sed -n '/^struct '"$struct"' [^{]*{/,/^};$/p' < "$input" |
+ sed -n 's/^[[:space:]]\+[^;]*[[:space:]]\([^[:space:];]\+\);$/\1/p' |
+ while read field; do
+ FIELD="$(printf %s "$field" |tr '[:lower:]' '[:upper:]')"
+ cat <<EOF
+
+# ifdef HAVE_UNION_BPF_ATTR_$ENUM$FIELD
+ static_assert(SoM(struct $struct, $field) == SoM(union bpf_attr, $enum$field),
+ "$struct.$field size mismatch");
+ static_assert(offsetof(struct $struct, $field) == offsetof(union bpf_attr, $enum$field),
+ "$struct.$field offset mismatch");
+# endif /* HAVE_UNION_BPF_ATTR_$ENUM$FIELD */
+EOF
+ done
+done
+
+cat <<'EOF'
+
+#endif /* HAVE_LINUX_BPF_H */
+EOF