zoulasc 3520854be0 syz-extract: select declaring printf or not
Kernels are standalone implementations and can have their own
implementations of functions that have different prototypes than
the standard ones. In the NetBSD case the kernel printf returns
void, and it is declared in <sys/systm.h> so avoid re-declaring it.
Select if we are going to declare printf or not depending on the OS.
2017-11-06 11:27:45 +03:00

101 lines
2.8 KiB
Go

// Copyright 2017 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 main
import (
"fmt"
"os"
"path/filepath"
"strings"
"github.com/google/syzkaller/pkg/compiler"
)
type netbsd struct{}
func (*netbsd) prepare(sourcedir string, build bool, arches []string) error {
if sourcedir == "" {
return fmt.Errorf("provide path to kernel checkout via -sourcedir flag (or make extract SOURCEDIR)")
}
if !build {
return fmt.Errorf("netbsd requires -build flag")
}
return nil
}
func (*netbsd) prepareArch(arch *Arch) error {
links := [][2]string{
{"amd64", "machine"},
{"amd64", "amd64"},
{"x86", "x86"},
}
for _, v := range links {
if err := machineLink(arch, v[0], v[1]); err != nil {
return err
}
}
return nil
}
func machineLink(arch *Arch, machine string, dest string) error {
if err := os.Symlink(machineInclude(arch, machine),
filepath.Join(arch.buildDir, dest)); err != nil {
return fmt.Errorf("failed to create link: %v", err)
}
return nil
}
func machineInclude(arch *Arch, machine string) string {
return filepath.Join(arch.sourceDir, "sys", "arch", machine, "include")
}
func (*netbsd) processFile(arch *Arch, info *compiler.ConstInfo) (map[string]uint64, map[string]bool, error) {
args := []string{
"-fmessage-length=0",
"-nostdinc",
"-D_KERNEL",
"-D__BSD_VISIBLE=1",
"-I", filepath.Join(arch.sourceDir, "sys"),
"-I", filepath.Join(arch.sourceDir, "sys", "sys"),
"-I", filepath.Join(arch.sourceDir, "sys", "arch", "amd64"),
"-I", filepath.Join(arch.sourceDir, "common", "include"),
"-I", filepath.Join(arch.sourceDir, "sys", "compat", "linux", "common"),
"-I", arch.buildDir,
}
for _, incdir := range info.Incdirs {
args = append(args, "-I"+filepath.Join(arch.sourceDir, incdir))
}
// Syscall consts on netbsd have weird prefixes sometimes,
// try to extract consts with these prefixes as well.
compatNames := make(map[string][]string)
for _, val := range info.Consts {
const SYS = "SYS_"
if strings.HasPrefix(val, SYS) {
for _, prefix := range []string{"_", "__", "___"} {
for _, suffix := range []string{"30", "50"} {
compat := SYS + prefix + val[len(SYS):] + suffix
compatNames[val] = append(compatNames[val], compat)
info.Consts = append(info.Consts, compat)
}
}
} else {
compat := "LINUX_" + val
compatNames[val] = append(compatNames[val], compat)
info.Consts = append(info.Consts, compat)
}
}
res, undeclared, err := extract(info, "gcc", args, "#include <sys/syscall.h>", false)
for orig, compats := range compatNames {
for _, compat := range compats {
if undeclared[orig] && !undeclared[compat] {
res[orig] = res[compat]
delete(res, compat)
delete(undeclared, orig)
}
delete(undeclared, compat)
}
}
return res, undeclared, err
}