[PATCH] Re: cross-compiling strace on non-Linux build
Dmitry V. Levin
ldv at altlinux.org
Fri Jan 13 01:58:52 UTC 2017
On Thu, Jan 12, 2017 at 01:34:13PM -0800, Alexey Neyman wrote:
>>From 13ebccef9a6fd13e2af6060f8e0f8d8700ecb261 Mon Sep 17 00:00:00 2001
> From: Alexey Neyman <stilor at att.net>
> Date: Thu, 12 Jan 2017 13:15:59 -0800
> Subject: [PATCH] Get ioctl definitions from host, not build.
Please prefix with a component and omit the trailing dot, e.g.
ioctlsort: get ioctl definitions from host, not build
> When cross-compiling, ioctlsort must obtain _IOC_* values from the
> host, build's values may be incompatible.
>
> Signed-off-by: Alexey Neyman <stilor at att.net>
> ---
> Makefile.am | 9 +++++++--
> ioctls_iocdef.c | 44 ++++++++++++++++++++++++++++++++++++++++++++
> ioctlsort.c | 12 +++++++++---
> 3 files changed, 60 insertions(+), 5 deletions(-)
> create mode 100644 ioctls_iocdef.c
>
> diff --git a/Makefile.am b/Makefile.am
> index 25caf9a..08e7704 100644
> --- a/Makefile.am
> +++ b/Makefile.am
> @@ -824,10 +824,15 @@ ioctl_redefs%.h: ioctlent%.h ioctlent0.h
> ioctlent%.h: ioctlsort%
> ./$< > $@
>
> +# Need to pick up <linux/ioctl.h> definitions *for host* while compiling
> +# ioctlsort *for build*, hence this magic.
> +ioctls_iocdef.h: $(srcdir)/ioctls_iocdef.c
> + $(CC) $(DEFAULT_INCLUDES) $(INCLUDES) -E -P $< | grep ^DEFINE | sed 's/^DEFINE/#define/' > $@
> +
1st, I slightly prefer ioctl_iocdef over ioctls_iocdef.
2nd, we usually keep intermediate targets.
3rd, the right way to invoke the preprocessor is $(CPP) with all its options.
4th, sed after grep is a bad shell style.
5th, let's make "ioctl_iocdef.h" a 100% replacement of <linux/ioctl.h> for ioctlsort.c.
For example,
ioctl_iocdef.i: $(srcdir)/ioctl_iocdef.c
$(CPP) -P $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
$(strace_CPPFLAGS) $(CPPFLAGS) $< -o $@
ioctl_iocdef.h: ioctl_iocdef.i
sed -n 's/^DEFINE HOST/#define /p' $< > $@
> ioctlsort%$(BUILD_EXEEXT): ioctlsort%.o
> $(ioctlsort_CC) $(ioctlsort_CFLAGS) $(ioctlsort_LDFLAGS) $< -o $@
>
> -ioctlsort%.o: ioctls_all%.h $(srcdir)/ioctlsort.c
> +ioctlsort%.o: ioctls_all%.h ioctls_iocdef.h $(srcdir)/ioctlsort.c
> $(ioctlsort_CC) $(ioctlsort_DEFS) $(ioctlsort_INCLUDES) $(ioctlsort_CPPFLAGS) $(ioctlsort_CFLAGS) -DIOCTLSORT_INC=\"$<\" -c -o $@ $(srcdir)/ioctlsort.c
>
> ioctls_all%.h: $(srcdir)/$(OS)/$(ARCH)/ioctls_inc%.h $(srcdir)/$(OS)/$(ARCH)/ioctls_arch%.h
> @@ -835,7 +840,7 @@ ioctls_all%.h: $(srcdir)/$(OS)/$(ARCH)/ioctls_inc%.h $(srcdir)/$(OS)/$(ARCH)/ioc
>
> BUILT_SOURCES = $(ioctl_redefs_h) $(ioctlent_h) \
> 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) \
> +CLEANFILES = $(ioctl_redefs_h) $(ioctlent_h) $(mpers_preproc_files) ioctls_iocdef.h \
> native_printer_decls.h native_printer_defs.h printers.h sen.h sys_func.h
> DISTCLEANFILES = gnu/stubs-32.h gnu/stubs-x32.h
The last but not least, please add ioctl_iocdef.c to EXTRA_DIST.
> diff --git a/ioctls_iocdef.c b/ioctls_iocdef.c
> new file mode 100644
> index 0000000..85b864a
> --- /dev/null
> +++ b/ioctls_iocdef.c
> @@ -0,0 +1,44 @@
> +/*
> + * Copyright (c) 2001 Wichert Akkerman <wichert at cistron.nl>
> + * Copyright (c) 2004-2015 Dmitry V. Levin <ldv at 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.
> + */
I'm sorry but this is not true, I didn't write this.
> +/*
> + * This file is *PREPROCESSED*, not *COMPILED* for host and the result
> + * is included into ioctlsort (which is compiled for build). Since some
> + * of these values are used in structure initializers, they cannot be
> + * defined as 'const unsigned int' - instead, they have to be macros.
> + * Hence, the result of preprocessing will be run through sed to change
> + * 'DEFINE' into '#define'
> + */
> +#include <linux/ioctl.h>
> +
> +DEFINE HOST_IOC_NONE _IOC_NONE
> +DEFINE HOST_IOC_READ _IOC_READ
> +DEFINE HOST_IOC_WRITE _IOC_WRITE
> +
> +DEFINE HOST_IOC_SIZESHIFT _IOC_SIZESHIFT
> +DEFINE HOST_IOC_DIRSHIFT _IOC_DIRSHIFT
> diff --git a/ioctlsort.c b/ioctlsort.c
> index 9c31691..1526dc3 100644
> --- a/ioctlsort.c
> +++ b/ioctlsort.c
> @@ -33,7 +33,8 @@
> #include <stdio.h>
> #include <stdlib.h>
> #include <string.h>
> -#include <linux/ioctl.h>
> +
> +#include "ioctls_iocdef.h"
Let's make ioctls_iocdef.h containing all necessary definitions
so that this hunk would be enough.
--
ldv
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 801 bytes
Desc: not available
URL: <http://lists.strace.io/pipermail/strace-devel/attachments/20170113/a12c1f03/attachment.bin>
More information about the Strace-devel
mailing list