diff options
| author | Dmitry Vyukov <dvyukov@google.com> | 2017-10-02 16:00:18 +0200 |
|---|---|---|
| committer | Dmitry Vyukov <dvyukov@google.com> | 2017-10-12 18:16:25 +0200 |
| commit | 02a7a5401946658aa06fd618cf36e6848b0078fd (patch) | |
| tree | 5f19702ad8c9218ac10b09a8b058183f0d21553e /sys/syz-extract/fuchsia.go | |
| parent | 95a2bea7956f6346c11577645df96e13fe7fec3d (diff) | |
sys/syz-extract: factor out compilation function
Each arch duplicates significant portion of logic
to compile the extract source file.
Factor this logic into a separate function and reuse
it across all OSes.
Diffstat (limited to 'sys/syz-extract/fuchsia.go')
| -rw-r--r-- | sys/syz-extract/fuchsia.go | 73 |
1 files changed, 8 insertions, 65 deletions
diff --git a/sys/syz-extract/fuchsia.go b/sys/syz-extract/fuchsia.go index f3cab132f..b693f38ad 100644 --- a/sys/syz-extract/fuchsia.go +++ b/sys/syz-extract/fuchsia.go @@ -5,11 +5,7 @@ package main import ( "fmt" - "io/ioutil" - "os" - "os/exec" "path/filepath" - "strings" "github.com/google/syzkaller/pkg/compiler" ) @@ -28,65 +24,12 @@ func (*fuchsia) prepareArch(arch *Arch) error { } func (*fuchsia) processFile(arch *Arch, info *compiler.ConstInfo) (map[string]uint64, map[string]bool, error) { - bin, out, err := fuchsiaCompile(arch.sourceDir, info.Consts, info.Includes, info.Incdirs, info.Defines) - if err != nil { - return nil, nil, fmt.Errorf("failed to run compiler: %v\n%v", err, string(out)) - } - defer os.Remove(bin) - res, err := runBinaryAndParse(bin, info.Consts, nil) - if err != nil { - return nil, nil, err - } - return res, nil, nil -} - -func fuchsiaCompile(sourceDir string, vals, includes, incdirs []string, defines map[string]string) (bin string, out []byte, err error) { - includeText := "" - for _, inc := range includes { - includeText += fmt.Sprintf("#include <%v>\n", inc) - } - definesText := "" - for k, v := range defines { - definesText += fmt.Sprintf("#ifndef %v\n#define %v %v\n#endif\n", k, k, v) - } - valsText := strings.Join(vals, ",") - src := fuchsiaSrc - src = strings.Replace(src, "[[INCLUDES]]", includeText, 1) - src = strings.Replace(src, "[[DEFAULTS]]", definesText, 1) - src = strings.Replace(src, "[[VALS]]", valsText, 1) - binFile, err := ioutil.TempFile("", "") - if err != nil { - return "", nil, fmt.Errorf("failed to create temp file: %v", err) - } - binFile.Close() - compiler := filepath.Join(sourceDir, "buildtools", "linux-x64", "clang", "bin", "clang") - includeDir := filepath.Join(sourceDir, "out", "build-zircon", "build-zircon-pc-x86-64", "sysroot", "include") - args := []string{"-x", "c", "-", "-o", binFile.Name(), "-fmessage-length=0", "-w", "-I", includeDir} - for _, incdir := range incdirs { - args = append(args, "-I"+sourceDir+"/"+incdir) - } - cmd := exec.Command(compiler, args...) - cmd.Stdin = strings.NewReader(src) - out, err = cmd.CombinedOutput() - if err != nil { - os.Remove(binFile.Name()) - return "", out, err - } - return binFile.Name(), nil, nil -} - -var fuchsiaSrc = ` -[[INCLUDES]] -[[DEFAULTS]] -int printf(const char *format, ...); -int main() { - int i; - unsigned long long vals[] = {[[VALS]]}; - for (i = 0; i < sizeof(vals)/sizeof(vals[0]); i++) { - if (i != 0) - printf(" "); - printf("%llu", vals[i]); - } - return 0; + dir := arch.sourceDir + cc := filepath.Join(dir, "buildtools", "linux-x64", "clang", "bin", "clang") + includeDir := filepath.Join(dir, "out", "build-zircon", "build-zircon-pc-x86-64", "sysroot", "include") + args := []string{"-fmessage-length=0", "-I" + includeDir} + for _, incdir := range info.Incdirs { + args = append(args, "-I"+filepath.Join(dir, incdir)) + } + return extract(info, cc, args, "") } -` |
