Openwall GNU/*/Linux - a small security-enhanced Linux distro for servers
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
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

Your e-mail address:

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