diff options
| author | Kris Alder <kalder@google.com> | 2022-04-29 15:24:59 -0700 |
|---|---|---|
| committer | Dmitry Vyukov <dvyukov@google.com> | 2022-05-06 08:59:20 +0200 |
| commit | abda9b1a98d331fa672f556e33f18df2eed424bd (patch) | |
| tree | 5671d162b54faf776af37409a20478037f56a914 /pkg/build/android.go | |
| parent | efeff0a5c583d6c8158481970f1b0dd581358d5a (diff) | |
pkg/build: build Android kernel and embed in Cuttlefish image
Android uses some config files (specified with the BUILD_CONFIG
environment variable) to configure kernel builds. KASan configurations
already exist.
We want to mount the image, install a new Cuttlefish emulator binary
(using fetch_cvd) and copy over the kernel that we've built.
Diffstat (limited to 'pkg/build/android.go')
| -rw-r--r-- | pkg/build/android.go | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/pkg/build/android.go b/pkg/build/android.go new file mode 100644 index 000000000..9fb38bd5c --- /dev/null +++ b/pkg/build/android.go @@ -0,0 +1,74 @@ +// Copyright 2022 syzkaller project authors. All rights reserved. +// Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file. + +package build + +import ( + "fmt" + "path/filepath" + "time" + + "github.com/google/syzkaller/pkg/osutil" +) + +const ( + kernelConfig = "common/build.config.gki_kasan.x86_64" + moduleConfig = "common-modules/virtual-device/build.config.virtual_device_kasan.x86_64" +) + +type android struct{} + +func (a android) runBuild(kernelDir, buildConfig string) error { + cmd := osutil.Command("build/build.sh") + cmd.Dir = kernelDir + cmd.Env = append(cmd.Env, "DIST_DIR=out/dist", fmt.Sprintf("BUILD_CONFIG=%s", buildConfig)) + + _, err := osutil.Run(time.Hour, cmd) + return err +} + +func (a android) build(params Params) (ImageDetails, error) { + var details ImageDetails + + if params.CmdlineFile != "" { + return details, fmt.Errorf("cmdline file is not supported for android cuttlefish images") + } + if params.SysctlFile != "" { + return details, fmt.Errorf("sysctl file is not supported for android cuttlefish images") + } + + if err := a.runBuild(params.KernelDir, kernelConfig); err != nil { + return details, fmt.Errorf("failed to build kernel: %s", err) + } + if err := a.runBuild(params.KernelDir, moduleConfig); err != nil { + return details, fmt.Errorf("failed to build modules: %s", err) + } + + buildOutDir := filepath.Join(params.KernelDir, "out/dist") + bzImage := filepath.Join(buildOutDir, "bzImage") + vmlinux := filepath.Join(buildOutDir, "vmlinux") + initramfs := filepath.Join(buildOutDir, "initramfs.img") + + if err := buildCuttlefishImage(params, bzImage, vmlinux, initramfs); err != nil { + return details, fmt.Errorf("failed to build image: %s", err) + } + + if err := osutil.CopyFile(vmlinux, filepath.Join(params.OutputDir, "kernel")); err != nil { + return details, err + } + if err := osutil.CopyFile(initramfs, filepath.Join(params.OutputDir, "initrd")); err != nil { + return details, err + } + + var err error + details.Signature, err = elfBinarySignature(vmlinux) + if err != nil { + return details, fmt.Errorf("failed to generate signature: %s", err) + } + + return details, nil +} + +func (a android) clean(kernelDir, targetArch string) error { + return osutil.RemoveAll(filepath.Join(kernelDir, "out")) +} |
