diff mbox series

[bpf-next] kbuild: add ability to generate BTF type info for vmlinux

Message ID 20190402164950.429597-1-andrii.nakryiko@gmail.com
State Accepted
Delegated to: BPF Maintainers
Headers show
Series [bpf-next] kbuild: add ability to generate BTF type info for vmlinux | expand

Commit Message

Andrii Nakryiko April 2, 2019, 4:49 p.m. UTC
From: Andrii Nakryiko <andriin@fb.com>

This patch adds new config option to trigger generation of BTF type
information from DWARF debuginfo for vmlinux and kernel modules through
pahole, which in turn relies on libbpf for btf_dedup() algorithm.

The intent is to record compact type information of all types used
inside kernel, including all the structs/unions/typedefs/etc. This
enables BPF's compile-once-run-everywhere ([0]) approach, in which
tracing programs that are inspecting kernel's internal data (e.g.,
struct task_struct) can be compiled on a system running some kernel
version, but would be possible to run on other kernel versions (and
configurations) without recompilation, even if the layout of structs
changed and/or some of the fields were added, removed, or renamed.

This is only possible if BPF loader can get kernel type info to adjust
all the offsets correctly. This patch is a first time in this direction,
making sure that BTF type info is part of Linux kernel image in
non-loadable ELF section.

BTF deduplication ([1]) algorithm typically provides 100x savings
compared to DWARF data, so resulting .BTF section is not big as is
typically about 2MB in size.

[0] http://vger.kernel.org/lpc-bpf2018.html#session-2
[1] https://facebookmicrosites.github.io/bpf/blog/2018/11/14/btf-enhancement.html

Cc: Masahiro Yamada <yamada.masahiro@socionext.com>
Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Daniel Borkmann <daniel@iogearbox.net>
Cc: Alexei Starovoitov <ast@fb.com>
Cc: Yonghong Song <yhs@fb.com>
Cc: Martin KaFai Lau <kafai@fb.com>
Signed-off-by: Andrii Nakryiko <andriin@fb.com>
---
 Makefile                |  3 ++-
 lib/Kconfig.debug       |  8 ++++++++
 scripts/link-vmlinux.sh | 20 +++++++++++++++++++-
 3 files changed, 29 insertions(+), 2 deletions(-)

Comments

David Miller April 2, 2019, 5:40 p.m. UTC | #1
From: <andrii.nakryiko@gmail.com>
Date: Tue, 2 Apr 2019 09:49:50 -0700

> From: Andrii Nakryiko <andriin@fb.com>
> 
> This patch adds new config option to trigger generation of BTF type
> information from DWARF debuginfo for vmlinux and kernel modules through
> pahole, which in turn relies on libbpf for btf_dedup() algorithm.
> 
> The intent is to record compact type information of all types used
> inside kernel, including all the structs/unions/typedefs/etc. This
> enables BPF's compile-once-run-everywhere ([0]) approach, in which
> tracing programs that are inspecting kernel's internal data (e.g.,
> struct task_struct) can be compiled on a system running some kernel
> version, but would be possible to run on other kernel versions (and
> configurations) without recompilation, even if the layout of structs
> changed and/or some of the fields were added, removed, or renamed.
> 
> This is only possible if BPF loader can get kernel type info to adjust
> all the offsets correctly. This patch is a first time in this direction,
> making sure that BTF type info is part of Linux kernel image in
> non-loadable ELF section.
> 
> BTF deduplication ([1]) algorithm typically provides 100x savings
> compared to DWARF data, so resulting .BTF section is not big as is
> typically about 2MB in size.
> 
> [0] http://vger.kernel.org/lpc-bpf2018.html#session-2
> [1] https://facebookmicrosites.github.io/bpf/blog/2018/11/14/btf-enhancement.html
> 
> Signed-off-by: Andrii Nakryiko <andriin@fb.com>

