diff --git a/pkg/kernel/kernel.go b/pkg/kernel/kernel.go index 77e6f6c1..c38020b5 100644 --- a/pkg/kernel/kernel.go +++ b/pkg/kernel/kernel.go @@ -25,35 +25,43 @@ import ( "github.com/google/syzkaller/pkg/osutil" ) -func Build(dir, compiler, config string, fullConfig bool) error { - const timeout = 10 * time.Minute // default timeout for command invocations - if fullConfig { - if err := ioutil.WriteFile(filepath.Join(dir, ".config"), []byte(config), 0600); err != nil { - return fmt.Errorf("failed to write config file: %v", err) - } - } else { - os.Remove(filepath.Join(dir, ".config")) - configFile := filepath.Join(dir, "syz.config") - if err := ioutil.WriteFile(configFile, []byte(config), 0600); err != nil { - return fmt.Errorf("failed to write config file: %v", err) - } - defer os.Remove(configFile) - if _, err := osutil.RunCmd(timeout, dir, "make", "defconfig"); err != nil { - return err - } - if _, err := osutil.RunCmd(timeout, dir, "make", "kvmconfig"); err != nil { - return err - } - if _, err := osutil.RunCmd(timeout, dir, "scripts/kconfig/merge_config.sh", "-n", ".config", configFile); err != nil { - return err - } +func Build(dir, compiler, config string) error { + if err := fileutil.CopyFile(config, filepath.Join(dir, ".config")); err != nil { + return fmt.Errorf("failed to write config file: %v", err) } + return build(dir, compiler) +} + +// TODO(dvyukov): this is only for syz-gce, remove when syz-gce is deleted. +func BuildWithPartConfig(dir, compiler, config string) error { + const timeout = 10 * time.Minute // default timeout for command invocations + os.Remove(filepath.Join(dir, ".config")) + configFile := filepath.Join(dir, "syz.config") + if err := ioutil.WriteFile(configFile, []byte(config), 0600); err != nil { + return fmt.Errorf("failed to write config file: %v", err) + } + defer os.Remove(configFile) + if _, err := osutil.RunCmd(timeout, dir, "make", "defconfig"); err != nil { + return err + } + if _, err := osutil.RunCmd(timeout, dir, "make", "kvmconfig"); err != nil { + return err + } + if _, err := osutil.RunCmd(timeout, dir, "scripts/kconfig/merge_config.sh", "-n", ".config", configFile); err != nil { + return err + } + return build(dir, compiler) +} + +func build(dir, compiler string) error { + const timeout = 10 * time.Minute // default timeout for command invocations if _, err := osutil.RunCmd(timeout, dir, "make", "olddefconfig"); err != nil { return err } // We build only bzImage as we currently don't use modules. // Build of a large kernel can take a while on a 1 CPU VM. - if _, err := osutil.RunCmd(3*time.Hour, dir, "make", "bzImage", "-j", strconv.Itoa(runtime.NumCPU()), "CC="+compiler); err != nil { + cpu := strconv.Itoa(runtime.NumCPU()) + if _, err := osutil.RunCmd(3*time.Hour, dir, "make", "bzImage", "-j", cpu, "CC="+compiler); err != nil { return err } return nil diff --git a/syz-gce/syz-gce.go b/syz-gce/syz-gce.go index ebe91ae6..ec28c5e2 100644 --- a/syz-gce/syz-gce.go +++ b/syz-gce/syz-gce.go @@ -354,16 +354,14 @@ func (a *LocalBuildAction) Build() error { } } Logf(0, "building kernel on %v...", hash) - config, full := syzconfig, false if cfg.Linux_Config != "" { - data, err := ioutil.ReadFile(cfg.Linux_Config) - if err != nil { - return fmt.Errorf("failed to read config file: %v", err) + if err := kernel.Build(dir, a.Compiler, cfg.Linux_Config); err != nil { + return fmt.Errorf("build failed: %v", err) + } + } else { + if err := kernel.BuildWithPartConfig(dir, a.Compiler, syzconfig); err != nil { + return fmt.Errorf("build failed: %v", err) } - config, full = string(data), true - } - if err := kernel.Build(dir, a.Compiler, config, full); err != nil { - return fmt.Errorf("build failed: %v", err) } Logf(0, "building image...") os.MkdirAll("image/obj", 0700)