// Copyright 2019 Google Inc. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // This is a script that generates the test executables for MacOS and Linux // in this directory. It should be needed very rarely to run this script. // It is mostly provided as a future reference on how the original binary // set was created. // When a new executable is generated, hardcoded addresses in the // functions TestObjFile, TestMachoFiles, TestPEFile in binutils_test.go must be updated. package main import ( "log" "os" "os/exec" "path/filepath" "runtime" ) func main() { wd, err := os.Getwd() if err != nil { log.Fatal(err) } switch runtime.GOOS { case "linux": if err := removeGlob("exe_linux_64*"); err != nil { log.Fatal(err) } out, err := exec.Command("cc", "-g", "-ffile-prefix-map="+wd+"="+"/tmp", "-o", "exe_linux_64", "hello.c").CombinedOutput() log.Println(string(out)) if err != nil { log.Fatal(err) } case "darwin": if err := removeGlob("exe_mac_64*", "lib_mac_64"); err != nil { log.Fatal(err) } out, err := exec.Command("clang", "-g", "-ffile-prefix-map="+wd+"="+"/tmp", "-o", "exe_mac_64", "hello.c").CombinedOutput() log.Println(string(out)) if err != nil { log.Fatal(err) } out, err = exec.Command("clang", "-g", "-ffile-prefix-map="+wd+"="+"/tmp", "-o", "lib_mac_64", "-dynamiclib", "lib.c").CombinedOutput() log.Println(string(out)) if err != nil { log.Fatal(err) } case "windows": // Many gcc environments may create binaries that trigger false-positives // in antiviruses. MSYS2 with gcc 10.2.0 is a working environment for // compiling. To setup the environment follow the guide at // https://www.msys2.org/ and install gcc with `pacman -S gcc`. out, err := exec.Command("gcc", "-g", "-ffile-prefix-map="+wd+"=", "-o", "exe_windows_64.exe", "hello.c").CombinedOutput() log.Println(string(out)) if err != nil { log.Fatal(err) } log.Println("Please verify that exe_windows_64.exe does not trigger any antivirus on `virustotal.com`.") default: log.Fatalf("Unsupported OS %q", runtime.GOOS) } } func removeGlob(globs ...string) error { for _, glob := range globs { matches, err := filepath.Glob(glob) if err != nil { return err } for _, p := range matches { os.Remove(p) } } return nil }