Acked-by: David S. Miller <davem@davemloft.net>
Daniel Borkmann April 2, 2019, 11 p.m. UTC | #2
On 04/02/2019 06:49 PM, andrii.nakryiko@gmail.com wrote:
> From: Andrii Nakryiko <andriin@fb.com>
> 
> This patch adds new config option to trigger generation of BTF type
> information from DWARF debuginfo for vmlinux and kernel modules through
> pahole, which in turn relies on libbpf for btf_dedup() algorithm.
> 
> The intent is to record compact type information of all types used
> inside kernel, including all the structs/unions/typedefs/etc. This
> enables BPF's compile-once-run-everywhere ([0]) approach, in which
> tracing programs that are inspecting kernel's internal data (e.g.,
> struct task_struct) can be compiled on a system running some kernel
> version, but would be possible to run on other kernel versions (and
> configurations) without recompilation, even if the layout of structs
> changed and/or some of the fields were added, removed, or renamed.
> 
> This is only possible if BPF loader can get kernel type info to adjust
> all the offsets correctly. This patch is a first time in this direction,
> making sure that BTF type info is part of Linux kernel image in
> non-loadable ELF section.
> 
> BTF deduplication ([1]) algorithm typically provides 100x savings
> compared to DWARF data, so resulting .BTF section is not big as is
> typically about 2MB in size.
> 
> [0] http://vger.kernel.org/lpc-bpf2018.html#session-2
> [1] https://facebookmicrosites.github.io/bpf/blog/2018/11/14/btf-enhancement.html
> 
> Cc: Masahiro Yamada <yamada.masahiro@socionext.com>
> Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
> Cc: Daniel Borkmann <daniel@iogearbox.net>
> Cc: Alexei Starovoitov <ast@fb.com>
> Cc: Yonghong Song <yhs@fb.com>
> Cc: Martin KaFai Lau <kafai@fb.com>
> Signed-off-by: Andrii Nakryiko <andriin@fb.com>

LGTM! As subject is targetting bpf-next this time since this BPF-related patch
in this form has been sitting on the list for over 1.5months, I've taken it in
there now, thanks!
Jiri Olsa April 3, 2019, 8:46 a.m. UTC | #3
On Tue, Apr 02, 2019 at 09:49:50AM -0700, andrii.nakryiko@gmail.com wrote:
> From: Andrii Nakryiko <andriin@fb.com>
> 
> This patch adds new config option to trigger generation of BTF type
> information from DWARF debuginfo for vmlinux and kernel modules through
> pahole, which in turn relies on libbpf for btf_dedup() algorithm.
> 
> The intent is to record compact type information of all types used
> inside kernel, including all the structs/unions/typedefs/etc. This
> enables BPF's compile-once-run-everywhere ([0]) approach, in which
> tracing programs that are inspecting kernel's internal data (e.g.,
> struct task_struct) can be compiled on a system running some kernel
> version, but would be possible to run on other kernel versions (and
> configurations) without recompilation, even if the layout of structs
> changed and/or some of the fields were added, removed, or renamed.
> 
> This is only possible if BPF loader can get kernel type info to adjust
> all the offsets correctly. This patch is a first time in this direction,
> making sure that BTF type info is part of Linux kernel image in
> non-loadable ELF section.
> 
> BTF deduplication ([1]) algorithm typically provides 100x savings
> compared to DWARF data, so resulting .BTF section is not big as is
> typically about 2MB in size.

hi,
I'm using the latest pahole from git tree:
  https://github.com/acmel/dwarves.git

and getting pahole crash:

  LD      vmlinux
  BTF     vmlinux
die__process_inline_expansion: DW_TAG_label (0xa) @ <0x3eef8> not handled!
scripts/link-vmlinux.sh: line 96: 31222 Segmentation fault      (core dumped) LLVM_OBJCOPY=${OBJCOPY} ${PAHOLE} -J ${1}
make[1]: *** [/home/jolsa/linux/Makefile:1025: vmlinux] Error 139
make: *** [Makefile:170: sub-make] Error 2

is there some other source/dependency I'm missing?

thanks,
jirka


