Skip to content

Commit

Permalink
fix: fix macho embed address parse
Browse files Browse the repository at this point in the history
Closes: #242
Signed-off-by: Zxilly <[email protected]>
  • Loading branch information
Zxilly committed Oct 21, 2024
1 parent 69142c7 commit d1c6aa6
Show file tree
Hide file tree
Showing 3 changed files with 22 additions and 22 deletions.
2 changes: 1 addition & 1 deletion internal/knowninfo/dwarf.go
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ func (k *KnownInfo) AddDwarfVariable(entry *dwarf.Entry, d *dwarf.Data, pkg *ent

valueName := utils.Deduplicate(fmt.Sprintf("%s.%s", entryName, content.Name))

symbol = entity.NewSymbol(valueName, content.Addr, content.Size, entity.AddrTypeData)
symbol = entity.NewSymbol(valueName, k.convertAddr(content.Addr), content.Size, entity.AddrTypeData)

ap = k.KnownAddr.InsertSymbolFromDWARF(symbol, pkg)
if ap == nil {
Expand Down
7 changes: 7 additions & 0 deletions internal/knowninfo/knowninfo.go
Original file line number Diff line number Diff line change
Expand Up @@ -72,3 +72,10 @@ func (k *KnownInfo) RequireModInfo() error {
}
return nil
}

func (k *KnownInfo) convertAddr(addr uint64) uint64 {
if w, ok := k.Wrapper.(*wrapper.MachoWrapper); ok {
return w.SlidePointer(addr)
}
return addr
}
35 changes: 14 additions & 21 deletions internal/wrapper/macho.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ import (
"compress/zlib"
"debug/dwarf"
"encoding/binary"
"errors"
"fmt"
"io"
"slices"
Expand All @@ -21,6 +20,10 @@ type MachoWrapper struct {
file *macho.File
}

func (m *MachoWrapper) SlidePointer(addr uint64) uint64 {
return m.file.SlidePointer(addr) + m.file.GetBaseAddress()
}

// DWARF a copy of go-macho's DWARF function
func (m *MachoWrapper) DWARF() (*dwarf.Data, error) {
dwarfSuffix := func(s *types.Section) string {
Expand Down Expand Up @@ -259,27 +262,17 @@ func machoSectionShouldIgnore(sect *types.Section) bool {
}

func (m *MachoWrapper) ReadAddr(addr, size uint64) ([]byte, error) {
for _, load := range m.file.Loads {
seg, ok := load.(*macho.Segment)
if !ok {
continue
}
if seg.Addr <= addr && addr <= seg.Addr+seg.Filesz-1 {
if seg.Name == "__PAGEZERO" {
continue
}
n := seg.Addr + seg.Filesz - addr
if size > n {
return nil, errors.New("size too large")
}
data := make([]byte, size)
if _, err := seg.ReadAt(data, int64(addr-seg.Addr)); err != nil {
return nil, err
}
return data, nil
}
addr = m.file.SlidePointer(addr)
off, err := m.file.GetOffset(addr)
if err != nil {
return nil, ErrAddrNotFound
}
b := make([]byte, size)
if size == 0 {
return b, nil
}
return nil, ErrAddrNotFound
_, err = m.file.ReadAt(b, int64(off))
return b, err
}

func (m *MachoWrapper) Text() (textStart uint64, text []byte, err error) {
Expand Down

0 comments on commit d1c6aa6

Please sign in to comment.