From d1c6aa60a849f92a72151afacc38fd2e153618bb Mon Sep 17 00:00:00 2001 From: Zxilly Date: Mon, 21 Oct 2024 19:05:04 +0800 Subject: [PATCH] fix: fix macho embed address parse Closes: #242 Signed-off-by: Zxilly --- internal/knowninfo/dwarf.go | 2 +- internal/knowninfo/knowninfo.go | 7 +++++++ internal/wrapper/macho.go | 35 +++++++++++++-------------------- 3 files changed, 22 insertions(+), 22 deletions(-) diff --git a/internal/knowninfo/dwarf.go b/internal/knowninfo/dwarf.go index d198eef2fe..9a9b2b7a1d 100644 --- a/internal/knowninfo/dwarf.go +++ b/internal/knowninfo/dwarf.go @@ -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 { diff --git a/internal/knowninfo/knowninfo.go b/internal/knowninfo/knowninfo.go index f93ea3fcd4..7f25fd296f 100644 --- a/internal/knowninfo/knowninfo.go +++ b/internal/knowninfo/knowninfo.go @@ -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 +} diff --git a/internal/wrapper/macho.go b/internal/wrapper/macho.go index 70e2ff2abd..f7bc73eb09 100644 --- a/internal/wrapper/macho.go +++ b/internal/wrapper/macho.go @@ -5,7 +5,6 @@ import ( "compress/zlib" "debug/dwarf" "encoding/binary" - "errors" "fmt" "io" "slices" @@ -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 { @@ -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) {