> 
> [0] http://vger.kernel.org/lpc-bpf2018.html#session-2
> [1] https://facebookmicrosites.github.io/bpf/blog/2018/11/14/btf-enhancement.html
> 
> Cc: Masahiro Yamada <yamada.masahiro@socionext.com>
> Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
> Cc: Daniel Borkmann <daniel@iogearbox.net>
> Cc: Alexei Starovoitov <ast@fb.com>
> Cc: Yonghong Song <yhs@fb.com>
> Cc: Martin KaFai Lau <kafai@fb.com>
> Signed-off-by: Andrii Nakryiko <andriin@fb.com>
> ---
>  Makefile                |  3 ++-
>  lib/Kconfig.debug       |  8 ++++++++
>  scripts/link-vmlinux.sh | 20 +++++++++++++++++++-
>  3 files changed, 29 insertions(+), 2 deletions(-)
> 
> diff --git a/Makefile b/Makefile
> index d5713e7b1e50..a55308147a09 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -387,6 +387,7 @@ NM		= $(CROSS_COMPILE)nm
>  STRIP		= $(CROSS_COMPILE)strip
>  OBJCOPY		= $(CROSS_COMPILE)objcopy
>  OBJDUMP		= $(CROSS_COMPILE)objdump
> +PAHOLE		= pahole
>  LEX		= flex
>  YACC		= bison
>  AWK		= awk
> @@ -442,7 +443,7 @@ KBUILD_LDFLAGS :=
>  GCC_PLUGINS_CFLAGS :=
>  
>  export ARCH SRCARCH CONFIG_SHELL HOSTCC KBUILD_HOSTCFLAGS CROSS_COMPILE AS LD CC
> -export CPP AR NM STRIP OBJCOPY OBJDUMP KBUILD_HOSTLDFLAGS KBUILD_HOSTLDLIBS
> +export CPP AR NM STRIP OBJCOPY OBJDUMP PAHOLE KBUILD_HOSTLDFLAGS KBUILD_HOSTLDLIBS
>  export MAKE LEX YACC AWK GENKSYMS INSTALLKERNEL PERL PYTHON PYTHON2 PYTHON3 UTS_MACHINE
>  export HOSTCXX KBUILD_HOSTCXXFLAGS LDFLAGS_MODULE CHECK CHECKFLAGS
>  
> diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug
> index d4df5b24d75e..cce78dcd19a2 100644
> --- a/lib/Kconfig.debug
> +++ b/lib/Kconfig.debug
> @@ -200,6 +200,14 @@ config DEBUG_INFO_DWARF4
>  	  But it significantly improves the success of resolving
>  	  variables in gdb on optimized code.
>  
> +config DEBUG_INFO_BTF
> +	bool "Generate BTF typeinfo"
> +	depends on DEBUG_INFO
> +	help
> +	  Generate deduplicated BTF type information from DWARF debug info.
> +	  Turning this on expects presence of pahole tool, which will convert
> +	  DWARF type info into equivalent deduplicated BTF type info.
> +
>  config GDB_SCRIPTS
>  	bool "Provide GDB scripts for kernel debugging"
>  	depends on DEBUG_INFO
> diff --git a/scripts/link-vmlinux.sh b/scripts/link-vmlinux.sh
> index c8cf45362bd6..73bb7dfdc2c9 100755
> --- a/scripts/link-vmlinux.sh
> +++ b/scripts/link-vmlinux.sh
> @@ -40,7 +40,7 @@ set -e
>  info()
>  {
>  	if [ "${quiet}" != "silent_" ]; then
> -		printf "  %-7s %s\n" ${1} ${2}
> +		printf "  %-7s %s\n" "${1}" "${2}"
>  	fi
>  }
>  
> @@ -114,6 +114,20 @@ vmlinux_link()
>  	fi
>  }
>  
> +# generate .BTF typeinfo from DWARF debuginfo
> +gen_btf()
> +{
> +	local pahole_ver;
> +
> +	pahole_ver=$(${PAHOLE} --version | sed -E 's/v([0-9]+)\.([0-9]+)/\1\2/')
> +	if [ "${pahole_ver}" -lt "113" ]; then
> +		info "BTF" "${1}: pahole version $(${PAHOLE} --version) is too old, need at least v1.13"
> +		exit 0
> +	fi
> +
> +	info "BTF" ${1}
> +	LLVM_OBJCOPY=${OBJCOPY} ${PAHOLE} -J ${1}
> +}
>  
>  # Create ${2} .o file with all symbols from the ${1} object file
>  kallsyms()
> @@ -281,6 +295,10 @@ fi
>  info LD vmlinux
>  vmlinux_link "${kallsymso}" vmlinux
>  
> +if [ -n "${CONFIG_DEBUG_INFO_BTF}" ]; then
> +	gen_btf vmlinux
> +fi
> +
>  if [ -n "${CONFIG_BUILDTIME_EXTABLE_SORT}" ]; then
>  	info SORTEX vmlinux
>  	sortextable vmlinux
> -- 
> 2.17.1
>
Daniel Borkmann April 3, 2019, 9:04 a.m. UTC | #4
On 04/03/2019 10:46 AM, Jiri Olsa wrote:
> On Tue, Apr 02, 2019 at 09:49:50AM -0700, andrii.nakryiko@gmail.com wrote:
>> From: Andrii Nakryiko <andriin@fb.com>
>>
>> This patch adds new config option to trigger generation of BTF type
>> information from DWARF debuginfo for vmlinux and kernel modules through
>> pahole, which in turn relies on libbpf for btf_dedup() algorithm.
>>
>> The intent is to record compact type information of all types used
>> inside kernel, including all the structs/unions/typedefs/etc. This
>> enables BPF's compile-once-run-everywhere ([0]) approach, in which
>> tracing programs that are inspecting kernel's internal data (e.g.,
>> struct task_struct) can be compiled on a system running some kernel
>> version, but would be possible to run on other kernel versions (and
>> configurations) without recompilation, even if the layout of structs
>> changed and/or some of the fields were added, removed, or renamed.
>>
>> This is only possible if BPF loader can get kernel type info to adjust
>> all the offsets correctly. This patch is a first time in this direction,
>> making sure that BTF type info is part of Linux kernel image in
>> non-loadable ELF section.
>>
>> BTF deduplication ([1]) algorithm typically provides 100x savings
>> compared to DWARF data, so resulting .BTF section is not big as is
>> typically about 2MB in size.
> 
> hi,
> I'm using the latest pahole from git tree:
>   https://github.com/acmel/dwarves.git
> 
> and getting pahole crash:
> 
>   LD      vmlinux
>   BTF     vmlinux
> die__process_inline_expansion: DW_TAG_label (0xa) @ <0x3eef8> not handled!
> scripts/link-vmlinux.sh: line 96: 31222 Segmentation fault      (core dumped) LLVM_OBJCOPY=${OBJCOPY} ${PAHOLE} -J ${1}
> make[1]: *** [/home/jolsa/linux/Makefile:1025: vmlinux] Error 139
> make: *** [Makefile:170: sub-make] Error 2
> 
> is there some other source/dependency I'm missing?

