Generate scno.h without invoking a generated executable helper

Generate scno.h using only those tools that are available for cross
build.  This allows to use scno.h during the build of strace itself.

* scno.am: New file.
* scno.head: New file.
* Makefile.am (EXTRA_DIST): Add it.
* tests/generate_scno.c: Remove.
* tests/.gitignore: Remove generate_scno.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(CLEANFILES): Remove scno.h.
(scno.h, $(scno_dependants)): Remove rules.
(scno_dependants): Remove.
($(objects)): New rule.
Include ../scno.am.
This commit is contained in:
Дмитрий Левин 2017-01-01 20:59:11 +00:00
parent 9eeb033ea6
commit cae1252903
6 changed files with 55 additions and 102 deletions

View File

@ -746,6 +746,7 @@ EXTRA_DIST = \
mpers.sh \
mpers_test.sh \
mpers_xlat.h \
scno.head \
signalent.sh \
strace-graph \
strace-log-merge \

44
scno.am Normal file
View File

@ -0,0 +1,44 @@
# scno.h make rules for strace.
#
# Copyright (c) 2017 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.
SCNO_CPPFLAGS = $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
$(ARCH_MFLAGS) $(AM_CPPFLAGS) $(CPPFLAGS)
syscallent.i: $(top_srcdir)/$(OS)/$(ARCH)/syscallent.h
$(CPP) -P $(SCNO_CPPFLAGS) $^ -o $@
digits = [[:digit:]][[:digit:]]*
al_nums = [[:alnum:]_][[:alnum:]_]*
SCNO_SED = /TRACE_INDIRECT_SUBCALL/d; s/^\[[[:space:]]*\($(digits)\)\][[:space:]]*=[[:space:]]*{[^,]*,[^,]*,[^,]*,[[:space:]]*"\($(al_nums)\)"[[:space:]]*},.*/\#ifndef __NR_\2\n\# define __NR_\2 (SYSCALL_BIT | \1)\n\#endif/p
scno.h: $(top_srcdir)/scno.head syscallent.i
echo '/* Generated by Makefile from $^; do not edit. */' > $@-t
cat $< >> $@-t
LC_ALL=C sed -n '$(SCNO_SED)' $(filter-out $<,$^) >> $@-t
mv $@-t $@
CLEANFILES += syscallent.i scno.h

6
scno.head Normal file
View File

@ -0,0 +1,6 @@
#if defined __X32_SYSCALL_BIT && defined __NR_read \
&& (__X32_SYSCALL_BIT & __NR_read) == __X32_SYSCALL_BIT
# define SYSCALL_BIT __X32_SYSCALL_BIT
#else
# define SYSCALL_BIT 0
#endif

1
tests/.gitignore vendored
View File

@ -80,7 +80,6 @@ ftruncate
ftruncate64
futex
futimesat
generate_scno
get_mempolicy
getcpu
getcwd

View File

@ -142,7 +142,6 @@ check_PROGRAMS = \
ftruncate64 \
futex \
futimesat \
generate_scno \
get_mempolicy \
getcpu \
getcwd \
@ -929,11 +928,9 @@ ksysent.h: $(srcdir)/ksysent.sed
ksysent.$(OBJEXT): ksysent.h
scno.h: generate_scno
./$< > $@-t && mv $@-t $@
objects = $(filter %.$(OBJEXT),$(SOURCES:.c=.$(OBJEXT)))
scno_dependants = $(filter-out generate_scno.$(OBJEXT),$(objects))
$(scno_dependants): scno.h
$(objects): scno.h
CLEANFILES = ksysent.h scno.h $(TESTS:=.tmp)
CLEANFILES = ksysent.h $(TESTS:=.tmp)
include ../scno.am

View File

@ -1,94 +0,0 @@
/*
* Generate scno.h file.
*
* Copyright (c) 2015-2016 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.
*/
#include "tests.h"
#include "sysent.h"
#include <stdio.h>
#include <string.h>
#include <asm/unistd.h>
#define TD 0
#define TF 0
#define TI 0
#define TN 0
#define TP 0
#define TS 0
#define TM 0
#define NF 0
#define MA 0
#define SI 0
#define SE 0
#define CST 0
#define SEN(arg) 0,0
static const struct_sysent syscallent[] = {
#include "syscallent.h"
};
#undef syscall_bit
#if defined __x86_64__ && defined __ILP32__ && defined __X32_SYSCALL_BIT
# define syscall_bit __X32_SYSCALL_BIT
#endif
#ifndef syscall_bit
# define syscall_bit 0
#endif
static char al_num[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_0123456789";
int
main(void)
{
unsigned int i;
for (i = 0; i < ARRAY_SIZE(syscallent); ++i) {
const char *name = syscallent[i].sys_name;
if (!name || strspn(name, al_num) < strlen(name)
#ifdef SYS_socket_nsubcalls
|| (i >= SYS_socket_subcall &&
i < SYS_socket_subcall + SYS_socket_nsubcalls)
#endif
#ifdef SYS_ipc_nsubcalls
|| (i >= SYS_ipc_subcall &&
i < SYS_ipc_subcall + SYS_ipc_nsubcalls)
#endif
#ifdef ARM_FIRST_SHUFFLED_SYSCALL
|| (i >= ARM_FIRST_SHUFFLED_SYSCALL &&
i <= ARM_FIRST_SHUFFLED_SYSCALL +
ARM_LAST_SPECIAL_SYSCALL + 1)
#endif
)
continue;
printf("#ifndef __NR_%s\n# define __NR_%s %u\n#endif\n",
name, name, syscall_bit + i);
}
return 0;
}