Openwall GNU/*/Linux - a small security-enhanced Linux distro for servers
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Date: Thu, 30 Nov 2017 12:06:05 -0500
From: Rich Felker <dalias@...c.org>
To: musl@...ts.openwall.com
Subject: Re: Building musl-cross-make with gnat in musl environement

On Thu, Nov 30, 2017 at 05:30:35PM +0100, Didier Kryn wrote:
> Le 02/11/2017 à 10:44, Didier Kryn a écrit :
> >    I report the successfull build of the cross-compiler
> >x86_64-musl-gcc-6.3.0 - understanding Ada - on x86_64 Debian
> >Wheezy.
> >
> >    The toolchain for build was gcc-6.3.0 for Linux-Gnu provided
> >by Adacore.The build toolchain to build major version 6 must be at
> >least major version 5.
> >
> >    Of course, the language option must be
> >'--enable-languages=ada,c,c++' .
> >
> >    Three patches were necessary:
> >       gnat63-terminals.diff: removes a #include <termio.h> in a C
> >source file.
> >       gnat63-prj-attr.diff: corrects the layout of a record in an
> >Ada source file to prevent a warning concerning performance.
> >       gnat63-xr_tabls.diff: same as the previous.
> 
>   In a glibc environment, x86_64-musl-gcc-6.3.0 builds without error
> with the three patches I have previously reported. To check there is
> no leak of the glibc native toolchain into the cross-compiler, I
> tried the build in a musl chroot (without any glibc headers or
> library), still with '--enable-languages=ada,c,c++'.
> 
>     In a first attempt, the compilation fails with the following error:
> 
> ----------------------------------------
> In file included from ../../src_toolchain/gcc/ada/adaint.h:290:0,
>                  from ../../src_toolchain/gcc/ada/adadecode.c:45:
> /usr/pkg/gcc-6.3/lib/gcc/x86_64-pc-linux-musl/6.3.0/../../../../x86_64-pc-linux-musl/include/sched.h:76:7:
> error: attempt to use poisoned "calloc"
>  void *calloc(size_t, size_t);
>        ^
> /usr/pkg/gcc-6.3/lib/gcc/x86_64-pc-linux-musl/6.3.0/../../../../x86_64-pc-linux-musl/include/sched.h:116:36:
> error: attempt to use poisoned "calloc"
>  #define CPU_ALLOC(n) ((cpu_set_t *)calloc(1,CPU_ALLOC_SIZE(n)))
> ----------------------------------------
> 
>     The Ada language has "tasking" primitives, which are nowadays
> based on POSIX threads. For this, adaint.h and other files include
> <sched.h> which, unfortunately, contains a declaration of calloc()
> and references to it. This is unfortunate because calloc() is
> poisoned  by gcc, to avoid interferences with its own allocation
> functions, and Gnat does only need a small part of sched.h.
> 
>     There must be a necessity, specific to musl, to make use of
> calloc() in sched.h, because glibc doesn't do so.
> 
>     A workaround, provided by the patch gnat63-adaint.diff, is to
> replace #include <sched.h> with the few lines of this file actually
> needed in adaint.h. The patch contains also #define _SCHED_H, which
> is necessary to prevent the inclusion of sched.h by other files,
> directly or indirectly.
> 
>     With this additional patch,  x86_64-musl-gcc-6.3.0 builds
> without error both in a glibc environement and in a musl
> environment.
> 
>     Didier
> 

> --- gcc-6.3.0-A/gcc/ada/adaint.c
> +++ gcc-6.3.0-B/gcc/ada/adaint.c
> @@ -3086,7 +3086,7 @@
>  #endif
>  
>  #if defined (__linux__)
> -#include <sched.h>
> +/* do not #include <sched.h> */
>  
>  /* glibc versions earlier than 2.7 do not define the routines to handle
>     dynamically allocated CPU sets. For these targets, we use the static
> --- gcc-6.3.0-A/gcc/ada/adaint.h
> +++ gcc-6.3.0-B/gcc/ada/adaint.h
> @@ -287,7 +287,17 @@
>  
>  /* Routines for interface to required CPU set primitives */
>  
> -#include <sched.h>
> +/* Do not #include <sched.h>, but copy part of it and prevent its inclusion */
> +# ifndef _SCHED_H
> +# define _SCHED_H
> +typedef struct cpu_set_t { unsigned long __bits[128/sizeof(long)]; } cpu_set_t;
> +# define CPU_ZERO_S(size,set) memset(set,0,size)
> +# define CPU_ZERO(set) CPU_ZERO_S(sizeof(cpu_set_t),set)
> +# define __CPU_op_S(i, size, set, op) ( (i)/8U >= (size) ? 0 : \                 
> +        (((unsigned long *)(set))[(i)/8/sizeof(long)] op (1UL<<((i)%(8*sizeof(long))))) )
> +# define CPU_SET_S(i, size, set) __CPU_op_S(i, size, set, |=)
> +# define CPU_SET(i, set) CPU_SET_S(i,sizeof(cpu_set_t),set)
> +# endif
>  
>  extern cpu_set_t *__gnat_cpu_alloc                 (size_t);
>  extern size_t __gnat_cpu_alloc_size                (size_t);

Just patch out the poisoning instead. It's only meaningful to GCC
developers and should _not_ be used in deployment for reasons exactly
like what you discovered here, pretty much the same reasons -Werror
should not be enabled in deployment.

Rich

Powered by blists - more mailing lists

Your e-mail address:

Powered by Openwall GNU/*/Linux - Powered by OpenVZ