Yesterday night, I've tested with [0] but seems to have the same HEAD as
the github repo you pointed out. Seems the above is coming from pahole's
__die__process_tag() bailing out with default for DW_TAG_label?

On my side worked fine:

# rm vmlinux
# make -j8
  DESCEND  objtool
  CALL    scripts/atomic/check-atomics.sh
  CALL    scripts/checksyscalls.sh
  CHK     include/generated/compile.h
  GEN     .version
  CHK     include/generated/compile.h
  UPD     include/generated/compile.h
  CC      init/version.o
  AR      init/built-in.a
  LD      vmlinux.o
  MODPOST vmlinux.o
  KSYM    .tmp_kallsyms1.o
  KSYM    .tmp_kallsyms2.o
  LD      vmlinux
  BTF     vmlinux                              <--
  SORTEX  vmlinux
  SYSMAP  System.map
  Building modules, stage 2.
  CC      arch/x86/boot/version.o
  VOFFSET arch/x86/boot/compressed/../voffset.h
  OBJCOPY arch/x86/boot/compressed/vmlinux.bin
  RELOCS  arch/x86/boot/compressed/vmlinux.relocs
  CC      arch/x86/boot/compressed/kaslr.o
  CC      arch/x86/boot/compressed/misc.o
  GZIP    arch/x86/boot/compressed/vmlinux.bin.gz
  MKPIGGY arch/x86/boot/compressed/piggy.S
  AS      arch/x86/boot/compressed/piggy.o
  LD      arch/x86/boot/compressed/vmlinux
  ZOFFSET arch/x86/boot/zoffset.h
  OBJCOPY arch/x86/boot/vmlinux.bin
  AS      arch/x86/boot/header.o
  LD      arch/x86/boot/setup.elf
  OBJCOPY arch/x86/boot/setup.bin
  BUILD   arch/x86/boot/bzImage
