Skip to content

Instantly share code, notes, and snippets.

@henkman
Last active August 30, 2016 16:04
Show Gist options
  • Select an option

  • Save henkman/d212db4f55138cc4e0a6197e74619cc3 to your computer and use it in GitHub Desktop.

Select an option

Save henkman/d212db4f55138cc4e0a6197e74619cc3 to your computer and use it in GitHub Desktop.
removes all occurences of ident strings (Built by...) in .o and .a files of a msys2 installation
package main
import (
"bytes"
"flag"
"fmt"
"io"
"io/ioutil"
"log"
"os"
"os/exec"
"path/filepath"
"regexp"
"strings"
)
const (
IDENT = "Built by"
)
var (
_msys string
_objcopy string
_ar string
)
func init() {
flag.StringVar(&_msys, "m", "C:\\msys32\\mingw32", "msys dir")
flag.StringVar(&_objcopy, "o", "objcopy", "objcopy executable")
flag.StringVar(&_ar, "a", "ar", "ar executable")
flag.Parse()
}
func copyFile(src, dst string) error {
in, err := os.OpenFile(src, os.O_RDONLY, 0750)
if err != nil {
return err
}
out, err := os.OpenFile(dst, os.O_WRONLY|os.O_TRUNC|os.O_CREATE, 0750)
if err != nil {
in.Close()
return err
}
io.Copy(out, in)
in.Close()
out.Close()
return nil
}
func slowLibFallback(info os.FileInfo, path string) error {
wd, _ := os.Getwd()
tempdir := filepath.Join(os.TempDir(), "msysunident")
os.Mkdir(tempdir, 0750)
tempfile := filepath.Join(tempdir, info.Name())
copyFile(path, tempfile)
os.Chdir(tempdir)
{
cmd := exec.Command("ar", "x", tempfile)
err := cmd.Run()
if err != nil {
os.Chdir(wd)
os.RemoveAll(tempdir)
log.Fatal("ar x: ", err)
return err
}
}
var fis []os.FileInfo
{
dfd, err := os.Open(tempdir)
if err != nil {
os.Chdir(wd)
os.RemoveAll(tempdir)
log.Fatal(err)
return err
}
tfis, err := dfd.Readdir(-1)
if err != nil {
dfd.Close()
os.Chdir(wd)
os.RemoveAll(tempdir)
log.Fatal(err)
return err
}
dfd.Close()
fis = tfis
}
objs := make([]string, 0, len(fis))
for _, fi := range fis {
if !strings.HasSuffix(fi.Name(), ".o") {
continue
}
file := filepath.Join(tempdir, fi.Name())
cmd := exec.Command(_objcopy, "-R", ".rdata$zzz", file)
err := cmd.Run()
if err != nil {
os.Chdir(wd)
os.RemoveAll(tempdir)
log.Fatal("objcopy -R", fi.Name(), ": ", err)
return err
}
objs = append(objs, fi.Name())
}
{
os.Remove(tempfile)
c := append([]string{"rcs", tempfile}, objs...)
cmd := exec.Command("ar", c...)
err := cmd.Run()
if err != nil {
os.Chdir(wd)
os.RemoveAll(tempdir)
log.Fatal("ar rcs: ", err)
return err
}
}
copyFile(tempfile, path)
os.Chdir(wd)
os.RemoveAll(tempdir)
return nil
}
func main() {
if _msys == "" {
flag.Usage()
return
}
reBinary := regexp.MustCompile("\\.([oa])$")
bident := []byte(IDENT)
err := filepath.Walk(_msys,
func(path string, info os.FileInfo, err error) error {
m := reBinary.FindStringSubmatch(path)
if m == nil {
return nil
}
data, err := ioutil.ReadFile(path)
if err != nil {
log.Fatal(err)
return err
}
if !bytes.Contains(data, bident) {
return nil
}
if m[1] == "o" {
fmt.Println(path)
cmd := exec.Command(_objcopy, "-R", ".rdata$zzz", path)
err := cmd.Run()
if err != nil {
log.Fatal("objcopy -R: ", err)
return err
}
} else if m[1] == "a" {
fmt.Println(path)
cmd := exec.Command(_objcopy, "-R", ".rdata$zzz", path)
err := cmd.Run()
if err != nil {
err = slowLibFallback(info, path)
if err != nil {
return err
}
}
}
return nil
})
if err != nil {
log.Fatal(err)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment