From 396a9b98bac38dce31085146f8c713fbe3c0c664 Mon Sep 17 00:00:00 2001 From: Jeremy Faller Date: Tue, 29 Oct 2019 10:52:20 -0400 Subject: [PATCH] [dev.link] cmd/link: fix macho host objects Small updates to macho loader, fixing some misunderstandings I had about using the new object file format. Change-Id: I9224b01ca327e3a087ebfa36800bd6eef6abcc80 Reviewed-on: https://go-review.googlesource.com/c/go/+/204097 Reviewed-by: Cherry Zhang --- src/cmd/link/internal/ld/config.go | 2 +- src/cmd/link/internal/ld/lib.go | 3 ++- src/cmd/link/internal/loader/loader.go | 2 +- src/cmd/link/internal/loadmacho/ldmacho.go | 27 ++++++++-------------- 4 files changed, 14 insertions(+), 20 deletions(-) diff --git a/src/cmd/link/internal/ld/config.go b/src/cmd/link/internal/ld/config.go index 43dc472230..0c571c30e7 100644 --- a/src/cmd/link/internal/ld/config.go +++ b/src/cmd/link/internal/ld/config.go @@ -168,7 +168,7 @@ func canLinkHostObj(ctxt *Link) bool { if !*flagNewobj { return true } - return ctxt.IsELF + return ctxt.IsELF || objabi.GOOS == "darwin" } // mustLinkExternal reports whether the program being linked requires diff --git a/src/cmd/link/internal/ld/lib.go b/src/cmd/link/internal/ld/lib.go index e5e0f1e0dd..679d44e8dd 100644 --- a/src/cmd/link/internal/ld/lib.go +++ b/src/cmd/link/internal/ld/lib.go @@ -1653,11 +1653,12 @@ func ldobj(ctxt *Link, f *bio.Reader, lib *sym.Library, length int64, pn string, if magic&^1 == 0xfeedface || magic&^0x01000000 == 0xcefaedfe { if *flagNewobj { ldmacho := func(ctxt *Link, f *bio.Reader, pkg string, length int64, pn string) { - err := loadmacho.Load(ctxt.loader, ctxt.Arch, ctxt.Syms, f, pkg, length, pn) + textp, err := loadmacho.Load(ctxt.loader, ctxt.Arch, ctxt.Syms, f, pkg, length, pn) if err != nil { Errorf(nil, "%v", err) return } + ctxt.Textp = append(ctxt.Textp, textp...) } return ldhostobj(ldmacho, ctxt.HeadType, f, pkg, length, pn, file) } else { diff --git a/src/cmd/link/internal/loader/loader.go b/src/cmd/link/internal/loader/loader.go index f0689032f3..0ce6f54ef7 100644 --- a/src/cmd/link/internal/loader/loader.go +++ b/src/cmd/link/internal/loader/loader.go @@ -511,7 +511,7 @@ func (l *Loader) OuterSym(i Sym) Sym { return 0 } -// SubSym gets sub symbols for a previously loaded host object symbol. +// SubSym gets the subsymbol for host object loaded symbols. func (l *Loader) SubSym(i Sym) Sym { sym := l.Syms[i] if sym != nil && sym.Sub != nil { diff --git a/src/cmd/link/internal/loadmacho/ldmacho.go b/src/cmd/link/internal/loadmacho/ldmacho.go index 18a0678af8..f21d4bd14f 100644 --- a/src/cmd/link/internal/loadmacho/ldmacho.go +++ b/src/cmd/link/internal/loadmacho/ldmacho.go @@ -424,31 +424,24 @@ func macholoadsym(m *ldMachoObj, symtab *ldMachoSymtab) int { return 0 } -func Load(l *loader.Loader, arch *sys.Arch, syms *sym.Symbols, f *bio.Reader, pkg string, length int64, pn string) error { - lookup := func(name string, version int) *sym.Symbol { - // Check to see if we've already defined the symbol. - if i := l.Lookup(name, version); i != 0 { - return l.Syms[i] - } - // Not defined, let's make one. - if s := l.AddExtSym(name, version); s == 0 { +func Load(l *loader.Loader, arch *sys.Arch, syms *sym.Symbols, f *bio.Reader, pkg string, length int64, pn string) ([]*sym.Symbol, error) { + newSym := func(name string, version int) *sym.Symbol { + i := l.Lookup(name, version) + if i != 0 { + return l.LoadSymbol(name, version, syms) + } + if i = l.AddExtSym(name, version); i == 0 { panic("AddExtSym returned bad index") - } else if int(s) != len(l.Syms) { - panic("unexpected length of loaded symbols") } newSym := syms.Newsym(name, version) - l.Syms = append(l.Syms, newSym) + l.Syms[i] = newSym return newSym } - _, err := load(arch, syms.IncVersion(), lookup, f, pkg, length, pn) - return err + return load(arch, syms.IncVersion(), newSym, f, pkg, length, pn) } func LoadOld(arch *sys.Arch, syms *sym.Symbols, f *bio.Reader, pkg string, length int64, pn string) (textp []*sym.Symbol, err error) { - lookup := func(name string, version int) *sym.Symbol { - return syms.Lookup(name, version) - } - return load(arch, syms.IncVersion(), lookup, f, pkg, length, pn) + return load(arch, syms.IncVersion(), syms.Lookup, f, pkg, length, pn) } // load the Mach-O file pn from f. -- 2.48.1