Setup is 17660 bytes (padded to 17920 bytes).
System is 9245 kB
CRC 24cd7eff
Kernel: arch/x86/boot/bzImage is ready  (#15)
  MODPOST 4979 modules

  [0] https://git.kernel.org/pub/scm/devel/pahole/pahole.git/
Jiri Olsa April 3, 2019, 9:12 a.m. UTC | #5
On Wed, Apr 03, 2019 at 11:04:28AM +0200, Daniel Borkmann wrote:
> On 04/03/2019 10:46 AM, Jiri Olsa wrote:
> > On Tue, Apr 02, 2019 at 09:49:50AM -0700, andrii.nakryiko@gmail.com wrote:
> >> From: Andrii Nakryiko <andriin@fb.com>
> >>
> >> This patch adds new config option to trigger generation of BTF type
> >> information from DWARF debuginfo for vmlinux and kernel modules through
> >> pahole, which in turn relies on libbpf for btf_dedup() algorithm.
> >>
> >> The intent is to record compact type information of all types used
> >> inside kernel, including all the structs/unions/typedefs/etc. This
> >> enables BPF's compile-once-run-everywhere ([0]) approach, in which
> >> tracing programs that are inspecting kernel's internal data (e.g.,
> >> struct task_struct) can be compiled on a system running some kernel
> >> version, but would be possible to run on other kernel versions (and
> >> configurations) without recompilation, even if the layout of structs
> >> changed and/or some of the fields were added, removed, or renamed.
> >>
> >> This is only possible if BPF loader can get kernel type info to adjust
> >> all the offsets correctly. This patch is a first time in this direction,
> >> making sure that BTF type info is part of Linux kernel image in
> >> non-loadable ELF section.
> >>
> >> BTF deduplication ([1]) algorithm typically provides 100x savings
> >> compared to DWARF data, so resulting .BTF section is not big as is
> >> typically about 2MB in size.
> > 
> > hi,
> > I'm using the latest pahole from git tree:
> >   https://github.com/acmel/dwarves.git
> > 
> > and getting pahole crash:
> > 
> >   LD      vmlinux
> >   BTF     vmlinux
> > die__process_inline_expansion: DW_TAG_label (0xa) @ <0x3eef8> not handled!
> > scripts/link-vmlinux.sh: line 96: 31222 Segmentation fault      (core dumped) LLVM_OBJCOPY=${OBJCOPY} ${PAHOLE} -J ${1}
> > make[1]: *** [/home/jolsa/linux/Makefile:1025: vmlinux] Error 139
> > make: *** [Makefile:170: sub-make] Error 2
> > 
> > is there some other source/dependency I'm missing?
> 
> Yesterday night, I've tested with [0] but seems to have the same HEAD as
> the github repo you pointed out. Seems the above is coming from pahole's
> __die__process_tag() bailing out with default for DW_TAG_label?
> 
> On my side worked fine:

hum, I also had to change the version of pahole in the patch to allow
version v1.12, because both latest pahole sources are on version 1.12,
did u have to do that? looks like there's v1.13 somewhere ;-)

jirka

SNIP

> 
>   [0] https://git.kernel.org/pub/scm/devel/pahole/pahole.git/
Daniel Borkmann April 3, 2019, 9:21 a.m. UTC | #6
On 04/03/2019 11:12 AM, Jiri Olsa wrote:
> On Wed, Apr 03, 2019 at 11:04:28AM +0200, Daniel Borkmann wrote:
>> On 04/03/2019 10:46 AM, Jiri Olsa wrote:
>>> On Tue, Apr 02, 2019 at 09:49:50AM -0700, andrii.nakryiko@gmail.com wrote:
>>>> From: Andrii Nakryiko <andriin@fb.com>
>>>>
>>>> This patch adds new config option to trigger generation of BTF type
>>>> information from DWARF debuginfo for vmlinux and kernel modules through
>>>> pahole, which in turn relies on libbpf for btf_dedup() algorithm.
>>>>
>>>> The intent is to record compact type information of all types used
>>>> inside kernel, including all the structs/unions/typedefs/etc. This
>>>> enables BPF's compile-once-run-everywhere ([0]) approach, in which
>>>> tracing programs that are inspecting kernel's internal data (e.g.,
>>>> struct task_struct) can be compiled on a system running some kernel
>>>> version, but would be possible to run on other kernel versions (and
>>>> configurations) without recompilation, even if the layout of structs
>>>> changed and/or some of the fields were added, removed, or renamed.
>>>>
>>>> This is only possible if BPF loader can get kernel type info to adjust
>>>> all the offsets correctly. This patch is a first time in this direction,
>>>> making sure that BTF type info is part of Linux kernel image in
>>>> non-loadable ELF section.
>>>>
>>>> BTF deduplication ([1]) algorithm typically provides 100x savings
>>>> compared to DWARF data, so resulting .BTF section is not big as is
>>>> typically about 2MB in size.
>>>
>>> hi,
>>> I'm using the latest pahole from git tree:
>>>   https://github.com/acmel/dwarves.git
>>>
>>> and getting pahole crash:
>>>
>>>   LD      vmlinux
>>>   BTF     vmlinux
>>> die__process_inline_expansion: DW_TAG_label (0xa) @ <0x3eef8> not handled!
>>> scripts/link-vmlinux.sh: line 96: 31222 Segmentation fault      (core dumped) LLVM_OBJCOPY=${OBJCOPY} ${PAHOLE} -J ${1}
>>> make[1]: *** [/home/jolsa/linux/Makefile:1025: vmlinux] Error 139
>>> make: *** [Makefile:170: sub-make] Error 2
>>>
>>> is there some other source/dependency I'm missing?
>>
>> Yesterday night, I've tested with [0] but seems to have the same HEAD as
>> the github repo you pointed out. Seems the above is coming from pahole's
>> __die__process_tag() bailing out with default for DW_TAG_label?
>>
>> On my side worked fine:
> 
> hum, I also had to change the version of pahole in the patch to allow
> version v1.12, because both latest pahole sources are on version 1.12,
> did u have to do that? looks like there's v1.13 somewhere ;-)

