blob: daa65e6fabbdd39e523e52d88ac6978c57e9b6c7 [file]
// Copyright 2026 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package objfile
import (
"debug/macho"
"testing"
)
func TestMachoSymbolsUseSectionEndForLastTextSymbol(t *testing.T) {
f := &machoFile{macho: &macho.File{
Symtab: &macho.Symtab{Syms: []macho.Symbol{
{Name: "_f", Sect: 1, Value: 0x1000},
{Name: "_g", Sect: 1, Value: 0x1010},
}},
Sections: []*macho.Section{
{SectionHeader: macho.SectionHeader{Name: "__text", Seg: "__TEXT", Addr: 0x1000, Size: 0x30}},
},
}}
syms, err := f.symbols()
if err != nil {
t.Fatal(err)
}
got := map[string]Sym{}
for _, sym := range syms {
got[sym.Name] = sym
}
if got["_f"].Size != 0x10 {
t.Fatalf("_f size = %#x, want %#x", got["_f"].Size, int64(0x10))
}
if got["_g"].Size != 0x20 {
t.Fatalf("_g size = %#x, want %#x", got["_g"].Size, int64(0x20))
}
if got["_g"].Code != 'T' {
t.Fatalf("_g code = %q, want %q", got["_g"].Code, 'T')
}
}
func TestMachoSymbolsDoNotCrossSectionBoundaries(t *testing.T) {
f := &machoFile{macho: &macho.File{
Symtab: &macho.Symtab{Syms: []macho.Symbol{
{Name: "_f", Sect: 1, Value: 0x1000},
{Name: "_g", Sect: 1, Value: 0x1010},
{Name: "_data", Sect: 2, Value: 0x2000},
}},
Sections: []*macho.Section{
{SectionHeader: macho.SectionHeader{Name: "__text", Seg: "__TEXT", Addr: 0x1000, Size: 0x30}},
{SectionHeader: macho.SectionHeader{Name: "__data", Seg: "__DATA", Addr: 0x2000, Size: 0x10}},
},
}}
syms, err := f.symbols()
if err != nil {
t.Fatal(err)
}
got := map[string]Sym{}
for _, sym := range syms {
got[sym.Name] = sym
}
if got["_g"].Size != 0x20 {
t.Fatalf("_g size = %#x, want %#x", got["_g"].Size, int64(0x20))
}
if got["_data"].Size != 0x10 {
t.Fatalf("_data size = %#x, want %#x", got["_data"].Size, int64(0x10))
}
}