From e5fbc21bea88e345c08e1e99dde255fa7dfc4201 Mon Sep 17 00:00:00 2001 From: Federico Di Pierro Date: Thu, 6 Jul 2023 11:53:16 +0200 Subject: [PATCH 1/2] fix(pkg/driverbuilder): fixed bpf probe build for new libs. Signed-off-by: Federico Di Pierro --- pkg/driverbuilder/builder/build.go | 8 + pkg/driverbuilder/builder/builders.go | 4 +- pkg/driverbuilder/builder/templates/alinux.sh | 4 +- .../builder/templates/almalinux.sh | 4 +- .../builder/templates/amazonlinux.sh | 5 +- .../builder/templates/archlinux.sh | 4 +- pkg/driverbuilder/builder/templates/centos.sh | 4 +- pkg/driverbuilder/builder/templates/debian.sh | 4 +- pkg/driverbuilder/builder/templates/fedora.sh | 4 +- .../builder/templates/flatcar.sh | 4 +- .../builder/templates/opensuse.sh | 4 +- pkg/driverbuilder/builder/templates/oracle.sh | 4 +- .../builder/templates/photonos.sh | 8 +- pkg/driverbuilder/builder/templates/redhat.sh | 4 +- pkg/driverbuilder/builder/templates/rocky.sh | 4 +- pkg/driverbuilder/builder/templates/ubuntu.sh | 4 +- .../builder/templates/vanilla.sh | 4 +- pkg/driverbuilder/docker.go | 25 ++-- pkg/driverbuilder/kubernetes.go | 25 ++-- pkg/driverbuilder/templates.go | 139 ++++++++++++++++-- 20 files changed, 214 insertions(+), 52 deletions(-) diff --git a/pkg/driverbuilder/builder/build.go b/pkg/driverbuilder/builder/build.go index bca33429..7250612d 100644 --- a/pkg/driverbuilder/builder/build.go +++ b/pkg/driverbuilder/builder/build.go @@ -92,3 +92,11 @@ func (b *Build) ClientForRegistry(registry string) *auth.Client { return client } + +func (b *Build) BuildModule() bool { + return len(b.ModuleFilePath) > 0 +} + +func (b *Build) BuildProbe() bool { + return len(b.ProbeFilePath) > 0 +} diff --git a/pkg/driverbuilder/builder/builders.go b/pkg/driverbuilder/builder/builders.go index c397825c..08269b92 100644 --- a/pkg/driverbuilder/builder/builders.go +++ b/pkg/driverbuilder/builder/builders.go @@ -251,8 +251,8 @@ func (c Config) toTemplateData(b Builder, kr kernelrelease.KernelRelease) common ModuleDownloadURL: fmt.Sprintf("%s/%s.tar.gz", c.DownloadBaseURL, c.DriverVersion), ModuleDriverName: c.DriverName, ModuleFullPath: ModuleFullPath, - BuildModule: len(c.ModuleFilePath) > 0, - BuildProbe: len(c.ProbeFilePath) > 0, + BuildModule: c.BuildModule(), + BuildProbe: c.BuildProbe(), GCCVersion: c.GCCVersion, } } diff --git a/pkg/driverbuilder/builder/templates/alinux.sh b/pkg/driverbuilder/builder/templates/alinux.sh index d6b06946..11801192 100644 --- a/pkg/driverbuilder/builder/templates/alinux.sh +++ b/pkg/driverbuilder/builder/templates/alinux.sh @@ -9,7 +9,6 @@ mkdir -p /tmp/module-download curl --silent -SL {{ .ModuleDownloadURL }} | tar -xzf - -C /tmp/module-download mv /tmp/module-download/*/driver/* {{ .DriverBuildDir }} -cp /driverkit/module-Makefile {{ .DriverBuildDir }}/Makefile bash /driverkit/fill-driver-config.sh {{ .DriverBuildDir }} # Fetch the kernel @@ -23,6 +22,7 @@ mv usr/src/kernels/*/* /tmp/kernel {{ if .BuildModule }} # Build the module +cp /driverkit/module-Makefile {{ .DriverBuildDir }}/Makefile cd {{ .DriverBuildDir }} make CC=/usr/bin/gcc-{{ .GCCVersion }} KERNELDIR=/tmp/kernel mv {{ .ModuleDriverName }}.ko {{ .ModuleFullPath }} @@ -33,7 +33,9 @@ modinfo {{ .ModuleFullPath }} {{ if .BuildProbe }} # Build the eBPF probe +cp /driverkit/bpf-Makefile {{ .DriverBuildDir }}/bpf/Makefile cd {{ .DriverBuildDir }}/bpf +ln -s ../*{.c,.h} . make KERNELDIR=/tmp/kernel ls -l probe.o {{ end }} \ No newline at end of file diff --git a/pkg/driverbuilder/builder/templates/almalinux.sh b/pkg/driverbuilder/builder/templates/almalinux.sh index d6b06946..11801192 100644 --- a/pkg/driverbuilder/builder/templates/almalinux.sh +++ b/pkg/driverbuilder/builder/templates/almalinux.sh @@ -9,7 +9,6 @@ mkdir -p /tmp/module-download curl --silent -SL {{ .ModuleDownloadURL }} | tar -xzf - -C /tmp/module-download mv /tmp/module-download/*/driver/* {{ .DriverBuildDir }} -cp /driverkit/module-Makefile {{ .DriverBuildDir }}/Makefile bash /driverkit/fill-driver-config.sh {{ .DriverBuildDir }} # Fetch the kernel @@ -23,6 +22,7 @@ mv usr/src/kernels/*/* /tmp/kernel {{ if .BuildModule }} # Build the module +cp /driverkit/module-Makefile {{ .DriverBuildDir }}/Makefile cd {{ .DriverBuildDir }} make CC=/usr/bin/gcc-{{ .GCCVersion }} KERNELDIR=/tmp/kernel mv {{ .ModuleDriverName }}.ko {{ .ModuleFullPath }} @@ -33,7 +33,9 @@ modinfo {{ .ModuleFullPath }} {{ if .BuildProbe }} # Build the eBPF probe +cp /driverkit/bpf-Makefile {{ .DriverBuildDir }}/bpf/Makefile cd {{ .DriverBuildDir }}/bpf +ln -s ../*{.c,.h} . make KERNELDIR=/tmp/kernel ls -l probe.o {{ end }} \ No newline at end of file diff --git a/pkg/driverbuilder/builder/templates/amazonlinux.sh b/pkg/driverbuilder/builder/templates/amazonlinux.sh index 675c466c..e860965f 100644 --- a/pkg/driverbuilder/builder/templates/amazonlinux.sh +++ b/pkg/driverbuilder/builder/templates/amazonlinux.sh @@ -9,7 +9,6 @@ mkdir -p /tmp/module-download curl --silent -SL {{ .ModuleDownloadURL }} | tar -xzf - -C /tmp/module-download mv /tmp/module-download/*/driver/* {{ .DriverBuildDir }} -cp /driverkit/module-Makefile {{ .DriverBuildDir }}/Makefile bash /driverkit/fill-driver-config.sh {{ .DriverBuildDir }} # Fetch the kernel @@ -26,8 +25,8 @@ mv usr/src/kernels/*/* /tmp/kernel {{ if .BuildModule }} # Build the kernel module +cp /driverkit/module-Makefile {{ .DriverBuildDir }}/Makefile cd {{ .DriverBuildDir }} - make KERNELDIR=/tmp/kernel CC=/usr/bin/gcc-{{ .GCCVersion }} LD=/usr/bin/ld.bfd CROSS_COMPILE="" mv {{ .ModuleDriverName }}.ko {{ .ModuleFullPath }} # Print results @@ -36,7 +35,9 @@ modinfo {{ .ModuleFullPath }} {{ if .BuildProbe }} # Build the eBPF probe +cp /driverkit/bpf-Makefile {{ .DriverBuildDir }}/bpf/Makefile cd {{ .DriverBuildDir }}/bpf +ln -s ../*{.c,.h} . make KERNELDIR=/tmp/kernel ls -l probe.o {{ end }} \ No newline at end of file diff --git a/pkg/driverbuilder/builder/templates/archlinux.sh b/pkg/driverbuilder/builder/templates/archlinux.sh index b0803961..ac5471b5 100644 --- a/pkg/driverbuilder/builder/templates/archlinux.sh +++ b/pkg/driverbuilder/builder/templates/archlinux.sh @@ -9,7 +9,6 @@ mkdir -p /tmp/module-download curl --silent -SL {{ .ModuleDownloadURL }} | tar -xzf - -C /tmp/module-download mv /tmp/module-download/*/driver/* {{ .DriverBuildDir }} -cp /driverkit/module-Makefile {{ .DriverBuildDir }}/Makefile bash /driverkit/fill-driver-config.sh {{ .DriverBuildDir }} # Fetch the kernel @@ -23,6 +22,7 @@ mv usr/lib/modules/*/build/* /tmp/kernel {{ if .BuildModule }} # Build the module +cp /driverkit/module-Makefile {{ .DriverBuildDir }}/Makefile cd {{ .DriverBuildDir }} make CC=/usr/bin/gcc-{{ .GCCVersion }} KERNELDIR=/tmp/kernel mv {{ .ModuleDriverName }}.ko {{ .ModuleFullPath }} @@ -33,7 +33,9 @@ modinfo {{ .ModuleFullPath }} {{ if .BuildProbe }} # Build the eBPF probe +cp /driverkit/bpf-Makefile {{ .DriverBuildDir }}/bpf/Makefile cd {{ .DriverBuildDir }}/bpf +ln -s ../*{.c,.h} . make KERNELDIR=/tmp/kernel ls -l probe.o {{ end }} \ No newline at end of file diff --git a/pkg/driverbuilder/builder/templates/centos.sh b/pkg/driverbuilder/builder/templates/centos.sh index d6b06946..11801192 100644 --- a/pkg/driverbuilder/builder/templates/centos.sh +++ b/pkg/driverbuilder/builder/templates/centos.sh @@ -9,7 +9,6 @@ mkdir -p /tmp/module-download curl --silent -SL {{ .ModuleDownloadURL }} | tar -xzf - -C /tmp/module-download mv /tmp/module-download/*/driver/* {{ .DriverBuildDir }} -cp /driverkit/module-Makefile {{ .DriverBuildDir }}/Makefile bash /driverkit/fill-driver-config.sh {{ .DriverBuildDir }} # Fetch the kernel @@ -23,6 +22,7 @@ mv usr/src/kernels/*/* /tmp/kernel {{ if .BuildModule }} # Build the module +cp /driverkit/module-Makefile {{ .DriverBuildDir }}/Makefile cd {{ .DriverBuildDir }} make CC=/usr/bin/gcc-{{ .GCCVersion }} KERNELDIR=/tmp/kernel mv {{ .ModuleDriverName }}.ko {{ .ModuleFullPath }} @@ -33,7 +33,9 @@ modinfo {{ .ModuleFullPath }} {{ if .BuildProbe }} # Build the eBPF probe +cp /driverkit/bpf-Makefile {{ .DriverBuildDir }}/bpf/Makefile cd {{ .DriverBuildDir }}/bpf +ln -s ../*{.c,.h} . make KERNELDIR=/tmp/kernel ls -l probe.o {{ end }} \ No newline at end of file diff --git a/pkg/driverbuilder/builder/templates/debian.sh b/pkg/driverbuilder/builder/templates/debian.sh index 8c3fa091..2fcf1b6f 100644 --- a/pkg/driverbuilder/builder/templates/debian.sh +++ b/pkg/driverbuilder/builder/templates/debian.sh @@ -9,7 +9,6 @@ mkdir -p /tmp/module-download curl --silent -SL {{ .ModuleDownloadURL }} | tar -xzf - -C /tmp/module-download mv /tmp/module-download/*/driver/* {{ .DriverBuildDir }} -cp /driverkit/module-Makefile {{ .DriverBuildDir }}/Makefile bash /driverkit/fill-driver-config.sh {{ .DriverBuildDir }} # Fetch the kernel @@ -31,6 +30,7 @@ sourcedir=$(find . -type d -name "{{ .KernelHeadersPattern }}" | head -n 1 | xar {{ if .BuildModule }} # Build the module +cp /driverkit/module-Makefile {{ .DriverBuildDir }}/Makefile cd {{ .DriverBuildDir }} make CC=/usr/bin/gcc-{{ .GCCVersion }} KERNELDIR=$sourcedir mv {{ .ModuleDriverName }}.ko {{ .ModuleFullPath }} @@ -41,7 +41,9 @@ modinfo {{ .ModuleFullPath }} {{ if .BuildProbe }} # Build the eBPF probe +cp /driverkit/bpf-Makefile {{ .DriverBuildDir }}/bpf/Makefile cd {{ .DriverBuildDir }}/bpf +ln -s ../*{.c,.h} . make KERNELDIR=$sourcedir ls -l probe.o {{ end }} \ No newline at end of file diff --git a/pkg/driverbuilder/builder/templates/fedora.sh b/pkg/driverbuilder/builder/templates/fedora.sh index d6b06946..11801192 100644 --- a/pkg/driverbuilder/builder/templates/fedora.sh +++ b/pkg/driverbuilder/builder/templates/fedora.sh @@ -9,7 +9,6 @@ mkdir -p /tmp/module-download curl --silent -SL {{ .ModuleDownloadURL }} | tar -xzf - -C /tmp/module-download mv /tmp/module-download/*/driver/* {{ .DriverBuildDir }} -cp /driverkit/module-Makefile {{ .DriverBuildDir }}/Makefile bash /driverkit/fill-driver-config.sh {{ .DriverBuildDir }} # Fetch the kernel @@ -23,6 +22,7 @@ mv usr/src/kernels/*/* /tmp/kernel {{ if .BuildModule }} # Build the module +cp /driverkit/module-Makefile {{ .DriverBuildDir }}/Makefile cd {{ .DriverBuildDir }} make CC=/usr/bin/gcc-{{ .GCCVersion }} KERNELDIR=/tmp/kernel mv {{ .ModuleDriverName }}.ko {{ .ModuleFullPath }} @@ -33,7 +33,9 @@ modinfo {{ .ModuleFullPath }} {{ if .BuildProbe }} # Build the eBPF probe +cp /driverkit/bpf-Makefile {{ .DriverBuildDir }}/bpf/Makefile cd {{ .DriverBuildDir }}/bpf +ln -s ../*{.c,.h} . make KERNELDIR=/tmp/kernel ls -l probe.o {{ end }} \ No newline at end of file diff --git a/pkg/driverbuilder/builder/templates/flatcar.sh b/pkg/driverbuilder/builder/templates/flatcar.sh index 9a18ed04..a4f3153a 100644 --- a/pkg/driverbuilder/builder/templates/flatcar.sh +++ b/pkg/driverbuilder/builder/templates/flatcar.sh @@ -9,7 +9,6 @@ mkdir -p /tmp/module-download curl --silent -SL {{ .ModuleDownloadURL }} | tar -xzf - -C /tmp/module-download mv /tmp/module-download/*/driver/* {{ .DriverBuildDir }} -cp /driverkit/module-Makefile {{ .DriverBuildDir }}/Makefile bash /driverkit/fill-driver-config.sh {{ .DriverBuildDir }} # Fetch the kernel @@ -30,6 +29,7 @@ make KCONFIG_CONFIG=/tmp/kernel.config modules_prepare {{ if .BuildModule }} # Build the module +cp /driverkit/module-Makefile {{ .DriverBuildDir }}/Makefile cd {{ .DriverBuildDir }} make CC=/usr/bin/gcc-{{ .GCCVersion }} KERNELDIR=/tmp/kernel mv {{ .ModuleDriverName }}.ko {{ .ModuleFullPath }} @@ -40,7 +40,9 @@ modinfo {{ .ModuleFullPath }} {{ if .BuildProbe }} # Build the eBPF probe +cp /driverkit/bpf-Makefile {{ .DriverBuildDir }}/bpf/Makefile cd {{ .DriverBuildDir }}/bpf +ln -s ../*{.c,.h} . make KERNELDIR=/tmp/kernel ls -l probe.o {{ end }} \ No newline at end of file diff --git a/pkg/driverbuilder/builder/templates/opensuse.sh b/pkg/driverbuilder/builder/templates/opensuse.sh index fad85ad4..f5fc76f8 100644 --- a/pkg/driverbuilder/builder/templates/opensuse.sh +++ b/pkg/driverbuilder/builder/templates/opensuse.sh @@ -9,7 +9,6 @@ mkdir -p /tmp/module-download curl --silent -SL {{ .ModuleDownloadURL }} | tar -xzf - -C /tmp/module-download mv /tmp/module-download/*/driver/* {{ .DriverBuildDir }} -cp /driverkit/module-Makefile {{ .DriverBuildDir }}/Makefile bash /driverkit/fill-driver-config.sh {{ .DriverBuildDir }} # Fetch the kernel @@ -26,6 +25,7 @@ sourcedir="$(find . -type d -name "linux-*-obj" | head -n 1 | xargs readlink -f) {{ if .BuildModule }} # Build the module +cp /driverkit/module-Makefile {{ .DriverBuildDir }}/Makefile cd {{ .DriverBuildDir }} make CC=/usr/bin/gcc-{{ .GCCVersion }} KERNELDIR=$sourcedir mv {{ .ModuleDriverName }}.ko {{ .ModuleFullPath }} @@ -36,7 +36,9 @@ modinfo {{ .ModuleFullPath }} {{ if .BuildProbe }} # Build the eBPF probe +cp /driverkit/bpf-Makefile {{ .DriverBuildDir }}/bpf/Makefile cd {{ .DriverBuildDir }}/bpf +ln -s ../*{.c,.h} . make KERNELDIR=/tmp/kernel ls -l probe.o {{ end }} \ No newline at end of file diff --git a/pkg/driverbuilder/builder/templates/oracle.sh b/pkg/driverbuilder/builder/templates/oracle.sh index d6b06946..11801192 100644 --- a/pkg/driverbuilder/builder/templates/oracle.sh +++ b/pkg/driverbuilder/builder/templates/oracle.sh @@ -9,7 +9,6 @@ mkdir -p /tmp/module-download curl --silent -SL {{ .ModuleDownloadURL }} | tar -xzf - -C /tmp/module-download mv /tmp/module-download/*/driver/* {{ .DriverBuildDir }} -cp /driverkit/module-Makefile {{ .DriverBuildDir }}/Makefile bash /driverkit/fill-driver-config.sh {{ .DriverBuildDir }} # Fetch the kernel @@ -23,6 +22,7 @@ mv usr/src/kernels/*/* /tmp/kernel {{ if .BuildModule }} # Build the module +cp /driverkit/module-Makefile {{ .DriverBuildDir }}/Makefile cd {{ .DriverBuildDir }} make CC=/usr/bin/gcc-{{ .GCCVersion }} KERNELDIR=/tmp/kernel mv {{ .ModuleDriverName }}.ko {{ .ModuleFullPath }} @@ -33,7 +33,9 @@ modinfo {{ .ModuleFullPath }} {{ if .BuildProbe }} # Build the eBPF probe +cp /driverkit/bpf-Makefile {{ .DriverBuildDir }}/bpf/Makefile cd {{ .DriverBuildDir }}/bpf +ln -s ../*{.c,.h} . make KERNELDIR=/tmp/kernel ls -l probe.o {{ end }} \ No newline at end of file diff --git a/pkg/driverbuilder/builder/templates/photonos.sh b/pkg/driverbuilder/builder/templates/photonos.sh index b653be68..b2e7e04d 100644 --- a/pkg/driverbuilder/builder/templates/photonos.sh +++ b/pkg/driverbuilder/builder/templates/photonos.sh @@ -9,7 +9,6 @@ mkdir -p /tmp/module-download curl --silent -SL {{ .ModuleDownloadURL }} | tar -xzf - -C /tmp/module-download mv /tmp/module-download/*/driver/* {{ .DriverBuildDir }} -cp /driverkit/module-Makefile {{ .DriverBuildDir }}/Makefile bash /driverkit/fill-driver-config.sh {{ .DriverBuildDir }} # Fetch the kernel @@ -22,20 +21,21 @@ mkdir -p /tmp/kernel mv usr/src/linux-headers-*/* /tmp/kernel {{ if .BuildModule }} - # Build the module +cp /driverkit/module-Makefile {{ .DriverBuildDir }}/Makefile cd {{ .DriverBuildDir }} make CC=/usr/bin/gcc-{{ .GCCVersion }} KERNELDIR=/tmp/kernel mv {{ .ModuleDriverName }}.ko {{ .ModuleFullPath }} strip -g {{ .ModuleFullPath }} - # Print results modinfo {{ .ModuleFullPath }} {{ end }} -{{ if .BuildProbe }} +{{ if .BuildProbe }} # Build the eBPF probe +cp /driverkit/bpf-Makefile {{ .DriverBuildDir }}/bpf/Makefile cd {{ .DriverBuildDir }}/bpf +ln -s ../*{.c,.h} . make KERNELDIR=/tmp/kernel ls -l probe.o {{ end }} \ No newline at end of file diff --git a/pkg/driverbuilder/builder/templates/redhat.sh b/pkg/driverbuilder/builder/templates/redhat.sh index 668a71d8..314e364e 100644 --- a/pkg/driverbuilder/builder/templates/redhat.sh +++ b/pkg/driverbuilder/builder/templates/redhat.sh @@ -9,7 +9,6 @@ mkdir -p /tmp/module-download curl --silent -SL {{ .ModuleDownloadURL }} | tar -xzf - -C /tmp/module-download mv /tmp/module-download/*/driver/* {{ .DriverBuildDir }} -cp /driverkit/module-Makefile {{ .DriverBuildDir }}/Makefile bash /driverkit/fill-driver-config.sh {{ .DriverBuildDir }} # Fetch the kernel @@ -25,6 +24,7 @@ mv usr/src/kernels/*/* /tmp/kernel {{ if .BuildModule }} # Build the module +cp /driverkit/module-Makefile {{ .DriverBuildDir }}/Makefile cd {{ .DriverBuildDir }} make CC=/usr/bin/gcc-{{ .GCCVersion }} KERNELDIR=/tmp/kernel mv {{ .ModuleDriverName }}.ko {{ .ModuleFullPath }} @@ -35,7 +35,9 @@ modinfo {{ .ModuleFullPath }} {{ if .BuildProbe }} # Build the eBPF probe +cp /driverkit/bpf-Makefile {{ .DriverBuildDir }}/bpf/Makefile cd {{ .DriverBuildDir }}/bpf +ln -s ../*{.c,.h} . make KERNELDIR=/tmp/kernel ls -l probe.o {{ end }} \ No newline at end of file diff --git a/pkg/driverbuilder/builder/templates/rocky.sh b/pkg/driverbuilder/builder/templates/rocky.sh index d6b06946..11801192 100644 --- a/pkg/driverbuilder/builder/templates/rocky.sh +++ b/pkg/driverbuilder/builder/templates/rocky.sh @@ -9,7 +9,6 @@ mkdir -p /tmp/module-download curl --silent -SL {{ .ModuleDownloadURL }} | tar -xzf - -C /tmp/module-download mv /tmp/module-download/*/driver/* {{ .DriverBuildDir }} -cp /driverkit/module-Makefile {{ .DriverBuildDir }}/Makefile bash /driverkit/fill-driver-config.sh {{ .DriverBuildDir }} # Fetch the kernel @@ -23,6 +22,7 @@ mv usr/src/kernels/*/* /tmp/kernel {{ if .BuildModule }} # Build the module +cp /driverkit/module-Makefile {{ .DriverBuildDir }}/Makefile cd {{ .DriverBuildDir }} make CC=/usr/bin/gcc-{{ .GCCVersion }} KERNELDIR=/tmp/kernel mv {{ .ModuleDriverName }}.ko {{ .ModuleFullPath }} @@ -33,7 +33,9 @@ modinfo {{ .ModuleFullPath }} {{ if .BuildProbe }} # Build the eBPF probe +cp /driverkit/bpf-Makefile {{ .DriverBuildDir }}/bpf/Makefile cd {{ .DriverBuildDir }}/bpf +ln -s ../*{.c,.h} . make KERNELDIR=/tmp/kernel ls -l probe.o {{ end }} \ No newline at end of file diff --git a/pkg/driverbuilder/builder/templates/ubuntu.sh b/pkg/driverbuilder/builder/templates/ubuntu.sh index 5a3a77fc..d6906718 100644 --- a/pkg/driverbuilder/builder/templates/ubuntu.sh +++ b/pkg/driverbuilder/builder/templates/ubuntu.sh @@ -9,7 +9,6 @@ mkdir -p /tmp/module-download curl --silent -SL {{ .ModuleDownloadURL }} | tar -xzf - -C /tmp/module-download mv /tmp/module-download/*/driver/* {{ .DriverBuildDir }} -cp /driverkit/module-Makefile {{ .DriverBuildDir }}/Makefile bash /driverkit/fill-driver-config.sh {{ .DriverBuildDir }} # Fetch the kernel @@ -27,6 +26,7 @@ sourcedir=$(find . -type d -name "{{ .KernelHeadersPattern }}" | head -n 1 | xar {{ if .BuildModule }} # Build the module +cp /driverkit/module-Makefile {{ .DriverBuildDir }}/Makefile cd {{ .DriverBuildDir }} make CC=/usr/bin/gcc-{{ .GCCVersion }} KERNELDIR=$sourcedir mv {{ .ModuleDriverName }}.ko {{ .ModuleFullPath }} @@ -37,7 +37,9 @@ modinfo {{ .ModuleFullPath }} {{ if .BuildProbe }} # Build the eBPF probe +cp /driverkit/bpf-Makefile {{ .DriverBuildDir }}/bpf/Makefile cd {{ .DriverBuildDir }}/bpf +ln -s ../*{.c,.h} . make KERNELDIR=$sourcedir ls -l probe.o {{ end }} diff --git a/pkg/driverbuilder/builder/templates/vanilla.sh b/pkg/driverbuilder/builder/templates/vanilla.sh index e8b13388..1cfdbd15 100644 --- a/pkg/driverbuilder/builder/templates/vanilla.sh +++ b/pkg/driverbuilder/builder/templates/vanilla.sh @@ -9,7 +9,6 @@ mkdir -p /tmp/module-download curl --silent -SL {{ .ModuleDownloadURL }} | tar -xzf - -C /tmp/module-download mv /tmp/module-download/*/driver/* {{ .DriverBuildDir }} -cp /driverkit/module-Makefile {{ .DriverBuildDir }}/Makefile bash /driverkit/fill-driver-config.sh {{ .DriverBuildDir }} # Fetch the kernel @@ -40,6 +39,7 @@ export KBUILD_MODPOST_WARN=1 {{ if .BuildModule }} # Build the kernel module +cp /driverkit/module-Makefile {{ .DriverBuildDir }}/Makefile cd {{ .DriverBuildDir }} make CC=/usr/bin/gcc-{{ .GCCVersion }} KERNELDIR=/tmp/kernel mv {{ .ModuleDriverName }}.ko {{ .ModuleFullPath }} @@ -50,7 +50,9 @@ modinfo {{ .ModuleFullPath }} {{ if .BuildProbe }} # Build the eBPF probe +cp /driverkit/bpf-Makefile {{ .DriverBuildDir }}/bpf/Makefile cd {{ .DriverBuildDir }}/bpf +ln -s ../*{.c,.h} . make KERNELDIR=/tmp/kernel ls -l probe.o {{ end }} diff --git a/pkg/driverbuilder/docker.go b/pkg/driverbuilder/docker.go index 36238a3f..d2dbc859 100644 --- a/pkg/driverbuilder/docker.go +++ b/pkg/driverbuilder/docker.go @@ -133,15 +133,21 @@ func (bp *DockerBuildProcessor) Start(b *builder.Build) error { return err } - // Prepare makefile template - objList, err := LoadMakefileObjList(c) - if err != nil { - return err + // Prepare makefiles templates + bufKmodMakefile := bytes.NewBuffer(nil) + if c.BuildModule() { + err = LoadKmodMakefile(bufKmodMakefile, c) + if err != nil { + return err + } } - bufMakefile := bytes.NewBuffer(nil) - err = renderMakefile(bufMakefile, makefileData{ModuleName: c.DriverName, ModuleBuildDir: builder.DriverDirectory, MakeObjList: objList}) - if err != nil { - return err + + bufBpfMakefile := bytes.NewBuffer(nil) + if c.BuildProbe() { + err = LoadBpfMakefile(bufBpfMakefile, c) + if err != nil { + return err + } } configDecoded, err := base64.StdEncoding.DecodeString(b.KernelConfigData) @@ -217,7 +223,8 @@ func (bp *DockerBuildProcessor) Start(b *builder.Build) error { files := []dockerCopyFile{ {"/driverkit/driverkit.sh", driverkitScript}, {"/driverkit/kernel.config", string(configDecoded)}, - {"/driverkit/module-Makefile", bufMakefile.String()}, + {"/driverkit/module-Makefile", bufKmodMakefile.String()}, + {"/driverkit/bpf-Makefile", bufBpfMakefile.String()}, {"/driverkit/fill-driver-config.sh", bufFillDriverConfig.String()}, } diff --git a/pkg/driverbuilder/kubernetes.go b/pkg/driverbuilder/kubernetes.go index bb925f9b..450cef1f 100644 --- a/pkg/driverbuilder/kubernetes.go +++ b/pkg/driverbuilder/kubernetes.go @@ -121,15 +121,21 @@ func (bp *KubernetesBuildProcessor) buildModule(b *builder.Build) error { return err } - // Prepare makefile template - objList, err := LoadMakefileObjList(c) - if err != nil { - return err + // Prepare makefiles templates + bufKmodMakefile := bytes.NewBuffer(nil) + if c.BuildModule() { + err = LoadKmodMakefile(bufKmodMakefile, c) + if err != nil { + return err + } } - bufMakefile := bytes.NewBuffer(nil) - err = renderMakefile(bufMakefile, makefileData{ModuleName: c.DriverName, ModuleBuildDir: builder.DriverDirectory, MakeObjList: objList}) - if err != nil { - return err + + bufBpfMakefile := bytes.NewBuffer(nil) + if c.BuildProbe() { + err = LoadBpfMakefile(bufBpfMakefile, c) + if err != nil { + return err + } } configDecoded, err := base64.StdEncoding.DecodeString(b.KernelConfigData) @@ -142,7 +148,8 @@ func (bp *KubernetesBuildProcessor) buildModule(b *builder.Build) error { Data: map[string]string{ "driverkit.sh": res, "kernel.config": string(configDecoded), - "module-Makefile": bufMakefile.String(), + "module-Makefile": bufKmodMakefile.String(), + "bpf-Makefile": bufBpfMakefile.String(), "fill-driver-config.sh": bufFillDriverConfig.String(), "downloader.sh": waitForLockAndCat, "unlock.sh": deleteLock, diff --git a/pkg/driverbuilder/templates.go b/pkg/driverbuilder/templates.go index d34304f5..549343c0 100644 --- a/pkg/driverbuilder/templates.go +++ b/pkg/driverbuilder/templates.go @@ -1,6 +1,7 @@ package driverbuilder import ( + "bytes" "fmt" "io" "net/http" @@ -43,13 +44,13 @@ done cat "$1" ` -type makefileData struct { +type makefileKmodData struct { ModuleName string ModuleBuildDir string MakeObjList string } -const makefileTemplate = ` +const makefileKmodTemplate = ` {{ .ModuleName }}-y += {{ .MakeObjList }} obj-m += {{ .ModuleName }}.o KERNELDIR ?= /lib/modules/$(shell uname -r)/build @@ -64,24 +65,26 @@ install: all make -C $(KERNELDIR) M={{ .ModuleBuildDir }} modules_install ` -func renderMakefile(w io.Writer, md makefileData) error { - t := template.New("makefile") - t, _ = t.Parse(makefileTemplate) +func renderKmodMakefile(w io.Writer, md makefileKmodData) error { + t := template.New("kmod-makefile") + t, _ = t.Parse(makefileKmodTemplate) return t.Execute(w, md) } -func LoadMakefileObjList(c builder.Config) (string, error) { - makefileUrl := fmt.Sprintf("https://raw.githubusercontent.com/%s/%s/%s/driver/Makefile.in", c.RepoOrg, c.RepoName, c.DriverVersion) - resp, err := http.Get(makefileUrl) +func LoadKmodMakefile(buffer *bytes.Buffer, c builder.Config) error { + objList, err := loadKmodMakefileObjList(c) if err != nil { - return "", err + return err } - defer resp.Body.Close() - parsedMakefile, err := io.ReadAll(resp.Body) + return renderKmodMakefile(buffer, makefileKmodData{ModuleName: c.DriverName, ModuleBuildDir: builder.DriverDirectory, MakeObjList: objList}) +} + +func loadKmodMakefileObjList(c builder.Config) (string, error) { + parsedMakefile, err := downloadFile(fmt.Sprintf("https://raw.githubusercontent.com/%s/%s/%s/driver/Makefile.in", c.RepoOrg, c.RepoName, c.DriverVersion)) if err != nil { return "", err } - lines := strings.Split(string(parsedMakefile), "\n") + lines := strings.Split(parsedMakefile, "\n") for _, l := range lines { if strings.HasPrefix(l, "@DRIVER_NAME@-y +=") { return strings.Split(l, "@DRIVER_NAME@-y += ")[1], nil @@ -90,7 +93,101 @@ func LoadMakefileObjList(c builder.Config) (string, error) { return strings.Split(l, "@PROBE_NAME@-y += ")[1], nil } } - return "", fmt.Errorf("obj list not found") + return "", fmt.Errorf("kmod obj list not found") +} + +type makefileBpfData struct { + MakeObjList string +} + +const makefileBpfTemplate = ` +always-y += probe.o +always = $(always-y) + +LLC ?= llc +CLANG ?= clang + +KERNELDIR ?= /lib/modules/$(shell uname -r)/build + +NEEDS_COS_73_WORKAROUND = $(shell expr ` + "`" + `grep -sc "^\s*struct\s\+audit_task_info\s\+\*audit;\s*$$" $(KERNELDIR)/include/linux/sched.h` + "`" + ` = 1) +ifeq ($(NEEDS_COS_73_WORKAROUND), 1) + KBUILD_CPPFLAGS += -DCOS_73_WORKAROUND +endif + +IS_CLANG_OLDER_THAN_10 := $(shell expr ` + "`$(CLANG) -dumpversion | cut -f1 -d.`" + ` \<= 10) +ifeq ($(IS_CLANG_OLDER_THAN_10), 1) + KBUILD_CPPFLAGS := $(filter-out -fmacro-prefix-map=%,$(KBUILD_CPPFLAGS)) +endif + +all: + make -C $(KERNELDIR) M=$$PWD + +clean: + make -C $(KERNELDIR) M=$$PWD clean + @rm -f *~ + +$(obj)/probe.o: {{ .MakeObjList }} + $(CLANG) $(LINUXINCLUDE) \ + $(KBUILD_CPPFLAGS) \ + $(KBUILD_EXTRA_CPPFLAGS) \ + $(DEBUG) \ + -I.. \ + -D__KERNEL__ \ + -D__BPF_TRACING__ \ + -Wno-gnu-variable-sized-type-not-at-end \ + -Wno-address-of-packed-member \ + -fno-jump-tables \ + -fno-stack-protector \ + -Wno-tautological-compare \ + -O2 -g -emit-llvm -c $< -o $(patsubst %.o,%.ll,$@) + $(LLC) -march=bpf -filetype=obj -o $@ $(patsubst %.o,%.ll,$@) +` + +func renderBpfMakefile(w io.Writer, md makefileBpfData) error { + t := template.New("bpf-makefile") + t, _ = t.Parse(makefileBpfTemplate) + return t.Execute(w, md) +} + +func LoadBpfMakefile(buffer *bytes.Buffer, c builder.Config) error { + bpfMakefile, err := downloadFile(fmt.Sprintf("https://raw.githubusercontent.com/%s/%s/%s/driver/bpf/Makefile", c.RepoOrg, c.RepoName, c.DriverVersion)) + if err == nil { + // Existent bpf/Makefile! (old libs versions, pre https://github.com/falcosecurity/libs/pull/1188) + _, err = buffer.WriteString(bpfMakefile) + return err + } + objList, err := loadBpfMakefileObjList(c) + if err != nil { + return err + } + return renderBpfMakefile(buffer, makefileBpfData{MakeObjList: objList}) +} + +func loadBpfMakefileObjList(c builder.Config) (string, error) { + parsedCmakeLists, err := downloadFile(fmt.Sprintf("https://raw.githubusercontent.com/%s/%s/%s/driver/bpf/CMakeLists.txt", c.RepoOrg, c.RepoName, c.DriverVersion)) + if err != nil { + return "", err + } + lines := strings.Split(parsedCmakeLists, "\n") + startDeps := false + var deps string + for _, l := range lines { + l = strings.TrimSpace(l) + if strings.HasPrefix(l, "set(BPF_SOURCES") { + startDeps = true + } else if startDeps { + if l != ")" { + if !strings.Contains(l, "${") { + // skip sources that reference a cmake variable + deps += "$(src)/" + l + " " + } + } else { + deps += "$(src)/../driver_config.h" + return deps, nil + } + } + } + return "", fmt.Errorf("bpf obj list not found") } type driverConfigData struct { @@ -162,3 +259,19 @@ func renderFillDriverConfig(w io.Writer, dd driverConfigData) error { } return parsed.Execute(w, dd) } + +func downloadFile(url string) (string, error) { + resp, err := http.Get(url) + if err != nil { + return "", err + } + defer resp.Body.Close() + if resp.StatusCode != 200 { + return "", fmt.Errorf("non-200 response") + } + file, err := io.ReadAll(resp.Body) + if err != nil { + return "", err + } + return string(file), nil +} From 3fdcf8aae43f4814a34f54200d95ee3332d667a3 Mon Sep 17 00:00:00 2001 From: Federico Di Pierro Date: Thu, 6 Jul 2023 12:02:16 +0200 Subject: [PATCH 2/2] chore(pkg/driverbuilder): only copy kmod/bpf makefile if kmod/bpf build was requested. Signed-off-by: Federico Di Pierro --- pkg/driverbuilder/docker.go | 8 ++++++-- pkg/driverbuilder/kubernetes.go | 9 +++++++-- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/pkg/driverbuilder/docker.go b/pkg/driverbuilder/docker.go index d2dbc859..37708e55 100644 --- a/pkg/driverbuilder/docker.go +++ b/pkg/driverbuilder/docker.go @@ -223,10 +223,14 @@ func (bp *DockerBuildProcessor) Start(b *builder.Build) error { files := []dockerCopyFile{ {"/driverkit/driverkit.sh", driverkitScript}, {"/driverkit/kernel.config", string(configDecoded)}, - {"/driverkit/module-Makefile", bufKmodMakefile.String()}, - {"/driverkit/bpf-Makefile", bufBpfMakefile.String()}, {"/driverkit/fill-driver-config.sh", bufFillDriverConfig.String()}, } + if c.BuildModule() { + files = append(files, dockerCopyFile{"/driverkit/module-Makefile", bufKmodMakefile.String()}) + } + if c.BuildProbe() { + files = append(files, dockerCopyFile{"/driverkit/bpf-Makefile", bufBpfMakefile.String()}) + } var buf bytes.Buffer err = tarWriterFiles(&buf, files) diff --git a/pkg/driverbuilder/kubernetes.go b/pkg/driverbuilder/kubernetes.go index 450cef1f..ff424c99 100644 --- a/pkg/driverbuilder/kubernetes.go +++ b/pkg/driverbuilder/kubernetes.go @@ -148,13 +148,18 @@ func (bp *KubernetesBuildProcessor) buildModule(b *builder.Build) error { Data: map[string]string{ "driverkit.sh": res, "kernel.config": string(configDecoded), - "module-Makefile": bufKmodMakefile.String(), - "bpf-Makefile": bufBpfMakefile.String(), "fill-driver-config.sh": bufFillDriverConfig.String(), "downloader.sh": waitForLockAndCat, "unlock.sh": deleteLock, }, } + if c.BuildModule() { + cm.Data["module-Makefile"] = bufKmodMakefile.String() + } + if c.BuildProbe() { + cm.Data["bpf-Makefile"] = bufBpfMakefile.String() + } + // Construct environment variable array of corev1.EnvVar var envs []corev1.EnvVar // Add http_porxy and https_proxy environment variable