Yeah, I did for local testing. Tag still needs to be bumped by Arnaldo.
Arnaldo Carvalho de Melo April 3, 2019, 12:05 p.m. UTC | #7
Em Wed, Apr 03, 2019 at 11:12:58AM +0200, Jiri Olsa escreveu:
> On Wed, Apr 03, 2019 at 11:04:28AM +0200, Daniel Borkmann wrote:
> > On 04/03/2019 10:46 AM, Jiri Olsa wrote:
> > > On Tue, Apr 02, 2019 at 09:49:50AM -0700, andrii.nakryiko@gmail.com wrote:
> > >> From: Andrii Nakryiko <andriin@fb.com>
> > >>
> > >> This patch adds new config option to trigger generation of BTF type
> > >> information from DWARF debuginfo for vmlinux and kernel modules through
> > >> pahole, which in turn relies on libbpf for btf_dedup() algorithm.
> > >>
> > >> The intent is to record compact type information of all types used
> > >> inside kernel, including all the structs/unions/typedefs/etc. This
> > >> enables BPF's compile-once-run-everywhere ([0]) approach, in which
> > >> tracing programs that are inspecting kernel's internal data (e.g.,
> > >> struct task_struct) can be compiled on a system running some kernel
> > >> version, but would be possible to run on other kernel versions (and
> > >> configurations) without recompilation, even if the layout of structs
> > >> changed and/or some of the fields were added, removed, or renamed.
> > >>
> > >> This is only possible if BPF loader can get kernel type info to adjust
> > >> all the offsets correctly. This patch is a first time in this direction,
> > >> making sure that BTF type info is part of Linux kernel image in
> > >> non-loadable ELF section.
> > >>
> > >> BTF deduplication ([1]) algorithm typically provides 100x savings
> > >> compared to DWARF data, so resulting .BTF section is not big as is
> > >> typically about 2MB in size.
> > > 
> > > hi,
> > > I'm using the latest pahole from git tree:
> > >   https://github.com/acmel/dwarves.git
> > > 
> > > and getting pahole crash:
> > > 
> > >   LD      vmlinux
> > >   BTF     vmlinux
> > > die__process_inline_expansion: DW_TAG_label (0xa) @ <0x3eef8> not handled!
> > > scripts/link-vmlinux.sh: line 96: 31222 Segmentation fault      (core dumped) LLVM_OBJCOPY=${OBJCOPY} ${PAHOLE} -J ${1}
> > > make[1]: *** [/home/jolsa/linux/Makefile:1025: vmlinux] Error 139
> > > make: *** [Makefile:170: sub-make] Error 2
> > > 
> > > is there some other source/dependency I'm missing?
> > 
> > Yesterday night, I've tested with [0] but seems to have the same HEAD as
> > the github repo you pointed out. Seems the above is coming from pahole's
> > __die__process_tag() bailing out with default for DW_TAG_label?
> > 
> > On my side worked fine:
> 
> hum, I also had to change the version of pahole in the patch to allow
> version v1.12, because both latest pahole sources are on version 1.12,
> did u have to do that? looks like there's v1.13 somewhere ;-)

I'll get the --reorganize algorithm simplified to cope with some
internal changes needed for the BTF encoding/decoding and tag v1.13
later today, max late this week. Then I'll go back adding the bitfield
reorganization bits that will take a bit more work.

Hopefully this way we get something to work with the Kbuild changes and
have progress in that front.

I'll look at the DW_TAG_label case too, please send me me in PVT the
vmlinux file with that problem so that I can analyse it.
 
