mirror of
https://github.com/thunderbrewhq/binana.git
synced 2026-03-22 22:00:13 +00:00
78 lines
1.4 KiB
Go
78 lines
1.4 KiB
Go
|
|
package symbols
|
||
|
|
|
||
|
|
import (
|
||
|
|
"fmt"
|
||
|
|
"io"
|
||
|
|
"strings"
|
||
|
|
)
|
||
|
|
|
||
|
|
// What kind of Symbol is this?
|
||
|
|
type SymbolKind uint8
|
||
|
|
|
||
|
|
const (
|
||
|
|
// Something that can be executed
|
||
|
|
Function SymbolKind = 'f'
|
||
|
|
// Something that is read or written to
|
||
|
|
DataLabel SymbolKind = 'l'
|
||
|
|
)
|
||
|
|
|
||
|
|
var (
|
||
|
|
valid_kinds = []SymbolKind{Function, DataLabel}
|
||
|
|
)
|
||
|
|
|
||
|
|
// An entry in the table
|
||
|
|
type Symbol struct {
|
||
|
|
// Undecorated, raw name
|
||
|
|
Name string
|
||
|
|
// Offset to the start of the function or data
|
||
|
|
StartAddress uint64
|
||
|
|
// What kind of Symbol is this?
|
||
|
|
Kind SymbolKind
|
||
|
|
// Any table entry can have a comment after a ';' column
|
||
|
|
Comment string
|
||
|
|
// Attributes
|
||
|
|
// end=AABBCCEEDD
|
||
|
|
EndAddress uint64
|
||
|
|
// type=void*
|
||
|
|
// The C syntax type of the data
|
||
|
|
DataType string
|
||
|
|
}
|
||
|
|
|
||
|
|
func (entry *Symbol) String() string {
|
||
|
|
var b strings.Builder
|
||
|
|
entry.WriteTo(&b)
|
||
|
|
return b.String()
|
||
|
|
}
|
||
|
|
|
||
|
|
func (entry *Symbol) WriteTo(w io.Writer) (n int64, err error) {
|
||
|
|
var b int
|
||
|
|
b, err = fmt.Fprintf(w, "%s %08X %c", entry.Name, entry.StartAddress, entry.Kind)
|
||
|
|
if err != nil {
|
||
|
|
return
|
||
|
|
}
|
||
|
|
n += int64(b)
|
||
|
|
if entry.EndAddress != 0 {
|
||
|
|
b, err = fmt.Fprintf(w, " end=%08X", entry.EndAddress)
|
||
|
|
if err != nil {
|
||
|
|
return
|
||
|
|
}
|
||
|
|
n += int64(b)
|
||
|
|
}
|
||
|
|
|
||
|
|
if entry.DataType != "" {
|
||
|
|
b, err = fmt.Fprintf(w, " type=\"%s\"", entry.DataType)
|
||
|
|
if err != nil {
|
||
|
|
return
|
||
|
|
}
|
||
|
|
n += int64(b)
|
||
|
|
}
|
||
|
|
if entry.Comment != "" {
|
||
|
|
b, err = fmt.Fprintf(w, " ; %s", entry.Comment)
|
||
|
|
if err != nil {
|
||
|
|
return
|
||
|
|
}
|
||
|
|
n += int64(b)
|
||
|
|
}
|
||
|
|
return
|
||
|
|
}
|