|
Message-ID: <5928456e-a2e9-c4f3-4fff-c4100ca31e46@in2p3.fr> Date: Fri, 1 Dec 2017 08:31:54 +0100 From: Didier Kryn <kryn@...p3.fr> To: musl@...ts.openwall.com Subject: Re: Building musl-cross-make with gnat in musl environement Le 30/11/2017 à 18:06, Rich Felker a écrit : > 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 Makes sense. Will look at that. Didier
Powered by blists - more mailing lists
Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.