> jirka
> 
> SNIP
> 
> > 
> >   [0] https://git.kernel.org/pub/scm/devel/pahole/pahole.git/
Arnaldo Carvalho de Melo April 4, 2019, 12:40 a.m. UTC | #8
Em Wed, Apr 03, 2019 at 11:12:58AM +0200, Jiri Olsa escreveu:
> On Wed, Apr 03, 2019 at 11:04:28AM +0200, Daniel Borkmann wrote:
> > On 04/03/2019 10:46 AM, Jiri Olsa wrote:
> > > On Tue, Apr 02, 2019 at 09:49:50AM -0700, andrii.nakryiko@gmail.com wrote:
> > >> From: Andrii Nakryiko <andriin@fb.com>
> > >>
> > >> This patch adds new config option to trigger generation of BTF type
> > >> information from DWARF debuginfo for vmlinux and kernel modules through
> > >> pahole, which in turn relies on libbpf for btf_dedup() algorithm.
> > > I'm using the latest pahole from git tree:

> > >   https://github.com/acmel/dwarves.git

I've updated this oen as well, but the canonical one is at:

git://git.kernel.org/pub/scm/devel/pahole/pahole.git

See the fix below.

> > > and getting pahole crash:

> > >   LD      vmlinux
> > >   BTF     vmlinux
> > > die__process_inline_expansion: DW_TAG_label (0xa) @ <0x3eef8> not handled!
> > > scripts/link-vmlinux.sh: line 96: 31222 Segmentation fault      (core dumped) LLVM_OBJCOPY=${OBJCOPY} ${PAHOLE} -J ${1}
> > > make[1]: *** [/home/jolsa/linux/Makefile:1025: vmlinux] Error 139
> > > make: *** [Makefile:170: sub-make] Error 2

> > > is there some other source/dependency I'm missing?

> > Yesterday night, I've tested with [0] but seems to have the same HEAD as
> > the github repo you pointed out. Seems the above is coming from pahole's
> > __die__process_tag() bailing out with default for DW_TAG_label?

> > On my side worked fine:
 
> hum, I also had to change the version of pahole in the patch to allow
> version v1.12, because both latest pahole sources are on version 1.12,
> did u have to do that? looks like there's v1.13 somewhere ;-)

So, I've reproduced the problem and fixed it, please pull my latest
master branch from git://git.kernel.org/pub/scm/devel/pahole/pahole.git,
please do the hack to make it expect v1.12, I'll try and relase v1.13
soon, if nothing else pops up soon.

Thanks for the report!

- Arnaldo
Jiri Olsa April 4, 2019, 8:47 a.m. UTC | #9
On Wed, Apr 03, 2019 at 09:40:42PM -0300, Arnaldo Carvalho de Melo wrote:
> Em Wed, Apr 03, 2019 at 11:12:58AM +0200, Jiri Olsa escreveu:
> > On Wed, Apr 03, 2019 at 11:04:28AM +0200, Daniel Borkmann wrote:
> > > On 04/03/2019 10:46 AM, Jiri Olsa wrote:
> > > > On Tue, Apr 02, 2019 at 09:49:50AM -0700, andrii.nakryiko@gmail.com wrote:
> > > >> From: Andrii Nakryiko <andriin@fb.com>
> > > >>
> > > >> This patch adds new config option to trigger generation of BTF type
> > > >> information from DWARF debuginfo for vmlinux and kernel modules through
> > > >> pahole, which in turn relies on libbpf for btf_dedup() algorithm.
> > > > I'm using the latest pahole from git tree:
> 
> > > >   https://github.com/acmel/dwarves.git
> 
> I've updated this oen as well, but the canonical one is at:
> 
> git://git.kernel.org/pub/scm/devel/pahole/pahole.git
> 
> See the fix below.
> 
> > > > and getting pahole crash:
> 
> > > >   LD      vmlinux
> > > >   BTF     vmlinux
> > > > die__process_inline_expansion: DW_TAG_label (0xa) @ <0x3eef8> not handled!
> > > > scripts/link-vmlinux.sh: line 96: 31222 Segmentation fault      (core dumped) LLVM_OBJCOPY=${OBJCOPY} ${PAHOLE} -J ${1}
> > > > make[1]: *** [/home/jolsa/linux/Makefile:1025: vmlinux] Error 139
> > > > make: *** [Makefile:170: sub-make] Error 2
> 
> > > > is there some other source/dependency I'm missing?
> 
> > > Yesterday night, I've tested with [0] but seems to have the same HEAD as
> > > the github repo you pointed out. Seems the above is coming from pahole's
> > > __die__process_tag() bailing out with default for DW_TAG_label?
> 
> > > On my side worked fine:
>  
> > hum, I also had to change the version of pahole in the patch to allow
> > version v1.12, because both latest pahole sources are on version 1.12,
> > did u have to do that? looks like there's v1.13 somewhere ;-)
> 
> So, I've reproduced the problem and fixed it, please pull my latest
> master branch from git://git.kernel.org/pub/scm/devel/pahole/pahole.git,
> please do the hack to make it expect v1.12, I'll try and relase v1.13
> soon, if nothing else pops up soon.

  ...
  LD      vmlinux
  BTF     vmlinux
  SORTEX  vmlinux

