[Letux-kernel] [BUG v5.2-rc1] ARM build broken

H. Nikolaus Schaller hns at goldelico.com
Tue May 21 13:23:36 CEST 2019

Hi Chris,

> Am 20.05.2019 um 23:21 schrieb Chris Packham <Chris.Packham at alliedtelesis.co.nz>:
> On 21/05/19 6:54 AM, Kees Cook wrote:
>> [Adding Chris and Ard, who might have more compiler versions that me...]
> Late to the thread but ...
>> On Mon, May 20, 2019 at 07:08:39PM +0200, H. Nikolaus Schaller wrote:
>>>> Am 20.05.2019 um 17:59 schrieb Kees Cook <keescook at chromium.org>:
>>>> On Mon, May 20, 2019 at 05:15:02PM +0200, H. Nikolaus Schaller wrote:
>>>>> Hi,
>>>>> it seems as if ARM build is broken since ARM now hard enables CONFIG_HAVE_GCC_PLUGINS
>>>>> which indirectly enables CONFIG_GCC_PLUGIN_ARM_SSP_PER_TASK. Compiling this breaks
>>>>> on my system (Darwin build host) due to conflicts in system headers and Linux headers.
>>>>> So how can I turn off all these GCC_PLUGINS?
>>>>> The offending patch seems to be
>>>>> 	security: Create "kernel hardening" config area
>>>>> especially the new "default y" for GCC_PLUGINS. After removing that line from
>>>>> scripts/gcc-plugins/Kconfig makes my compile succeed.
>>>> The intention is to enable it _if_ the plugins are available as part of
>>>> the build environment. The "default y" on GCC_PLUGINS is mediated by:
>>>>        depends on HAVE_GCC_PLUGINS
>>> HAVE_GCC_PLUGINS has the following description:
>>> 	An arch should select this symbol if it supports building with
>>>           GCC plugins.
>>> So an ARCH (ARM) selects it unconditionally of the build environment.
>>>>        depends on PLUGIN_HOSTCC != ""
>>> Well, we have it set to "g++" for ages and it was not a problem.
>>> So both conditions are true.
>> PLUGIN_HOSTCC should have passed the scripts/gcc-plugin.sh test, so
>> that's correct. And the result (CONFIG_GCC_PLUGINS) is correct: it
>> doesn't enable or disable anything itself.
>> What you want is to disable CONFIG_STACKPROTECTOR_PER_TASK, which
>> is the knob for the feature:
>>         bool "Use a unique stack canary value for each task"
>>         select GCC_PLUGIN_ARM_SSP_PER_TASK
>>         default y
>>> Build error:
>>>  HOSTCXX -fPIC scripts/gcc-plugins/arm_ssp_per_task_plugin.o - due to: scripts/gcc-plugins/gcc-common.h
>>> In file included from scripts/gcc-plugins/arm_ssp_per_task_plugin.c:3:0:
>>> scripts/gcc-plugins/gcc-common.h:153:0: warning: "__unused" redefined
>>> #define __unused __attribute__((__unused__))
>>> ^
>> Does the following patch fix your build? (I assume that line is just a
>> warning, but if not...)
>> diff --git a/scripts/gcc-plugins/gcc-common.h b/scripts/gcc-plugins/gcc-common.h
>> index 552d5efd7cb7..17f06079a712 100644
>> --- a/scripts/gcc-plugins/gcc-common.h
>> +++ b/scripts/gcc-plugins/gcc-common.h
>> @@ -150,8 +150,12 @@ void print_gimple_expr(FILE *, gimple, int, int);
>>  void dump_gimple_stmt(pretty_printer *, gimple, int, int);
>>  #endif
>> +#ifndef __unused
>>  #define __unused __attribute__((__unused__))
>> +#endif
>> +#ifndef __visible
>>  #define __visible __attribute__((visibility("default")))
>> +#endif
>>>  HOSTLLD -shared scripts/gcc-plugins/arm_ssp_per_task_plugin.so - due to target missing
>>> Undefined symbols for architecture x86_64:
>>>  "gen_reg_rtx(machine_mode)", referenced from:
>>>      (anonymous namespace)::arm_pertask_ssp_rtl_pass::execute() in arm_ssp_per_task_plugin.o
>> However, this part sounds more like what was fixed with
>> 259799ea5a9a ("gcc-plugins: arm_ssp_per_task_plugin: Fix for older GCC < 6")
>> And maybe some additional fixes for 4.9 are needed?
>>> This is because CONFIG_GCC_PLUGIN_ARM_SSP_PER_TASK became automatically enabled and was never
>>> before. So the compiler may lack some library search path for building this plugin (which we
>>> did never miss).
>> Right -- maybe CONFIG_STACKPROTECTOR_PER_TASK doesn't work with old gcc
>> 4.9.2? I'll see if I can find that compiler version...
> My build environment is based on debian-jessie
> $ g++ --version
> g++ (Debian 4.9.2-10) 4.9.2
> After the fix I posted (which is now commit 259799ea5a9a ("gcc-plugins: 
> arm_ssp_per_task_plugin: Fix for older GCC < 6")) I wasn't having any 
> more problems.

Ok, fine.

So it indeed looks as if my host-g++ can not properly build gcc-plugins for
the arm cross-gcc. This may come from using Darwin as the build host... So
it may have/use/need a different gcc for building the gcc-plugin for
cross-building the kernel.

Hm. Yes. The cross-toolchain was bootstrapped from scratch. The HOSTCC
comes from Macports and may be a different version. So it is likely that
the HOSTCC from Macports can not build a compatible gcc-plugin for the

That seems to be a significant assumption about the build infrastructure
which now became permanently enabled by the "default y" for GCC_PLUGINS.

I am not sure what the right way forward is. Probably for me it is to find
out if I can fix my cross-toolchain. Or if the kernel should better check
if gcc-plugins can really be built, if they are automatically enabled.
Or keep all gcc-plugins disabled until explicitly configured for?

BR and thanks,

More information about the Letux-kernel mailing list