...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package obj
18
19 import (
20 `fmt`
21 `io`
22 `os`
23 )
24
25
26 type Format int
27
28 const (
29
30 ELF Format = iota
31
32
33 MachO
34 )
35
36 var formatTab = [...]func(w io.Writer, code []byte, base uint64, entry uint64) error {
37 ELF : nil,
38 MachO : assembleMachO,
39 }
40
41 var formatNames = map[Format]string {
42 ELF : "ELF",
43 MachO : "Mach-O",
44 }
45
46
47 func (self Format) String() string {
48 if v, ok := formatNames[self]; ok {
49 return v
50 } else {
51 return fmt.Sprintf("Format(%d)", self)
52 }
53 }
54
55
56 func (self Format) Write(w io.Writer, code []byte, base uint64, entry uint64) error {
57 if self >= 0 && int(self) < len(formatTab) && formatTab[self] != nil {
58 return formatTab[self](w, code, base, entry)
59 } else {
60 return fmt.Errorf("unsupported format: %s", self)
61 }
62 }
63
64
65 func (self Format) Generate(name string, code []byte, base uint64, entry uint64) error {
66 var fp *os.File
67 var err error
68
69
70 if fp, err = os.Create(name); err != nil {
71 return err
72 }
73
74
75 if err = self.Write(fp, code, base, entry); err != nil {
76 _ = fp.Close()
77 _ = os.Remove(name)
78 return err
79 }
80
81
82 _ = fp.Close()
83 _ = os.Chmod(name, 0755)
84 return nil
85 }
86
View as plain text