works nicely now, thanks ;-)

jirka
diff mbox series

Patch

diff --git a/Makefile b/Makefile
index d5713e7b1e50..a55308147a09 100644
--- a/Makefile
+++ b/Makefile
@@ -387,6 +387,7 @@  NM		= $(CROSS_COMPILE)nm
 STRIP		= $(CROSS_COMPILE)strip
 OBJCOPY		= $(CROSS_COMPILE)objcopy
 OBJDUMP		= $(CROSS_COMPILE)objdump
+PAHOLE		= pahole
 LEX		= flex
 YACC		= bison
 AWK		= awk
@@ -442,7 +443,7 @@  KBUILD_LDFLAGS :=
 GCC_PLUGINS_CFLAGS :=
 
 export ARCH SRCARCH CONFIG_SHELL HOSTCC KBUILD_HOSTCFLAGS CROSS_COMPILE AS LD CC
-export CPP AR NM STRIP OBJCOPY OBJDUMP KBUILD_HOSTLDFLAGS KBUILD_HOSTLDLIBS
+export CPP AR NM STRIP OBJCOPY OBJDUMP PAHOLE KBUILD_HOSTLDFLAGS KBUILD_HOSTLDLIBS
 export MAKE LEX YACC AWK GENKSYMS INSTALLKERNEL PERL PYTHON PYTHON2 PYTHON3 UTS_MACHINE
 export HOSTCXX KBUILD_HOSTCXXFLAGS LDFLAGS_MODULE CHECK CHECKFLAGS
 
diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug
index d4df5b24d75e..cce78dcd19a2 100644
--- a/lib/Kconfig.debug
+++ b/lib/Kconfig.debug
@@ -200,6 +200,14 @@  config DEBUG_INFO_DWARF4
 	  But it significantly improves the success of resolving
 	  variables in gdb on optimized code.
 
+config DEBUG_INFO_BTF
+	bool "Generate BTF typeinfo"
+	depends on DEBUG_INFO
+	help
+	  Generate deduplicated BTF type information from DWARF debug info.
+	  Turning this on expects presence of pahole tool, which will convert
+	  DWARF type info into equivalent deduplicated BTF type info.
+
 config GDB_SCRIPTS
 	bool "Provide GDB scripts for kernel debugging"
 	depends on DEBUG_INFO
diff --git a/scripts/link-vmlinux.sh b/scripts/link-vmlinux.sh
index c8cf45362bd6..73bb7dfdc2c9 100755
--- a/scripts/link-vmlinux.sh
+++ b/scripts/link-vmlinux.sh
@@ -40,7 +40,7 @@  set -e
 info()
 {
 	if [ "${quiet}" != "silent_" ]; then
-		printf "  %-7s %s\n" ${1} ${2}
+		printf "  %-7s %s\n" "${1}" "${2}"
 	fi
 }
 
@@ -114,6 +114,20 @@  vmlinux_link()
 	fi
 }
 
+# generate .BTF typeinfo from DWARF debuginfo
+gen_btf()
+{
+	local pahole_ver;
+
+	pahole_ver=$(${PAHOLE} --version | sed -E 's/v([0-9]+)\.([0-9]+)/\1\2/')
+	if [ "${pahole_ver}" -lt "113" ]; then
+		info "BTF" "${1}: pahole version $(${PAHOLE} --version) is too old, need at least v1.13"
+		exit 0
+	fi
+
+	info "BTF" ${1}
+	LLVM_OBJCOPY=${OBJCOPY} ${PAHOLE} -J ${1}
+}
 
 # Create ${2} .o file with all symbols from the ${1} object file
 kallsyms()
@@ -281,6 +295,10 @@  fi
 info LD vmlinux
 vmlinux_link "${kallsymso}" vmlinux
 
+if [ -n "${CONFIG_DEBUG_INFO_BTF}" ]; then
+	gen_btf vmlinux
+fi
+
 if [ -n "${CONFIG_BUILDTIME_EXTABLE_SORT}" ]; then
 	info SORTEX vmlinux
 	sortextable vmlinux