gcc 6.3 vs 8.2 Re: [RFC PATCH] powerpc: Enable kcov

Andrew Donnellan andrew.donnellan at au1.ibm.com
Tue Jan 15 19:14:18 AEDT 2019


On 15/1/19 6:26 pm, Mathieu Malaterre wrote:
> [Sorry to hijack this thread. ]
> 
> On Tue, Jan 15, 2019 at 5:22 AM Andrew Donnellan
> <andrew.donnellan at au1.ibm.com> wrote:
>>
>> kcov provides kernel coverage data that's useful for fuzzing tools like
>> syzkaller.
>>
>> Wire up kcov support on powerpc. Disable kcov instrumentation on the same
>> files where we currently disable gcov and UBSan instrumentation.
>>
>> Signed-off-by: Andrew Donnellan <andrew.donnellan at au1.ibm.com>
>>
>> ---
>>
>> kcov looks like it's working okay, both kcovtrace and syzkaller seem to be
>> working. I did see some issues with compiling and booting kernels with gcc
>> 6.3 and earlier versions which disappeared when I upgraded to gcc 8.2, I
>> need to investigate that more.
> 
> This is also my setup. Would you be able to tell why I get a kconfig
> option loop when using gcc 8.2 which I cannot reproduce using gcc 6.3
> ?
> 
> gcc 6-3 is ok doing:
> 
> $ make ARCH=powerpc custom_defconfig
> $ make ARCH=powerpc CROSS_COMPILE=powerpc-linux-gnu-
> 
> while gcc 8.2 leads to (linux/master):
> 
> ...
> $ make ARCH=powerpc custom_defconfig
> $ make ARCH=powerpc CROSS_COMPILE=powerpc-linux-gnu-
>    GEN     Makefile
> scripts/kconfig/conf  --syncconfig Kconfig
> *
> * Restart config...
> *
> *
> * General architecture-dependent options
> *
> OProfile system profiling (OPROFILE) [M/n/y/?] m
> Kprobes (KPROBES) [Y/n/?] y
> Optimize very unlikely/likely branches (JUMP_LABEL) [N/y/?] n
> Stack Protector buffer overflow detection (STACKPROTECTOR) [Y/n/?] (NEW)
> ...
> 
> I did check that `custom_defconfig` is the minimal defconfig generated
> by `savedefconfig` in both cases.
> 
> Hints or comments welcome, thanks much.

That would be because in arch/powerpc/Kconfig:

select HAVE_STACKPROTECTOR              if PPC64 && 
$(cc-option,-mstack-protector-guard=tls -mstack-protector-guard-reg=r13)

Thus the STACKPROTECTOR option appears or disappears depending on 
compiler version.

Sure enough, gcc 6 whinges about that option, gcc 8 does not.


Andrew

> 
>> ---
>>   arch/powerpc/Kconfig                | 1 +
>>   arch/powerpc/kernel/Makefile        | 7 ++++++-
>>   arch/powerpc/kernel/trace/Makefile  | 3 ++-
>>   arch/powerpc/kernel/vdso32/Makefile | 1 +
>>   arch/powerpc/kernel/vdso64/Makefile | 1 +
>>   arch/powerpc/xmon/Makefile          | 1 +
>>   6 files changed, 12 insertions(+), 2 deletions(-)
>>
>> diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig
>> index 2890d36eb531..d3698dae0e60 100644
>> --- a/arch/powerpc/Kconfig
>> +++ b/arch/powerpc/Kconfig
>> @@ -134,6 +134,7 @@ config PPC
>>          select ARCH_HAS_ELF_RANDOMIZE
>>          select ARCH_HAS_FORTIFY_SOURCE
>>          select ARCH_HAS_GCOV_PROFILE_ALL
>> +       select ARCH_HAS_KCOV
>>          select ARCH_HAS_PHYS_TO_DMA
>>          select ARCH_HAS_PMEM_API                if PPC64
>>          select ARCH_HAS_PTE_SPECIAL
>> diff --git a/arch/powerpc/kernel/Makefile b/arch/powerpc/kernel/Makefile
>> index cb7f0bb9ee71..961f44eabb65 100644
>> --- a/arch/powerpc/kernel/Makefile
>> +++ b/arch/powerpc/kernel/Makefile
>> @@ -142,16 +142,21 @@ endif
>>   obj-$(CONFIG_EPAPR_PARAVIRT)   += epapr_paravirt.o epapr_hcalls.o
>>   obj-$(CONFIG_KVM_GUEST)                += kvm.o kvm_emul.o
>>
>> -# Disable GCOV & sanitizers in odd or sensitive code
>> +# Disable GCOV, KCOV & sanitizers in odd or sensitive code
>>   GCOV_PROFILE_prom_init.o := n
>> +KCOV_INSTRUMENT_prom_init.o := n
>>   UBSAN_SANITIZE_prom_init.o := n
>>   GCOV_PROFILE_machine_kexec_64.o := n
>> +KCOV_INSTRUMENT_machine_kexec_64.o := n
>>   UBSAN_SANITIZE_machine_kexec_64.o := n
>>   GCOV_PROFILE_machine_kexec_32.o := n
>> +KCOV_INSTRUMENT_machine_kexec_32.o := n
>>   UBSAN_SANITIZE_machine_kexec_32.o := n
>>   GCOV_PROFILE_kprobes.o := n
>> +KCOV_INSTRUMENT_kprobes.o := n
>>   UBSAN_SANITIZE_kprobes.o := n
>>   GCOV_PROFILE_kprobes-ftrace.o := n
>> +KCOV_INSTRUMENT_kprobes-ftrace.o := n
>>   UBSAN_SANITIZE_kprobes-ftrace.o := n
>>   UBSAN_SANITIZE_vdso.o := n
>>
>> diff --git a/arch/powerpc/kernel/trace/Makefile b/arch/powerpc/kernel/trace/Makefile
>> index b1725ad3e13d..858503775c58 100644
>> --- a/arch/powerpc/kernel/trace/Makefile
>> +++ b/arch/powerpc/kernel/trace/Makefile
>> @@ -23,6 +23,7 @@ obj-$(CONFIG_TRACING)                 += trace_clock.o
>>   obj-$(CONFIG_PPC64)                    += $(obj64-y)
>>   obj-$(CONFIG_PPC32)                    += $(obj32-y)
>>
>> -# Disable GCOV & sanitizers in odd or sensitive code
>> +# Disable GCOV, KCOV & sanitizers in odd or sensitive code
>>   GCOV_PROFILE_ftrace.o := n
>> +KCOV_INSTRUMENT_ftrace.o := n
>>   UBSAN_SANITIZE_ftrace.o := n
>> diff --git a/arch/powerpc/kernel/vdso32/Makefile b/arch/powerpc/kernel/vdso32/Makefile
>> index 50112d4473bb..ce199f6e4256 100644
>> --- a/arch/powerpc/kernel/vdso32/Makefile
>> +++ b/arch/powerpc/kernel/vdso32/Makefile
>> @@ -23,6 +23,7 @@ targets := $(obj-vdso32) vdso32.so vdso32.so.dbg
>>   obj-vdso32 := $(addprefix $(obj)/, $(obj-vdso32))
>>
>>   GCOV_PROFILE := n
>> +KCOV_INSTRUMENT := n
>>   UBSAN_SANITIZE := n
>>
>>   ccflags-y := -shared -fno-common -fno-builtin
>> diff --git a/arch/powerpc/kernel/vdso64/Makefile b/arch/powerpc/kernel/vdso64/Makefile
>> index 69cecb346269..28e7d112aa2f 100644
>> --- a/arch/powerpc/kernel/vdso64/Makefile
>> +++ b/arch/powerpc/kernel/vdso64/Makefile
>> @@ -9,6 +9,7 @@ targets := $(obj-vdso64) vdso64.so vdso64.so.dbg
>>   obj-vdso64 := $(addprefix $(obj)/, $(obj-vdso64))
>>
>>   GCOV_PROFILE := n
>> +KCOV_INSTRUMENT := n
>>   UBSAN_SANITIZE := n
>>
>>   ccflags-y := -shared -fno-common -fno-builtin
>> diff --git a/arch/powerpc/xmon/Makefile b/arch/powerpc/xmon/Makefile
>> index 878f9c1d3615..3050f9323254 100644
>> --- a/arch/powerpc/xmon/Makefile
>> +++ b/arch/powerpc/xmon/Makefile
>> @@ -5,6 +5,7 @@
>>   subdir-ccflags-y := $(call cc-disable-warning, builtin-requires-header)
>>
>>   GCOV_PROFILE := n
>> +KCOV_INSTRUMENT := n
>>   UBSAN_SANITIZE := n
>>
>>   # Disable ftrace for the entire directory
>> --
>> 2.11.0
>>
> 

-- 
Andrew Donnellan              OzLabs, ADL Canberra
andrew.donnellan at au1.ibm.com  IBM Australia Limited



More information about the Linuxppc-dev mailing list