forked from loov/lensm
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathexe.go
69 lines (56 loc) · 1.18 KB
/
exe.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
package main
import (
"regexp"
"sort"
"strings"
"loov.dev/lensm/internal/go/objfile"
)
// Exe contains information about the object file.
type Exe struct {
Objfile *objfile.File
Disasm *objfile.Disasm
Symbols []*Symbol
}
// Symbol contains information about the executable.
type Symbol struct {
Exe *Exe
objfile.Sym
SortName string
}
func (exe *Exe) Close() error {
return exe.Objfile.Close()
}
func LoadExe(path string) (*Exe, error) {
f, err := objfile.Open(path)
if err != nil {
return nil, err
}
dis, err := f.Disasm()
if err != nil {
f.Close()
return nil, err
}
exe := &Exe{
Objfile: f,
Disasm: dis,
}
for _, sym := range dis.Syms() {
if sym.Code != 'T' && sym.Code != 't' || sym.Addr < dis.TextStart() {
continue
}
exe.Symbols = append(exe.Symbols, &Symbol{
Exe: exe,
Sym: sym,
SortName: sortingName(sym.Name),
})
}
sort.SliceStable(exe.Symbols, func(i, k int) bool {
return exe.Symbols[i].SortName < exe.Symbols[k].SortName
})
return exe, nil
}
var rxCodeDelimiter = regexp.MustCompile(`[ \*\(\)\.]+`)
func sortingName(sym string) string {
sym = strings.ToLower(sym)
return rxCodeDelimiter.ReplaceAllString(sym, " ")
}