1
0
mirror of https://github.com/golang/go synced 2024-09-30 15:28:33 -06:00

[dev.link] cmd/link: remove "2" from names

Change-Id: I203caaf9cbe7136cf2060de7dc91c28f6ced1ee2
Reviewed-on: https://go-review.googlesource.com/c/go/+/234038
Run-TryBot: Cherry Zhang <cherryyz@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Than McIntosh <thanm@google.com>
Reviewed-by: Jeremy Faller <jeremy@golang.org>
This commit is contained in:
Cherry Zhang 2020-05-15 18:35:05 -04:00
parent 4e974292d4
commit 1ccd585e94
38 changed files with 708 additions and 709 deletions

View File

@ -45,7 +45,7 @@ func PADDR(x uint32) uint32 {
return x &^ 0x80000000 return x &^ 0x80000000
} }
func gentext2(ctxt *ld.Link, ldr *loader.Loader) { func gentext(ctxt *ld.Link, ldr *loader.Loader) {
initfunc, addmoduledata := ld.PrepareAddmoduledata(ctxt) initfunc, addmoduledata := ld.PrepareAddmoduledata(ctxt)
if initfunc == nil { if initfunc == nil {
return return
@ -61,7 +61,7 @@ func gentext2(ctxt *ld.Link, ldr *loader.Loader) {
// 0: 48 8d 3d 00 00 00 00 lea 0x0(%rip),%rdi # 7 <local.dso_init+0x7> // 0: 48 8d 3d 00 00 00 00 lea 0x0(%rip),%rdi # 7 <local.dso_init+0x7>
// 3: R_X86_64_PC32 runtime.firstmoduledata-0x4 // 3: R_X86_64_PC32 runtime.firstmoduledata-0x4
o(0x48, 0x8d, 0x3d) o(0x48, 0x8d, 0x3d)
initfunc.AddPCRelPlus(ctxt.Arch, ctxt.Moduledata2, 0) initfunc.AddPCRelPlus(ctxt.Arch, ctxt.Moduledata, 0)
// 7: e8 00 00 00 00 callq c <local.dso_init+0xc> // 7: e8 00 00 00 00 callq c <local.dso_init+0xc>
// 8: R_X86_64_PLT32 runtime.addmoduledata-0x4 // 8: R_X86_64_PLT32 runtime.addmoduledata-0x4
o(0xe8) o(0xe8)
@ -116,8 +116,8 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade
su.SetRelocType(rIdx, objabi.R_PCREL) su.SetRelocType(rIdx, objabi.R_PCREL)
su.SetRelocAdd(rIdx, r.Add()+4) su.SetRelocAdd(rIdx, r.Add()+4)
if targType == sym.SDYNIMPORT { if targType == sym.SDYNIMPORT {
addpltsym2(target, ldr, syms, targ) addpltsym(target, ldr, syms, targ)
su.SetRelocSym(rIdx, syms.PLT2) su.SetRelocSym(rIdx, syms.PLT)
su.SetRelocAdd(rIdx, r.Add()+int64(ldr.SymPlt(targ))) su.SetRelocAdd(rIdx, r.Add()+int64(ldr.SymPlt(targ)))
} }
@ -143,10 +143,10 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade
// fall back to using GOT and hope for the best (CMOV*) // fall back to using GOT and hope for the best (CMOV*)
// TODO: just needs relocation, no need to put in .dynsym // TODO: just needs relocation, no need to put in .dynsym
addgotsym2(target, ldr, syms, targ) addgotsym(target, ldr, syms, targ)
su.SetRelocType(rIdx, objabi.R_PCREL) su.SetRelocType(rIdx, objabi.R_PCREL)
su.SetRelocSym(rIdx, syms.GOT2) su.SetRelocSym(rIdx, syms.GOT)
su.SetRelocAdd(rIdx, r.Add()+4+int64(ldr.SymGot(targ))) su.SetRelocAdd(rIdx, r.Add()+4+int64(ldr.SymGot(targ)))
return true return true
@ -179,9 +179,9 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade
case objabi.MachoRelocOffset + ld.MACHO_X86_64_RELOC_BRANCH*2 + 1: case objabi.MachoRelocOffset + ld.MACHO_X86_64_RELOC_BRANCH*2 + 1:
if targType == sym.SDYNIMPORT { if targType == sym.SDYNIMPORT {
addpltsym2(target, ldr, syms, targ) addpltsym(target, ldr, syms, targ)
su := ldr.MakeSymbolUpdater(s) su := ldr.MakeSymbolUpdater(s)
su.SetRelocSym(rIdx, syms.PLT2) su.SetRelocSym(rIdx, syms.PLT)
su.SetRelocType(rIdx, objabi.R_PCREL) su.SetRelocType(rIdx, objabi.R_PCREL)
su.SetRelocAdd(rIdx, int64(ldr.SymPlt(targ))) su.SetRelocAdd(rIdx, int64(ldr.SymPlt(targ)))
return true return true
@ -224,10 +224,10 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade
if targType != sym.SDYNIMPORT { if targType != sym.SDYNIMPORT {
ldr.Errorf(s, "unexpected GOT reloc for non-dynamic symbol %s", ldr.SymName(targ)) ldr.Errorf(s, "unexpected GOT reloc for non-dynamic symbol %s", ldr.SymName(targ))
} }
addgotsym2(target, ldr, syms, targ) addgotsym(target, ldr, syms, targ)
su := ldr.MakeSymbolUpdater(s) su := ldr.MakeSymbolUpdater(s)
su.SetRelocType(rIdx, objabi.R_PCREL) su.SetRelocType(rIdx, objabi.R_PCREL)
su.SetRelocSym(rIdx, syms.GOT2) su.SetRelocSym(rIdx, syms.GOT)
su.SetRelocAdd(rIdx, r.Add()+int64(ldr.SymGot(targ))) su.SetRelocAdd(rIdx, r.Add()+int64(ldr.SymGot(targ)))
return true return true
} }
@ -249,9 +249,9 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade
} }
// Internal linking, for both ELF and Mach-O. // Internal linking, for both ELF and Mach-O.
// Build a PLT entry and change the relocation target to that entry. // Build a PLT entry and change the relocation target to that entry.
addpltsym2(target, ldr, syms, targ) addpltsym(target, ldr, syms, targ)
su := ldr.MakeSymbolUpdater(s) su := ldr.MakeSymbolUpdater(s)
su.SetRelocSym(rIdx, syms.PLT2) su.SetRelocSym(rIdx, syms.PLT)
su.SetRelocAdd(rIdx, int64(ldr.SymPlt(targ))) su.SetRelocAdd(rIdx, int64(ldr.SymPlt(targ)))
return true return true
@ -259,17 +259,17 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade
if ldr.SymType(s) == sym.STEXT && target.IsElf() { if ldr.SymType(s) == sym.STEXT && target.IsElf() {
su := ldr.MakeSymbolUpdater(s) su := ldr.MakeSymbolUpdater(s)
if target.IsSolaris() { if target.IsSolaris() {
addpltsym2(target, ldr, syms, targ) addpltsym(target, ldr, syms, targ)
su.SetRelocSym(rIdx, syms.PLT2) su.SetRelocSym(rIdx, syms.PLT)
su.SetRelocAdd(rIdx, r.Add()+int64(ldr.SymPlt(targ))) su.SetRelocAdd(rIdx, r.Add()+int64(ldr.SymPlt(targ)))
return true return true
} }
// The code is asking for the address of an external // The code is asking for the address of an external
// function. We provide it with the address of the // function. We provide it with the address of the
// correspondent GOT symbol. // correspondent GOT symbol.
addgotsym2(target, ldr, syms, targ) addgotsym(target, ldr, syms, targ)
su.SetRelocSym(rIdx, syms.GOT2) su.SetRelocSym(rIdx, syms.GOT)
su.SetRelocAdd(rIdx, r.Add()+int64(ldr.SymGot(targ))) su.SetRelocAdd(rIdx, r.Add()+int64(ldr.SymGot(targ)))
return true return true
} }
@ -341,7 +341,7 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade
// AddAddrPlus is used for r_offset and r_addend to // AddAddrPlus is used for r_offset and r_addend to
// generate new R_ADDR relocations that will update // generate new R_ADDR relocations that will update
// these fields in the 'reloc' phase. // these fields in the 'reloc' phase.
rela := ldr.MakeSymbolUpdater(syms.Rela2) rela := ldr.MakeSymbolUpdater(syms.Rela)
rela.AddAddrPlus(target.Arch, s, int64(r.Off())) rela.AddAddrPlus(target.Arch, s, int64(r.Off()))
if r.Siz() == 8 { if r.Siz() == 8 {
rela.AddUint64(target.Arch, ld.ELF64_R_INFO(0, uint32(elf.R_X86_64_RELATIVE))) rela.AddUint64(target.Arch, ld.ELF64_R_INFO(0, uint32(elf.R_X86_64_RELATIVE)))
@ -367,15 +367,15 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade
// just in case the C code assigns to the variable, // just in case the C code assigns to the variable,
// and of course it only works for single pointers, // and of course it only works for single pointers,
// but we only need to support cgo and that's all it needs. // but we only need to support cgo and that's all it needs.
ld.Adddynsym2(ldr, target, syms, targ) ld.Adddynsym(ldr, target, syms, targ)
got := ldr.MakeSymbolUpdater(syms.GOT2) got := ldr.MakeSymbolUpdater(syms.GOT)
su := ldr.MakeSymbolUpdater(s) su := ldr.MakeSymbolUpdater(s)
su.SetType(got.Type()) su.SetType(got.Type())
got.PrependSub(s) got.PrependSub(s)
su.SetValue(got.Size()) su.SetValue(got.Size())
got.AddUint64(target.Arch, 0) got.AddUint64(target.Arch, 0)
leg := ldr.MakeSymbolUpdater(syms.LinkEditGOT2) leg := ldr.MakeSymbolUpdater(syms.LinkEditGOT)
leg.AddUint32(target.Arch, uint32(ldr.SymDynid(targ))) leg.AddUint32(target.Arch, uint32(ldr.SymDynid(targ)))
su.SetRelocType(rIdx, objabi.ElfRelocOffset) // ignore during relocsym su.SetRelocType(rIdx, objabi.ElfRelocOffset) // ignore during relocsym
return true return true
@ -385,10 +385,10 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade
return false return false
} }
func elfreloc2(ctxt *ld.Link, ldr *loader.Loader, s loader.Sym, r loader.ExtRelocView, sectoff int64) bool { func elfreloc1(ctxt *ld.Link, ldr *loader.Loader, s loader.Sym, r loader.ExtRelocView, sectoff int64) bool {
ctxt.Out.Write64(uint64(sectoff)) ctxt.Out.Write64(uint64(sectoff))
elfsym := ld.ElfSymForReloc2(ctxt, r.Xsym) elfsym := ld.ElfSymForReloc(ctxt, r.Xsym)
siz := r.Siz() siz := r.Siz()
xst := ldr.SymType(r.Xsym) xst := ldr.SymType(r.Xsym)
switch r.Type() { switch r.Type() {
@ -586,17 +586,17 @@ func elfsetupplt(ctxt *ld.Link, plt, got *loader.SymbolBuilder, dynamic loader.S
} }
} }
func addpltsym2(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loader.Sym) { func addpltsym(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loader.Sym) {
if ldr.SymPlt(s) >= 0 { if ldr.SymPlt(s) >= 0 {
return return
} }
ld.Adddynsym2(ldr, target, syms, s) ld.Adddynsym(ldr, target, syms, s)
if target.IsElf() { if target.IsElf() {
plt := ldr.MakeSymbolUpdater(syms.PLT2) plt := ldr.MakeSymbolUpdater(syms.PLT)
got := ldr.MakeSymbolUpdater(syms.GOTPLT2) got := ldr.MakeSymbolUpdater(syms.GOTPLT)
rela := ldr.MakeSymbolUpdater(syms.RelaPLT2) rela := ldr.MakeSymbolUpdater(syms.RelaPLT)
if plt.Size() == 0 { if plt.Size() == 0 {
panic("plt is not set up") panic("plt is not set up")
} }
@ -639,11 +639,11 @@ func addpltsym2(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s load
// https://networkpx.blogspot.com/2009/09/about-lcdyldinfoonly-command.html // https://networkpx.blogspot.com/2009/09/about-lcdyldinfoonly-command.html
// has details about what we're avoiding. // has details about what we're avoiding.
addgotsym2(target, ldr, syms, s) addgotsym(target, ldr, syms, s)
plt := ldr.MakeSymbolUpdater(syms.PLT2) plt := ldr.MakeSymbolUpdater(syms.PLT)
sDynid := ldr.SymDynid(s) sDynid := ldr.SymDynid(s)
lep := ldr.MakeSymbolUpdater(syms.LinkEditPLT2) lep := ldr.MakeSymbolUpdater(syms.LinkEditPLT)
lep.AddUint32(target.Arch, uint32(sDynid)) lep.AddUint32(target.Arch, uint32(sDynid))
// jmpq *got+size(IP) // jmpq *got+size(IP)
@ -651,29 +651,29 @@ func addpltsym2(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s load
plt.AddUint8(0xff) plt.AddUint8(0xff)
plt.AddUint8(0x25) plt.AddUint8(0x25)
plt.AddPCRelPlus(target.Arch, syms.GOT2, int64(ldr.SymGot(s))) plt.AddPCRelPlus(target.Arch, syms.GOT, int64(ldr.SymGot(s)))
} else { } else {
ldr.Errorf(s, "addpltsym: unsupported binary format") ldr.Errorf(s, "addpltsym: unsupported binary format")
} }
} }
func addgotsym2(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loader.Sym) { func addgotsym(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loader.Sym) {
if ldr.SymGot(s) >= 0 { if ldr.SymGot(s) >= 0 {
return return
} }
ld.Adddynsym2(ldr, target, syms, s) ld.Adddynsym(ldr, target, syms, s)
got := ldr.MakeSymbolUpdater(syms.GOT2) got := ldr.MakeSymbolUpdater(syms.GOT)
ldr.SetGot(s, int32(got.Size())) ldr.SetGot(s, int32(got.Size()))
got.AddUint64(target.Arch, 0) got.AddUint64(target.Arch, 0)
if target.IsElf() { if target.IsElf() {
rela := ldr.MakeSymbolUpdater(syms.Rela2) rela := ldr.MakeSymbolUpdater(syms.Rela)
rela.AddAddrPlus(target.Arch, got.Sym(), int64(ldr.SymGot(s))) rela.AddAddrPlus(target.Arch, got.Sym(), int64(ldr.SymGot(s)))
rela.AddUint64(target.Arch, ld.ELF64_R_INFO(uint32(ldr.SymDynid(s)), uint32(elf.R_X86_64_GLOB_DAT))) rela.AddUint64(target.Arch, ld.ELF64_R_INFO(uint32(ldr.SymDynid(s)), uint32(elf.R_X86_64_GLOB_DAT)))
rela.AddUint64(target.Arch, 0) rela.AddUint64(target.Arch, 0)
} else if target.IsDarwin() { } else if target.IsDarwin() {
leg := ldr.MakeSymbolUpdater(syms.LinkEditGOT2) leg := ldr.MakeSymbolUpdater(syms.LinkEditGOT)
leg.AddUint32(target.Arch, uint32(ldr.SymDynid(s))) leg.AddUint32(target.Arch, uint32(ldr.SymDynid(s)))
} else { } else {
ldr.Errorf(s, "addgotsym: unsupported binary format") ldr.Errorf(s, "addgotsym: unsupported binary format")
@ -809,7 +809,7 @@ func asmb2(ctxt *ld.Link, _ *loader.Loader) {
ctxt.Out.Write32b(uint32(ld.Segdata.Filelen)) ctxt.Out.Write32b(uint32(ld.Segdata.Filelen))
ctxt.Out.Write32b(uint32(ld.Segdata.Length - ld.Segdata.Filelen)) ctxt.Out.Write32b(uint32(ld.Segdata.Length - ld.Segdata.Filelen))
ctxt.Out.Write32b(uint32(ld.Symsize)) /* nsyms */ ctxt.Out.Write32b(uint32(ld.Symsize)) /* nsyms */
vl := ld.Entryvalue2(ctxt) vl := ld.Entryvalue(ctxt)
ctxt.Out.Write32b(PADDR(uint32(vl))) /* va of entry */ ctxt.Out.Write32b(PADDR(uint32(vl))) /* va of entry */
ctxt.Out.Write32b(uint32(ld.Spsize)) /* sp offsets */ ctxt.Out.Write32b(uint32(ld.Spsize)) /* sp offsets */
ctxt.Out.Write32b(uint32(ld.Lcsize)) /* line offsets */ ctxt.Out.Write32b(uint32(ld.Lcsize)) /* line offsets */

View File

@ -57,9 +57,9 @@ func Init() (*sys.Arch, ld.Arch) {
Archrelocvariant: archrelocvariant, Archrelocvariant: archrelocvariant,
Asmb: asmb, Asmb: asmb,
Asmb2: asmb2, Asmb2: asmb2,
Elfreloc2: elfreloc2, Elfreloc1: elfreloc1,
Elfsetupplt: elfsetupplt, Elfsetupplt: elfsetupplt,
Gentext2: gentext2, Gentext: gentext,
Machoreloc1: machoreloc1, Machoreloc1: machoreloc1,
PEreloc1: pereloc1, PEreloc1: pereloc1,
TLSIEtoLE: tlsIEtoLE, TLSIEtoLE: tlsIEtoLE,

View File

@ -63,7 +63,7 @@ import (
// c: 00000004 .word 0x00000004 // c: 00000004 .word 0x00000004
// c: R_ARM_GOT_PREL local.moduledata // c: R_ARM_GOT_PREL local.moduledata
func gentext2(ctxt *ld.Link, ldr *loader.Loader) { func gentext(ctxt *ld.Link, ldr *loader.Loader) {
initfunc, addmoduledata := ld.PrepareAddmoduledata(ctxt) initfunc, addmoduledata := ld.PrepareAddmoduledata(ctxt)
if initfunc == nil { if initfunc == nil {
return return
@ -91,7 +91,7 @@ func gentext2(ctxt *ld.Link, ldr *loader.Loader) {
Off: 12, Off: 12,
Size: 4, Size: 4,
Type: objabi.R_PCREL, Type: objabi.R_PCREL,
Sym: ctxt.Moduledata2, Sym: ctxt.Moduledata,
Add: 4, Add: 4,
} }
initfunc.AddReloc(rel2) initfunc.AddReloc(rel2)
@ -124,8 +124,8 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade
su.SetRelocType(rIdx, objabi.R_CALLARM) su.SetRelocType(rIdx, objabi.R_CALLARM)
if targType == sym.SDYNIMPORT { if targType == sym.SDYNIMPORT {
addpltsym2(target, ldr, syms, targ) addpltsym(target, ldr, syms, targ)
su.SetRelocSym(rIdx, syms.PLT2) su.SetRelocSym(rIdx, syms.PLT)
su.SetRelocAdd(rIdx, int64(braddoff(int32(r.Add()), ldr.SymPlt(targ)/4))) su.SetRelocAdd(rIdx, int64(braddoff(int32(r.Add()), ldr.SymPlt(targ)/4)))
} }
@ -137,9 +137,9 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade
case objabi.ElfRelocOffset + objabi.RelocType(elf.R_ARM_GOT32): // R_ARM_GOT_BREL case objabi.ElfRelocOffset + objabi.RelocType(elf.R_ARM_GOT32): // R_ARM_GOT_BREL
if targType != sym.SDYNIMPORT { if targType != sym.SDYNIMPORT {
addgotsyminternal2(target, ldr, syms, targ) addgotsyminternal(target, ldr, syms, targ)
} else { } else {
addgotsym2(target, ldr, syms, targ) addgotsym(target, ldr, syms, targ)
} }
su := ldr.MakeSymbolUpdater(s) su := ldr.MakeSymbolUpdater(s)
@ -150,13 +150,13 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade
case objabi.ElfRelocOffset + objabi.RelocType(elf.R_ARM_GOT_PREL): // GOT(nil) + A - nil case objabi.ElfRelocOffset + objabi.RelocType(elf.R_ARM_GOT_PREL): // GOT(nil) + A - nil
if targType != sym.SDYNIMPORT { if targType != sym.SDYNIMPORT {
addgotsyminternal2(target, ldr, syms, targ) addgotsyminternal(target, ldr, syms, targ)
} else { } else {
addgotsym2(target, ldr, syms, targ) addgotsym(target, ldr, syms, targ)
} }
su := ldr.MakeSymbolUpdater(s) su := ldr.MakeSymbolUpdater(s)
su.SetRelocType(rIdx, objabi.R_PCREL) su.SetRelocType(rIdx, objabi.R_PCREL)
su.SetRelocSym(rIdx, syms.GOT2) su.SetRelocSym(rIdx, syms.GOT)
su.SetRelocAdd(rIdx, r.Add()+4+int64(ldr.SymGot(targ))) su.SetRelocAdd(rIdx, r.Add()+4+int64(ldr.SymGot(targ)))
return true return true
@ -168,7 +168,7 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade
case objabi.ElfRelocOffset + objabi.RelocType(elf.R_ARM_GOTPC): // R_ARM_BASE_PREL case objabi.ElfRelocOffset + objabi.RelocType(elf.R_ARM_GOTPC): // R_ARM_BASE_PREL
su := ldr.MakeSymbolUpdater(s) su := ldr.MakeSymbolUpdater(s)
su.SetRelocType(rIdx, objabi.R_PCREL) su.SetRelocType(rIdx, objabi.R_PCREL)
su.SetRelocSym(rIdx, syms.GOT2) su.SetRelocSym(rIdx, syms.GOT)
su.SetRelocAdd(rIdx, r.Add()+4) su.SetRelocAdd(rIdx, r.Add()+4)
return true return true
@ -176,8 +176,8 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade
su := ldr.MakeSymbolUpdater(s) su := ldr.MakeSymbolUpdater(s)
su.SetRelocType(rIdx, objabi.R_CALLARM) su.SetRelocType(rIdx, objabi.R_CALLARM)
if targType == sym.SDYNIMPORT { if targType == sym.SDYNIMPORT {
addpltsym2(target, ldr, syms, targ) addpltsym(target, ldr, syms, targ)
su.SetRelocSym(rIdx, syms.PLT2) su.SetRelocSym(rIdx, syms.PLT)
su.SetRelocAdd(rIdx, int64(braddoff(int32(r.Add()), ldr.SymPlt(targ)/4))) su.SetRelocAdd(rIdx, int64(braddoff(int32(r.Add()), ldr.SymPlt(targ)/4)))
} }
return true return true
@ -201,8 +201,8 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade
su := ldr.MakeSymbolUpdater(s) su := ldr.MakeSymbolUpdater(s)
su.SetRelocType(rIdx, objabi.R_CALLARM) su.SetRelocType(rIdx, objabi.R_CALLARM)
if targType == sym.SDYNIMPORT { if targType == sym.SDYNIMPORT {
addpltsym2(target, ldr, syms, targ) addpltsym(target, ldr, syms, targ)
su.SetRelocSym(rIdx, syms.PLT2) su.SetRelocSym(rIdx, syms.PLT)
su.SetRelocAdd(rIdx, int64(braddoff(int32(r.Add()), ldr.SymPlt(targ)/4))) su.SetRelocAdd(rIdx, int64(braddoff(int32(r.Add()), ldr.SymPlt(targ)/4)))
} }
@ -224,9 +224,9 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade
// External linker will do this relocation. // External linker will do this relocation.
return true return true
} }
addpltsym2(target, ldr, syms, targ) addpltsym(target, ldr, syms, targ)
su := ldr.MakeSymbolUpdater(s) su := ldr.MakeSymbolUpdater(s)
su.SetRelocSym(rIdx, syms.PLT2) su.SetRelocSym(rIdx, syms.PLT)
su.SetRelocAdd(rIdx, int64(ldr.SymPlt(targ))) su.SetRelocAdd(rIdx, int64(ldr.SymPlt(targ)))
return true return true
@ -235,8 +235,8 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade
break break
} }
if target.IsElf() { if target.IsElf() {
ld.Adddynsym2(ldr, target, syms, targ) ld.Adddynsym(ldr, target, syms, targ)
rel := ldr.MakeSymbolUpdater(syms.Rel2) rel := ldr.MakeSymbolUpdater(syms.Rel)
rel.AddAddrPlus(target.Arch, s, int64(r.Off())) rel.AddAddrPlus(target.Arch, s, int64(r.Off()))
rel.AddUint32(target.Arch, ld.ELF32_R_INFO(uint32(ldr.SymDynid(targ)), uint32(elf.R_ARM_GLOB_DAT))) // we need a nil + A dynamic reloc rel.AddUint32(target.Arch, ld.ELF32_R_INFO(uint32(ldr.SymDynid(targ)), uint32(elf.R_ARM_GLOB_DAT))) // we need a nil + A dynamic reloc
su := ldr.MakeSymbolUpdater(s) su := ldr.MakeSymbolUpdater(s)
@ -249,10 +249,10 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade
return false return false
} }
func elfreloc2(ctxt *ld.Link, ldr *loader.Loader, s loader.Sym, r loader.ExtRelocView, sectoff int64) bool { func elfreloc1(ctxt *ld.Link, ldr *loader.Loader, s loader.Sym, r loader.ExtRelocView, sectoff int64) bool {
ctxt.Out.Write32(uint32(sectoff)) ctxt.Out.Write32(uint32(sectoff))
elfsym := ld.ElfSymForReloc2(ctxt, r.Xsym) elfsym := ld.ElfSymForReloc(ctxt, r.Xsym)
siz := r.Siz() siz := r.Siz()
switch r.Type() { switch r.Type() {
default: default:
@ -557,14 +557,14 @@ func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loade
// The following three arch specific relocations are only for generation of // The following three arch specific relocations are only for generation of
// Linux/ARM ELF's PLT entry (3 assembler instruction) // Linux/ARM ELF's PLT entry (3 assembler instruction)
case objabi.R_PLT0: // add ip, pc, #0xXX00000 case objabi.R_PLT0: // add ip, pc, #0xXX00000
if ldr.SymValue(syms.GOTPLT2) < ldr.SymValue(syms.PLT2) { if ldr.SymValue(syms.GOTPLT) < ldr.SymValue(syms.PLT) {
ldr.Errorf(s, ".got.plt should be placed after .plt section.") ldr.Errorf(s, ".got.plt should be placed after .plt section.")
} }
return 0xe28fc600 + (0xff & (int64(uint32(ldr.SymValue(rs)-(ldr.SymValue(syms.PLT2)+int64(r.Off()))+r.Add())) >> 20)), noExtReloc, isOk return 0xe28fc600 + (0xff & (int64(uint32(ldr.SymValue(rs)-(ldr.SymValue(syms.PLT)+int64(r.Off()))+r.Add())) >> 20)), noExtReloc, isOk
case objabi.R_PLT1: // add ip, ip, #0xYY000 case objabi.R_PLT1: // add ip, ip, #0xYY000
return 0xe28cca00 + (0xff & (int64(uint32(ldr.SymValue(rs)-(ldr.SymValue(syms.PLT2)+int64(r.Off()))+r.Add()+4)) >> 12)), noExtReloc, isOk return 0xe28cca00 + (0xff & (int64(uint32(ldr.SymValue(rs)-(ldr.SymValue(syms.PLT)+int64(r.Off()))+r.Add()+4)) >> 12)), noExtReloc, isOk
case objabi.R_PLT2: // ldr pc, [ip, #0xZZZ]! case objabi.R_PLT2: // ldr pc, [ip, #0xZZZ]!
return 0xe5bcf000 + (0xfff & int64(uint32(ldr.SymValue(rs)-(ldr.SymValue(syms.PLT2)+int64(r.Off()))+r.Add()+8))), noExtReloc, isOk return 0xe5bcf000 + (0xfff & int64(uint32(ldr.SymValue(rs)-(ldr.SymValue(syms.PLT)+int64(r.Off()))+r.Add()+8))), noExtReloc, isOk
case objabi.R_CALLARM: // bl XXXXXX or b YYYYYY case objabi.R_CALLARM: // bl XXXXXX or b YYYYYY
// r.Add is the instruction // r.Add is the instruction
// low 24-bit encodes the target address // low 24-bit encodes the target address
@ -583,7 +583,7 @@ func archrelocvariant(*ld.Target, *loader.Loader, loader.Reloc2, sym.RelocVarian
return -1 return -1
} }
func addpltreloc2(ldr *loader.Loader, plt *loader.SymbolBuilder, got *loader.SymbolBuilder, s loader.Sym, typ objabi.RelocType) { func addpltreloc(ldr *loader.Loader, plt *loader.SymbolBuilder, got *loader.SymbolBuilder, s loader.Sym, typ objabi.RelocType) {
r, _ := plt.AddRel(typ) r, _ := plt.AddRel(typ)
r.SetSym(got.Sym()) r.SetSym(got.Sym())
r.SetOff(int32(plt.Size())) r.SetOff(int32(plt.Size()))
@ -595,17 +595,17 @@ func addpltreloc2(ldr *loader.Loader, plt *loader.SymbolBuilder, got *loader.Sym
plt.Grow(plt.Size()) plt.Grow(plt.Size())
} }
func addpltsym2(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loader.Sym) { func addpltsym(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loader.Sym) {
if ldr.SymPlt(s) >= 0 { if ldr.SymPlt(s) >= 0 {
return return
} }
ld.Adddynsym2(ldr, target, syms, s) ld.Adddynsym(ldr, target, syms, s)
if target.IsElf() { if target.IsElf() {
plt := ldr.MakeSymbolUpdater(syms.PLT2) plt := ldr.MakeSymbolUpdater(syms.PLT)
got := ldr.MakeSymbolUpdater(syms.GOTPLT2) got := ldr.MakeSymbolUpdater(syms.GOTPLT)
rel := ldr.MakeSymbolUpdater(syms.RelPLT2) rel := ldr.MakeSymbolUpdater(syms.RelPLT)
if plt.Size() == 0 { if plt.Size() == 0 {
panic("plt is not set up") panic("plt is not set up")
} }
@ -621,9 +621,9 @@ func addpltsym2(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s load
// .plt entry, this depends on the .got entry // .plt entry, this depends on the .got entry
ldr.SetPlt(s, int32(plt.Size())) ldr.SetPlt(s, int32(plt.Size()))
addpltreloc2(ldr, plt, got, s, objabi.R_PLT0) // add lr, pc, #0xXX00000 addpltreloc(ldr, plt, got, s, objabi.R_PLT0) // add lr, pc, #0xXX00000
addpltreloc2(ldr, plt, got, s, objabi.R_PLT1) // add lr, lr, #0xYY000 addpltreloc(ldr, plt, got, s, objabi.R_PLT1) // add lr, lr, #0xYY000
addpltreloc2(ldr, plt, got, s, objabi.R_PLT2) // ldr pc, [lr, #0xZZZ]! addpltreloc(ldr, plt, got, s, objabi.R_PLT2) // ldr pc, [lr, #0xZZZ]!
// rel // rel
rel.AddAddrPlus(target.Arch, got.Sym(), int64(ldr.SymGot(s))) rel.AddAddrPlus(target.Arch, got.Sym(), int64(ldr.SymGot(s)))
@ -634,12 +634,12 @@ func addpltsym2(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s load
} }
} }
func addgotsyminternal2(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loader.Sym) { func addgotsyminternal(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loader.Sym) {
if ldr.SymGot(s) >= 0 { if ldr.SymGot(s) >= 0 {
return return
} }
got := ldr.MakeSymbolUpdater(syms.GOT2) got := ldr.MakeSymbolUpdater(syms.GOT)
ldr.SetGot(s, int32(got.Size())) ldr.SetGot(s, int32(got.Size()))
got.AddAddrPlus(target.Arch, s, 0) got.AddAddrPlus(target.Arch, s, 0)
@ -649,18 +649,18 @@ func addgotsyminternal2(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms
} }
} }
func addgotsym2(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loader.Sym) { func addgotsym(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loader.Sym) {
if ldr.SymGot(s) >= 0 { if ldr.SymGot(s) >= 0 {
return return
} }
ld.Adddynsym2(ldr, target, syms, s) ld.Adddynsym(ldr, target, syms, s)
got := ldr.MakeSymbolUpdater(syms.GOT2) got := ldr.MakeSymbolUpdater(syms.GOT)
ldr.SetGot(s, int32(got.Size())) ldr.SetGot(s, int32(got.Size()))
got.AddUint64(target.Arch, 0) got.AddUint64(target.Arch, 0)
if target.IsElf() { if target.IsElf() {
rel := ldr.MakeSymbolUpdater(syms.Rel2) rel := ldr.MakeSymbolUpdater(syms.Rel)
rel.AddAddrPlus(target.Arch, got.Sym(), int64(ldr.SymGot(s))) rel.AddAddrPlus(target.Arch, got.Sym(), int64(ldr.SymGot(s)))
rel.AddUint32(target.Arch, ld.ELF32_R_INFO(uint32(ldr.SymDynid(s)), uint32(elf.R_ARM_GLOB_DAT))) rel.AddUint32(target.Arch, ld.ELF32_R_INFO(uint32(ldr.SymDynid(s)), uint32(elf.R_ARM_GLOB_DAT)))
} else { } else {
@ -748,8 +748,8 @@ func asmb2(ctxt *ld.Link, _ *loader.Loader) {
ctxt.Out.Write32b(uint32(ld.Segtext.Filelen)) /* sizes */ ctxt.Out.Write32b(uint32(ld.Segtext.Filelen)) /* sizes */
ctxt.Out.Write32b(uint32(ld.Segdata.Filelen)) ctxt.Out.Write32b(uint32(ld.Segdata.Filelen))
ctxt.Out.Write32b(uint32(ld.Segdata.Length - ld.Segdata.Filelen)) ctxt.Out.Write32b(uint32(ld.Segdata.Length - ld.Segdata.Filelen))
ctxt.Out.Write32b(uint32(ld.Symsize)) /* nsyms */ ctxt.Out.Write32b(uint32(ld.Symsize)) /* nsyms */
ctxt.Out.Write32b(uint32(ld.Entryvalue2(ctxt))) /* va of entry */ ctxt.Out.Write32b(uint32(ld.Entryvalue(ctxt))) /* va of entry */
ctxt.Out.Write32b(0) ctxt.Out.Write32b(0)
ctxt.Out.Write32b(uint32(ld.Lcsize)) ctxt.Out.Write32b(uint32(ld.Lcsize))

View File

@ -53,9 +53,9 @@ func Init() (*sys.Arch, ld.Arch) {
Trampoline: trampoline, Trampoline: trampoline,
Asmb: asmb, Asmb: asmb,
Asmb2: asmb2, Asmb2: asmb2,
Elfreloc2: elfreloc2, Elfreloc1: elfreloc1,
Elfsetupplt: elfsetupplt, Elfsetupplt: elfsetupplt,
Gentext2: gentext2, Gentext: gentext,
Machoreloc1: machoreloc1, Machoreloc1: machoreloc1,
PEreloc1: pereloc1, PEreloc1: pereloc1,

View File

@ -42,7 +42,7 @@ import (
"sync" "sync"
) )
func gentext2(ctxt *ld.Link, ldr *loader.Loader) { func gentext(ctxt *ld.Link, ldr *loader.Loader) {
initfunc, addmoduledata := ld.PrepareAddmoduledata(ctxt) initfunc, addmoduledata := ld.PrepareAddmoduledata(ctxt)
if initfunc == nil { if initfunc == nil {
return return
@ -62,7 +62,7 @@ func gentext2(ctxt *ld.Link, ldr *loader.Loader) {
Off: 0, Off: 0,
Size: 8, Size: 8,
Type: objabi.R_ADDRARM64, Type: objabi.R_ADDRARM64,
Sym: ctxt.Moduledata2, Sym: ctxt.Moduledata,
} }
initfunc.AddReloc(rel) initfunc.AddReloc(rel)
@ -123,9 +123,9 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade
case objabi.ElfRelocOffset + objabi.RelocType(elf.R_AARCH64_CALL26), case objabi.ElfRelocOffset + objabi.RelocType(elf.R_AARCH64_CALL26),
objabi.ElfRelocOffset + objabi.RelocType(elf.R_AARCH64_JUMP26): objabi.ElfRelocOffset + objabi.RelocType(elf.R_AARCH64_JUMP26):
if targType == sym.SDYNIMPORT { if targType == sym.SDYNIMPORT {
addpltsym2(target, ldr, syms, targ) addpltsym(target, ldr, syms, targ)
su := ldr.MakeSymbolUpdater(s) su := ldr.MakeSymbolUpdater(s)
su.SetRelocSym(rIdx, syms.PLT2) su.SetRelocSym(rIdx, syms.PLT)
su.SetRelocAdd(rIdx, r.Add()+int64(ldr.SymPlt(targ))) su.SetRelocAdd(rIdx, r.Add()+int64(ldr.SymPlt(targ)))
} }
if (targType == 0 || targType == sym.SXREF) && !ldr.AttrVisibilityHidden(targ) { if (targType == 0 || targType == sym.SXREF) && !ldr.AttrVisibilityHidden(targ) {
@ -144,10 +144,10 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade
// fall back to using GOT // fall back to using GOT
// TODO: just needs relocation, no need to put in .dynsym // TODO: just needs relocation, no need to put in .dynsym
addgotsym2(target, ldr, syms, targ) addgotsym(target, ldr, syms, targ)
su := ldr.MakeSymbolUpdater(s) su := ldr.MakeSymbolUpdater(s)
su.SetRelocType(rIdx, objabi.R_ARM64_GOT) su.SetRelocType(rIdx, objabi.R_ARM64_GOT)
su.SetRelocSym(rIdx, syms.GOT2) su.SetRelocSym(rIdx, syms.GOT)
su.SetRelocAdd(rIdx, r.Add()+int64(ldr.SymGot(targ))) su.SetRelocAdd(rIdx, r.Add()+int64(ldr.SymGot(targ)))
return true return true
@ -233,9 +233,9 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade
// The code is asking for the address of an external // The code is asking for the address of an external
// function. We provide it with the address of the // function. We provide it with the address of the
// correspondent GOT symbol. // correspondent GOT symbol.
addgotsym2(target, ldr, syms, targ) addgotsym(target, ldr, syms, targ)
su := ldr.MakeSymbolUpdater(s) su := ldr.MakeSymbolUpdater(s)
su.SetRelocSym(rIdx, syms.GOT2) su.SetRelocSym(rIdx, syms.GOT)
su.SetRelocAdd(rIdx, r.Add()+int64(ldr.SymGot(targ))) su.SetRelocAdd(rIdx, r.Add()+int64(ldr.SymGot(targ)))
return true return true
} }
@ -307,7 +307,7 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade
// AddAddrPlus is used for r_offset and r_addend to // AddAddrPlus is used for r_offset and r_addend to
// generate new R_ADDR relocations that will update // generate new R_ADDR relocations that will update
// these fields in the 'reloc' phase. // these fields in the 'reloc' phase.
rela := ldr.MakeSymbolUpdater(syms.Rela2) rela := ldr.MakeSymbolUpdater(syms.Rela)
rela.AddAddrPlus(target.Arch, s, int64(r.Off())) rela.AddAddrPlus(target.Arch, s, int64(r.Off()))
if r.Siz() == 8 { if r.Siz() == 8 {
rela.AddUint64(target.Arch, ld.ELF64_R_INFO(0, uint32(elf.R_AARCH64_RELATIVE))) rela.AddUint64(target.Arch, ld.ELF64_R_INFO(0, uint32(elf.R_AARCH64_RELATIVE)))
@ -325,10 +325,10 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade
return false return false
} }
func elfreloc2(ctxt *ld.Link, ldr *loader.Loader, s loader.Sym, r loader.ExtRelocView, sectoff int64) bool { func elfreloc1(ctxt *ld.Link, ldr *loader.Loader, s loader.Sym, r loader.ExtRelocView, sectoff int64) bool {
ctxt.Out.Write64(uint64(sectoff)) ctxt.Out.Write64(uint64(sectoff))
elfsym := ld.ElfSymForReloc2(ctxt, r.Xsym) elfsym := ld.ElfSymForReloc(ctxt, r.Xsym)
siz := r.Siz() siz := r.Siz()
switch r.Type() { switch r.Type() {
default: default:
@ -591,7 +591,7 @@ func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loade
case objabi.R_CALLARM64: case objabi.R_CALLARM64:
var t int64 var t int64
if ldr.SymType(rs) == sym.SDYNIMPORT { if ldr.SymType(rs) == sym.SDYNIMPORT {
t = (ldr.SymAddr(syms.PLT2) + r.Add()) - (ldr.SymValue(s) + int64(r.Off())) t = (ldr.SymAddr(syms.PLT) + r.Add()) - (ldr.SymValue(s) + int64(r.Off()))
} else { } else {
t = (ldr.SymAddr(rs) + r.Add()) - (ldr.SymValue(s) + int64(r.Off())) t = (ldr.SymAddr(rs) + r.Add()) - (ldr.SymValue(s) + int64(r.Off()))
} }
@ -724,17 +724,17 @@ func elfsetupplt(ctxt *ld.Link, plt, gotplt *loader.SymbolBuilder, dynamic loade
} }
} }
func addpltsym2(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loader.Sym) { func addpltsym(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loader.Sym) {
if ldr.SymPlt(s) >= 0 { if ldr.SymPlt(s) >= 0 {
return return
} }
ld.Adddynsym2(ldr, target, syms, s) ld.Adddynsym(ldr, target, syms, s)
if target.IsElf() { if target.IsElf() {
plt := ldr.MakeSymbolUpdater(syms.PLT2) plt := ldr.MakeSymbolUpdater(syms.PLT)
gotplt := ldr.MakeSymbolUpdater(syms.GOTPLT2) gotplt := ldr.MakeSymbolUpdater(syms.GOTPLT)
rela := ldr.MakeSymbolUpdater(syms.RelaPLT2) rela := ldr.MakeSymbolUpdater(syms.RelaPLT)
if plt.Size() == 0 { if plt.Size() == 0 {
panic("plt is not set up") panic("plt is not set up")
} }
@ -777,18 +777,18 @@ func addpltsym2(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s load
} }
} }
func addgotsym2(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loader.Sym) { func addgotsym(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loader.Sym) {
if ldr.SymGot(s) >= 0 { if ldr.SymGot(s) >= 0 {
return return
} }
ld.Adddynsym2(ldr, target, syms, s) ld.Adddynsym(ldr, target, syms, s)
got := ldr.MakeSymbolUpdater(syms.GOT2) got := ldr.MakeSymbolUpdater(syms.GOT)
ldr.SetGot(s, int32(got.Size())) ldr.SetGot(s, int32(got.Size()))
got.AddUint64(target.Arch, 0) got.AddUint64(target.Arch, 0)
if target.IsElf() { if target.IsElf() {
rela := ldr.MakeSymbolUpdater(syms.Rela2) rela := ldr.MakeSymbolUpdater(syms.Rela)
rela.AddAddrPlus(target.Arch, got.Sym(), int64(ldr.SymGot(s))) rela.AddAddrPlus(target.Arch, got.Sym(), int64(ldr.SymGot(s)))
rela.AddUint64(target.Arch, ld.ELF64_R_INFO(uint32(ldr.SymDynid(s)), uint32(elf.R_AARCH64_GLOB_DAT))) rela.AddUint64(target.Arch, ld.ELF64_R_INFO(uint32(ldr.SymDynid(s)), uint32(elf.R_AARCH64_GLOB_DAT)))
rela.AddUint64(target.Arch, 0) rela.AddUint64(target.Arch, 0)
@ -883,8 +883,8 @@ func asmb2(ctxt *ld.Link, _ *loader.Loader) {
ctxt.Out.Write32(uint32(ld.Segtext.Filelen)) /* sizes */ ctxt.Out.Write32(uint32(ld.Segtext.Filelen)) /* sizes */
ctxt.Out.Write32(uint32(ld.Segdata.Filelen)) ctxt.Out.Write32(uint32(ld.Segdata.Filelen))
ctxt.Out.Write32(uint32(ld.Segdata.Length - ld.Segdata.Filelen)) ctxt.Out.Write32(uint32(ld.Segdata.Length - ld.Segdata.Filelen))
ctxt.Out.Write32(uint32(ld.Symsize)) /* nsyms */ ctxt.Out.Write32(uint32(ld.Symsize)) /* nsyms */
ctxt.Out.Write32(uint32(ld.Entryvalue2(ctxt))) /* va of entry */ ctxt.Out.Write32(uint32(ld.Entryvalue(ctxt))) /* va of entry */
ctxt.Out.Write32(0) ctxt.Out.Write32(0)
ctxt.Out.Write32(uint32(ld.Lcsize)) ctxt.Out.Write32(uint32(ld.Lcsize))

View File

@ -52,9 +52,9 @@ func Init() (*sys.Arch, ld.Arch) {
Archrelocvariant: archrelocvariant, Archrelocvariant: archrelocvariant,
Asmb: asmb, Asmb: asmb,
Asmb2: asmb2, Asmb2: asmb2,
Elfreloc2: elfreloc2, Elfreloc1: elfreloc1,
Elfsetupplt: elfsetupplt, Elfsetupplt: elfsetupplt,
Gentext2: gentext2, Gentext: gentext,
Machoreloc1: machoreloc1, Machoreloc1: machoreloc1,
Androiddynld: "/system/bin/linker64", Androiddynld: "/system/bin/linker64",

View File

@ -282,7 +282,7 @@ func (st *relocSymState) relocsym(s loader.Sym, P []byte) {
needExtReloc = true needExtReloc = true
rr.Xsym = rs rr.Xsym = rs
if rr.Xsym == 0 { if rr.Xsym == 0 {
rr.Xsym = syms.Tlsg2 rr.Xsym = syms.Tlsg
} }
rr.Xadd = r.Add() rr.Xadd = r.Add()
o = 0 o = 0
@ -313,7 +313,7 @@ func (st *relocSymState) relocsym(s loader.Sym, P []byte) {
needExtReloc = true needExtReloc = true
rr.Xsym = rs rr.Xsym = rs
if rr.Xsym == 0 { if rr.Xsym == 0 {
rr.Xsym = syms.Tlsg2 rr.Xsym = syms.Tlsg
} }
rr.Xadd = r.Add() rr.Xadd = r.Add()
o = 0 o = 0
@ -410,7 +410,7 @@ func (st *relocSymState) relocsym(s loader.Sym, P []byte) {
needExtReloc = false needExtReloc = false
} }
rr.Xsym = loader.Sym(ldr.SymSect(rs).Sym2) rr.Xsym = loader.Sym(ldr.SymSect(rs).Sym)
rr.Xadd = r.Add() + ldr.SymValue(rs) - int64(ldr.SymSect(rs).Vaddr) rr.Xadd = r.Add() + ldr.SymValue(rs) - int64(ldr.SymSect(rs).Vaddr)
o = rr.Xadd o = rr.Xadd
@ -437,7 +437,7 @@ func (st *relocSymState) relocsym(s loader.Sym, P []byte) {
case objabi.R_ADDRCUOFF: case objabi.R_ADDRCUOFF:
// debug_range and debug_loc elements use this relocation type to get an // debug_range and debug_loc elements use this relocation type to get an
// offset from the start of the compile unit. // offset from the start of the compile unit.
o = ldr.SymValue(rs) + r.Add() - ldr.SymValue(loader.Sym(ldr.SymUnit(rs).Textp2[0])) o = ldr.SymValue(rs) + r.Add() - ldr.SymValue(loader.Sym(ldr.SymUnit(rs).Textp[0]))
// r.Sym() can be 0 when CALL $(constant) is transformed from absolute PC to relative PC call. // r.Sym() can be 0 when CALL $(constant) is transformed from absolute PC to relative PC call.
case objabi.R_GOTPCREL: case objabi.R_GOTPCREL:
@ -539,7 +539,7 @@ func (st *relocSymState) relocsym(s loader.Sym, P []byte) {
o = r.Add() o = r.Add()
case objabi.R_GOTOFF: case objabi.R_GOTOFF:
o = ldr.SymValue(rs) + r.Add() - ldr.SymValue(syms.GOT2) o = ldr.SymValue(rs) + r.Add() - ldr.SymValue(syms.GOT)
} }
if target.IsPPC64() || target.IsS390X() { if target.IsPPC64() || target.IsS390X() {
@ -650,7 +650,7 @@ func (ctxt *Link) reloc() {
go func() { go func() {
if !ctxt.IsWasm() { // On Wasm, text relocations are applied in Asmb2. if !ctxt.IsWasm() { // On Wasm, text relocations are applied in Asmb2.
st := ctxt.makeRelocSymState() st := ctxt.makeRelocSymState()
for _, s := range ctxt.Textp2 { for _, s := range ctxt.Textp {
st.relocsym(s, ldr.OutData(s)) st.relocsym(s, ldr.OutData(s))
} }
} }
@ -658,14 +658,14 @@ func (ctxt *Link) reloc() {
}() }()
go func() { go func() {
st := ctxt.makeRelocSymState() st := ctxt.makeRelocSymState()
for _, s := range ctxt.datap2 { for _, s := range ctxt.datap {
st.relocsym(s, ldr.OutData(s)) st.relocsym(s, ldr.OutData(s))
} }
wg.Done() wg.Done()
}() }()
go func() { go func() {
st := ctxt.makeRelocSymState() st := ctxt.makeRelocSymState()
for _, si := range dwarfp2 { for _, si := range dwarfp {
for _, s := range si.syms { for _, s := range si.syms {
st.relocsym(s, ldr.OutData(s)) st.relocsym(s, ldr.OutData(s))
} }
@ -744,14 +744,14 @@ func (ctxt *Link) windynrelocsyms() {
relu := ctxt.loader.MakeSymbolUpdater(rel) relu := ctxt.loader.MakeSymbolUpdater(rel)
relu.SetType(sym.STEXT) relu.SetType(sym.STEXT)
for _, s := range ctxt.Textp2 { for _, s := range ctxt.Textp {
windynrelocsym(ctxt, relu, s) windynrelocsym(ctxt, relu, s)
} }
ctxt.Textp2 = append(ctxt.Textp2, rel) ctxt.Textp = append(ctxt.Textp, rel)
} }
func dynrelocsym2(ctxt *Link, s loader.Sym) { func dynrelocsym(ctxt *Link, s loader.Sym) {
target := &ctxt.Target target := &ctxt.Target
ldr := ctxt.loader ldr := ctxt.loader
syms := &ctxt.ArchSyms syms := &ctxt.ArchSyms
@ -778,7 +778,7 @@ func dynrelocsym2(ctxt *Link, s loader.Sym) {
} }
} }
func (state *dodataState) dynreloc2(ctxt *Link) { func (state *dodataState) dynreloc(ctxt *Link) {
if ctxt.HeadType == objabi.Hwindows { if ctxt.HeadType == objabi.Hwindows {
return return
} }
@ -788,16 +788,16 @@ func (state *dodataState) dynreloc2(ctxt *Link) {
return return
} }
for _, s := range ctxt.Textp2 { for _, s := range ctxt.Textp {
dynrelocsym2(ctxt, s) dynrelocsym(ctxt, s)
} }
for _, syms := range state.data2 { for _, syms := range state.data {
for _, s := range syms { for _, s := range syms {
dynrelocsym2(ctxt, s) dynrelocsym(ctxt, s)
} }
} }
if ctxt.IsELF { if ctxt.IsELF {
elfdynhash2(ctxt) elfdynhash(ctxt)
} }
} }
@ -806,7 +806,7 @@ func Codeblk(ctxt *Link, out *OutBuf, addr int64, size int64) {
} }
func CodeblkPad(ctxt *Link, out *OutBuf, addr int64, size int64, pad []byte) { func CodeblkPad(ctxt *Link, out *OutBuf, addr int64, size int64, pad []byte) {
writeBlocks(out, ctxt.outSem, ctxt.loader, ctxt.Textp2, addr, size, pad) writeBlocks(out, ctxt.outSem, ctxt.loader, ctxt.Textp, addr, size, pad)
} }
const blockSize = 1 << 20 // 1MB chunks written at a time. const blockSize = 1 << 20 // 1MB chunks written at a time.
@ -978,7 +978,7 @@ func DatblkBytes(ctxt *Link, addr int64, size int64) []byte {
} }
func writeDatblkToOutBuf(ctxt *Link, out *OutBuf, addr int64, size int64) { func writeDatblkToOutBuf(ctxt *Link, out *OutBuf, addr int64, size int64) {
writeBlocks(out, ctxt.outSem, ctxt.loader, ctxt.datap2, addr, size, zeros[:]) writeBlocks(out, ctxt.outSem, ctxt.loader, ctxt.datap, addr, size, zeros[:])
} }
func Dwarfblk(ctxt *Link, out *OutBuf, addr int64, size int64) { func Dwarfblk(ctxt *Link, out *OutBuf, addr int64, size int64) {
@ -989,12 +989,12 @@ func Dwarfblk(ctxt *Link, out *OutBuf, addr int64, size int64) {
// section, but this would run the risk of undoing any file offset // section, but this would run the risk of undoing any file offset
// adjustments made during layout. // adjustments made during layout.
n := 0 n := 0
for i := range dwarfp2 { for i := range dwarfp {
n += len(dwarfp2[i].syms) n += len(dwarfp[i].syms)
} }
syms := make([]loader.Sym, 0, n) syms := make([]loader.Sym, 0, n)
for i := range dwarfp2 { for i := range dwarfp {
syms = append(syms, dwarfp2[i].syms...) syms = append(syms, dwarfp[i].syms...)
} }
writeBlocks(out, ctxt.outSem, ctxt.loader, syms, addr, size, zeros[:]) writeBlocks(out, ctxt.outSem, ctxt.loader, syms, addr, size, zeros[:])
} }
@ -1092,7 +1092,7 @@ func addinitarrdata(ctxt *Link, ldr *loader.Loader, s loader.Sym) {
} }
// symalign returns the required alignment for the given symbol s. // symalign returns the required alignment for the given symbol s.
func symalign2(ldr *loader.Loader, s loader.Sym) int32 { func symalign(ldr *loader.Loader, s loader.Sym) int32 {
min := int32(thearch.Minalign) min := int32(thearch.Minalign)
align := ldr.SymAlign(s) align := ldr.SymAlign(s)
if align >= min { if align >= min {
@ -1116,19 +1116,19 @@ func symalign2(ldr *loader.Loader, s loader.Sym) int32 {
return align return align
} }
func aligndatsize2(state *dodataState, datsize int64, s loader.Sym) int64 { func aligndatsize(state *dodataState, datsize int64, s loader.Sym) int64 {
return Rnd(datsize, int64(symalign2(state.ctxt.loader, s))) return Rnd(datsize, int64(symalign(state.ctxt.loader, s)))
} }
const debugGCProg = false const debugGCProg = false
type GCProg2 struct { type GCProg struct {
ctxt *Link ctxt *Link
sym *loader.SymbolBuilder sym *loader.SymbolBuilder
w gcprog.Writer w gcprog.Writer
} }
func (p *GCProg2) Init(ctxt *Link, name string) { func (p *GCProg) Init(ctxt *Link, name string) {
p.ctxt = ctxt p.ctxt = ctxt
symIdx := ctxt.loader.LookupOrCreateSym(name, 0) symIdx := ctxt.loader.LookupOrCreateSym(name, 0)
p.sym = ctxt.loader.MakeSymbolUpdater(symIdx) p.sym = ctxt.loader.MakeSymbolUpdater(symIdx)
@ -1139,13 +1139,13 @@ func (p *GCProg2) Init(ctxt *Link, name string) {
} }
} }
func (p *GCProg2) writeByte() func(x byte) { func (p *GCProg) writeByte() func(x byte) {
return func(x byte) { return func(x byte) {
p.sym.AddUint8(x) p.sym.AddUint8(x)
} }
} }
func (p *GCProg2) End(size int64) { func (p *GCProg) End(size int64) {
p.w.ZeroUntil(size / int64(p.ctxt.Arch.PtrSize)) p.w.ZeroUntil(size / int64(p.ctxt.Arch.PtrSize))
p.w.End() p.w.End()
if debugGCProg { if debugGCProg {
@ -1153,7 +1153,7 @@ func (p *GCProg2) End(size int64) {
} }
} }
func (p *GCProg2) AddSym(s loader.Sym) { func (p *GCProg) AddSym(s loader.Sym) {
ldr := p.ctxt.loader ldr := p.ctxt.loader
typ := ldr.SymGoType(s) typ := ldr.SymGoType(s)
@ -1208,7 +1208,7 @@ func (state *dodataState) checkdatsize(symn sym.SymKind) {
} }
// fixZeroSizedSymbols gives a few special symbols with zero size some space. // fixZeroSizedSymbols gives a few special symbols with zero size some space.
func fixZeroSizedSymbols2(ctxt *Link) { func fixZeroSizedSymbols(ctxt *Link) {
// The values in moduledata are filled out by relocations // The values in moduledata are filled out by relocations
// pointing to the addresses of these special symbols. // pointing to the addresses of these special symbols.
// Typically these symbols have no size and are not laid // Typically these symbols have no size and are not laid
@ -1277,7 +1277,7 @@ func fixZeroSizedSymbols2(ctxt *Link) {
} }
// makeRelroForSharedLib creates a section of readonly data if necessary. // makeRelroForSharedLib creates a section of readonly data if necessary.
func (state *dodataState) makeRelroForSharedLib2(target *Link) { func (state *dodataState) makeRelroForSharedLib(target *Link) {
if !target.UseRelro() { if !target.UseRelro() {
return return
} }
@ -1290,9 +1290,9 @@ func (state *dodataState) makeRelroForSharedLib2(target *Link) {
symnrelro := sym.RelROMap[symnro] symnrelro := sym.RelROMap[symnro]
ro := []loader.Sym{} ro := []loader.Sym{}
relro := state.data2[symnrelro] relro := state.data[symnrelro]
for _, s := range state.data2[symnro] { for _, s := range state.data[symnro] {
relocs := ldr.Relocs(s) relocs := ldr.Relocs(s)
isRelro := relocs.Count() > 0 isRelro := relocs.Count() > 0
switch state.symType(s) { switch state.symType(s) {
@ -1334,8 +1334,8 @@ func (state *dodataState) makeRelroForSharedLib2(target *Link) {
} }
} }
state.data2[symnro] = ro state.data[symnro] = ro
state.data2[symnrelro] = relro state.data[symnrelro] = relro
} }
} }
@ -1346,7 +1346,7 @@ type dodataState struct {
// Link context // Link context
ctxt *Link ctxt *Link
// Data symbols bucketed by type. // Data symbols bucketed by type.
data2 [sym.SXREF][]loader.Sym data [sym.SXREF][]loader.Sym
// Max alignment for each flavor of data symbol. // Max alignment for each flavor of data symbol.
dataMaxAlign [sym.SXREF]int32 dataMaxAlign [sym.SXREF]int32
// Overridden sym type // Overridden sym type
@ -1389,10 +1389,10 @@ func (state *dodataState) setSymType(s loader.Sym, kind sym.SymKind) {
} }
} }
func (ctxt *Link) dodata2(symGroupType []sym.SymKind) { func (ctxt *Link) dodata(symGroupType []sym.SymKind) {
// Give zeros sized symbols space if necessary. // Give zeros sized symbols space if necessary.
fixZeroSizedSymbols2(ctxt) fixZeroSizedSymbols(ctxt)
// Collect data symbols by type into data. // Collect data symbols by type into data.
state := dodataState{ctxt: ctxt, symGroupType: symGroupType} state := dodataState{ctxt: ctxt, symGroupType: symGroupType}
@ -1408,7 +1408,7 @@ func (ctxt *Link) dodata2(symGroupType []sym.SymKind) {
if st <= sym.STEXT || st >= sym.SXREF { if st <= sym.STEXT || st >= sym.SXREF {
continue continue
} }
state.data2[st] = append(state.data2[st], s) state.data[st] = append(state.data[st], s)
// Similarly with checking the onlist attr. // Similarly with checking the onlist attr.
if ldr.AttrOnList(s) { if ldr.AttrOnList(s) {
@ -1426,10 +1426,10 @@ func (ctxt *Link) dodata2(symGroupType []sym.SymKind) {
if ctxt.HeadType == objabi.Hdarwin { if ctxt.HeadType == objabi.Hdarwin {
machosymorder(ctxt) machosymorder(ctxt)
} }
state.dynreloc2(ctxt) state.dynreloc(ctxt)
// Move any RO data with relocations to a separate section. // Move any RO data with relocations to a separate section.
state.makeRelroForSharedLib2(ctxt) state.makeRelroForSharedLib(ctxt)
// Set alignment for the symbol with the largest known index, // Set alignment for the symbol with the largest known index,
// so as to trigger allocation of the loader's internal // so as to trigger allocation of the loader's internal
@ -1440,11 +1440,11 @@ func (ctxt *Link) dodata2(symGroupType []sym.SymKind) {
// Sort symbols. // Sort symbols.
var wg sync.WaitGroup var wg sync.WaitGroup
for symn := range state.data2 { for symn := range state.data {
symn := sym.SymKind(symn) symn := sym.SymKind(symn)
wg.Add(1) wg.Add(1)
go func() { go func() {
state.data2[symn], state.dataMaxAlign[symn] = state.dodataSect2(ctxt, symn, state.data2[symn]) state.data[symn], state.dataMaxAlign[symn] = state.dodataSect(ctxt, symn, state.data[symn])
wg.Done() wg.Done()
}() }()
} }
@ -1453,7 +1453,7 @@ func (ctxt *Link) dodata2(symGroupType []sym.SymKind) {
if ctxt.IsELF { if ctxt.IsELF {
// Make .rela and .rela.plt contiguous, the ELF ABI requires this // Make .rela and .rela.plt contiguous, the ELF ABI requires this
// and Solaris actually cares. // and Solaris actually cares.
syms := state.data2[sym.SELFROSECT] syms := state.data[sym.SELFROSECT]
reli, plti := -1, -1 reli, plti := -1, -1
for i, s := range syms { for i, s := range syms {
switch ldr.SymName(s) { switch ldr.SymName(s) {
@ -1482,7 +1482,7 @@ func (ctxt *Link) dodata2(symGroupType []sym.SymKind) {
ldr.SetSymAlign(rel, int32(ctxt.Arch.RegSize)) ldr.SetSymAlign(rel, int32(ctxt.Arch.RegSize))
ldr.SetSymAlign(plt, int32(ctxt.Arch.RegSize)) ldr.SetSymAlign(plt, int32(ctxt.Arch.RegSize))
} }
state.data2[sym.SELFROSECT] = syms state.data[sym.SELFROSECT] = syms
} }
if ctxt.HeadType == objabi.Haix && ctxt.LinkMode == LinkExternal { if ctxt.HeadType == objabi.Haix && ctxt.LinkMode == LinkExternal {
@ -1494,11 +1494,11 @@ func (ctxt *Link) dodata2(symGroupType []sym.SymKind) {
// Create *sym.Section objects and assign symbols to sections for // Create *sym.Section objects and assign symbols to sections for
// data/rodata (and related) symbols. // data/rodata (and related) symbols.
state.allocateDataSections2(ctxt) state.allocateDataSections(ctxt)
// Create *sym.Section objects and assign symbols to sections for // Create *sym.Section objects and assign symbols to sections for
// DWARF symbols. // DWARF symbols.
state.allocateDwarfSections2(ctxt) state.allocateDwarfSections(ctxt)
/* number the sections */ /* number the sections */
n := int16(1) n := int16(1)
@ -1529,11 +1529,11 @@ func (ctxt *Link) dodata2(symGroupType []sym.SymKind) {
// single symbol will be placed. Here "seg" is the segment into which // single symbol will be placed. Here "seg" is the segment into which
// the section will go, "s" is the symbol to be placed into the new // the section will go, "s" is the symbol to be placed into the new
// section, and "rwx" contains permissions for the section. // section, and "rwx" contains permissions for the section.
func (state *dodataState) allocateDataSectionForSym2(seg *sym.Segment, s loader.Sym, rwx int) *sym.Section { func (state *dodataState) allocateDataSectionForSym(seg *sym.Segment, s loader.Sym, rwx int) *sym.Section {
ldr := state.ctxt.loader ldr := state.ctxt.loader
sname := ldr.SymName(s) sname := ldr.SymName(s)
sect := addsection(ldr, state.ctxt.Arch, seg, sname, rwx) sect := addsection(ldr, state.ctxt.Arch, seg, sname, rwx)
sect.Align = symalign2(ldr, s) sect.Align = symalign(ldr, s)
state.datsize = Rnd(state.datsize, int64(sect.Align)) state.datsize = Rnd(state.datsize, int64(sect.Align))
sect.Vaddr = uint64(state.datsize) sect.Vaddr = uint64(state.datsize)
return sect return sect
@ -1569,7 +1569,7 @@ func (state *dodataState) allocateNamedDataSection(seg *sym.Segment, sName strin
// "forceType" (if non-zero) contains a new sym type to apply to each // "forceType" (if non-zero) contains a new sym type to apply to each
// sym during the assignment, and "aligner" is a hook to call to // sym during the assignment, and "aligner" is a hook to call to
// handle alignment during the assignment process. // handle alignment during the assignment process.
func (state *dodataState) assignDsymsToSection2(sect *sym.Section, syms []loader.Sym, forceType sym.SymKind, aligner func(state *dodataState, datsize int64, s loader.Sym) int64) { func (state *dodataState) assignDsymsToSection(sect *sym.Section, syms []loader.Sym, forceType sym.SymKind, aligner func(state *dodataState, datsize int64, s loader.Sym) int64) {
ldr := state.ctxt.loader ldr := state.ctxt.loader
for _, s := range syms { for _, s := range syms {
state.datsize = aligner(state, state.datsize, s) state.datsize = aligner(state, state.datsize, s)
@ -1583,8 +1583,8 @@ func (state *dodataState) assignDsymsToSection2(sect *sym.Section, syms []loader
sect.Length = uint64(state.datsize) - sect.Vaddr sect.Length = uint64(state.datsize) - sect.Vaddr
} }
func (state *dodataState) assignToSection2(sect *sym.Section, symn sym.SymKind, forceType sym.SymKind) { func (state *dodataState) assignToSection(sect *sym.Section, symn sym.SymKind, forceType sym.SymKind) {
state.assignDsymsToSection2(sect, state.data2[symn], forceType, aligndatsize2) state.assignDsymsToSection(sect, state.data[symn], forceType, aligndatsize)
state.checkdatsize(symn) state.checkdatsize(symn)
} }
@ -1594,10 +1594,10 @@ func (state *dodataState) assignToSection2(sect *sym.Section, symn sym.SymKind,
// symbol name. "Seg" is the segment into which to place the new // symbol name. "Seg" is the segment into which to place the new
// section, "forceType" is the new sym.SymKind to assign to the symbol // section, "forceType" is the new sym.SymKind to assign to the symbol
// within the section, and "rwx" holds section permissions. // within the section, and "rwx" holds section permissions.
func (state *dodataState) allocateSingleSymSections2(seg *sym.Segment, symn sym.SymKind, forceType sym.SymKind, rwx int) { func (state *dodataState) allocateSingleSymSections(seg *sym.Segment, symn sym.SymKind, forceType sym.SymKind, rwx int) {
ldr := state.ctxt.loader ldr := state.ctxt.loader
for _, s := range state.data2[symn] { for _, s := range state.data[symn] {
sect := state.allocateDataSectionForSym2(seg, s, rwx) sect := state.allocateDataSectionForSym(seg, s, rwx)
ldr.SetSymSect(s, sect) ldr.SetSymSect(s, sect)
state.setSymType(s, forceType) state.setSymType(s, forceType)
ldr.SetSymValue(s, int64(uint64(state.datsize)-sect.Vaddr)) ldr.SetSymValue(s, int64(uint64(state.datsize)-sect.Vaddr))
@ -1614,16 +1614,16 @@ func (state *dodataState) allocateSingleSymSections2(seg *sym.Segment, symn sym.
// name to give to the new section, "forceType" (if non-zero) contains // name to give to the new section, "forceType" (if non-zero) contains
// a new sym type to apply to each sym during the assignment, and // a new sym type to apply to each sym during the assignment, and
// "rwx" holds section permissions. // "rwx" holds section permissions.
func (state *dodataState) allocateNamedSectionAndAssignSyms2(seg *sym.Segment, secName string, symn sym.SymKind, forceType sym.SymKind, rwx int) *sym.Section { func (state *dodataState) allocateNamedSectionAndAssignSyms(seg *sym.Segment, secName string, symn sym.SymKind, forceType sym.SymKind, rwx int) *sym.Section {
sect := state.allocateNamedDataSection(seg, secName, []sym.SymKind{symn}, rwx) sect := state.allocateNamedDataSection(seg, secName, []sym.SymKind{symn}, rwx)
state.assignDsymsToSection2(sect, state.data2[symn], forceType, aligndatsize2) state.assignDsymsToSection(sect, state.data[symn], forceType, aligndatsize)
return sect return sect
} }
// allocateDataSections allocates sym.Section objects for data/rodata // allocateDataSections allocates sym.Section objects for data/rodata
// (and related) symbols, and then assigns symbols to those sections. // (and related) symbols, and then assigns symbols to those sections.
func (state *dodataState) allocateDataSections2(ctxt *Link) { func (state *dodataState) allocateDataSections(ctxt *Link) {
// Allocate sections. // Allocate sections.
// Data is processed before segtext, because we need // Data is processed before segtext, because we need
// to see all symbols in the .data and .bss sections in order // to see all symbols in the .data and .bss sections in order
@ -1638,15 +1638,15 @@ func (state *dodataState) allocateDataSections2(ctxt *Link) {
sym.SWINDOWS, sym.SWINDOWS,
} }
for _, symn := range writable { for _, symn := range writable {
state.allocateSingleSymSections2(&Segdata, symn, sym.SDATA, 06) state.allocateSingleSymSections(&Segdata, symn, sym.SDATA, 06)
} }
ldr := ctxt.loader ldr := ctxt.loader
// .got (and .toc on ppc64) // .got (and .toc on ppc64)
if len(state.data2[sym.SELFGOT]) > 0 { if len(state.data[sym.SELFGOT]) > 0 {
sect := state.allocateNamedSectionAndAssignSyms2(&Segdata, ".got", sym.SELFGOT, sym.SDATA, 06) sect := state.allocateNamedSectionAndAssignSyms(&Segdata, ".got", sym.SELFGOT, sym.SDATA, 06)
if ctxt.IsPPC64() { if ctxt.IsPPC64() {
for _, s := range state.data2[sym.SELFGOT] { for _, s := range state.data[sym.SELFGOT] {
// Resolve .TOC. symbol for this object file (ppc64) // Resolve .TOC. symbol for this object file (ppc64)
toc := ldr.Lookup(".TOC.", int(ldr.SymVersion(s))) toc := ldr.Lookup(".TOC.", int(ldr.SymVersion(s)))
@ -1660,7 +1660,7 @@ func (state *dodataState) allocateDataSections2(ctxt *Link) {
} }
/* pointer-free data */ /* pointer-free data */
sect := state.allocateNamedSectionAndAssignSyms2(&Segdata, ".noptrdata", sym.SNOPTRDATA, sym.SDATA, 06) sect := state.allocateNamedSectionAndAssignSyms(&Segdata, ".noptrdata", sym.SNOPTRDATA, sym.SDATA, 06)
ldr.SetSymSect(ldr.LookupOrCreateSym("runtime.noptrdata", 0), sect) ldr.SetSymSect(ldr.LookupOrCreateSym("runtime.noptrdata", 0), sect)
ldr.SetSymSect(ldr.LookupOrCreateSym("runtime.enoptrdata", 0), sect) ldr.SetSymSect(ldr.LookupOrCreateSym("runtime.enoptrdata", 0), sect)
@ -1673,29 +1673,29 @@ func (state *dodataState) allocateDataSections2(ctxt *Link) {
} }
if ctxt.HeadType == objabi.Haix { if ctxt.HeadType == objabi.Haix {
if len(state.data2[sym.SINITARR]) > 0 { if len(state.data[sym.SINITARR]) > 0 {
Errorf(nil, "XCOFF format doesn't allow .init_array section") Errorf(nil, "XCOFF format doesn't allow .init_array section")
} }
} }
if hasinitarr && len(state.data2[sym.SINITARR]) > 0 { if hasinitarr && len(state.data[sym.SINITARR]) > 0 {
state.allocateNamedSectionAndAssignSyms2(&Segdata, ".init_array", sym.SINITARR, sym.Sxxx, 06) state.allocateNamedSectionAndAssignSyms(&Segdata, ".init_array", sym.SINITARR, sym.Sxxx, 06)
} }
/* data */ /* data */
sect = state.allocateNamedSectionAndAssignSyms2(&Segdata, ".data", sym.SDATA, sym.SDATA, 06) sect = state.allocateNamedSectionAndAssignSyms(&Segdata, ".data", sym.SDATA, sym.SDATA, 06)
ldr.SetSymSect(ldr.LookupOrCreateSym("runtime.data", 0), sect) ldr.SetSymSect(ldr.LookupOrCreateSym("runtime.data", 0), sect)
ldr.SetSymSect(ldr.LookupOrCreateSym("runtime.edata", 0), sect) ldr.SetSymSect(ldr.LookupOrCreateSym("runtime.edata", 0), sect)
dataGcEnd := state.datsize - int64(sect.Vaddr) dataGcEnd := state.datsize - int64(sect.Vaddr)
// On AIX, TOC entries must be the last of .data // On AIX, TOC entries must be the last of .data
// These aren't part of gc as they won't change during the runtime. // These aren't part of gc as they won't change during the runtime.
state.assignToSection2(sect, sym.SXCOFFTOC, sym.SDATA) state.assignToSection(sect, sym.SXCOFFTOC, sym.SDATA)
state.checkdatsize(sym.SDATA) state.checkdatsize(sym.SDATA)
sect.Length = uint64(state.datsize) - sect.Vaddr sect.Length = uint64(state.datsize) - sect.Vaddr
/* bss */ /* bss */
sect = state.allocateNamedSectionAndAssignSyms2(&Segdata, ".bss", sym.SBSS, sym.Sxxx, 06) sect = state.allocateNamedSectionAndAssignSyms(&Segdata, ".bss", sym.SBSS, sym.Sxxx, 06)
ldr.SetSymSect(ldr.LookupOrCreateSym("runtime.bss", 0), sect) ldr.SetSymSect(ldr.LookupOrCreateSym("runtime.bss", 0), sect)
ldr.SetSymSect(ldr.LookupOrCreateSym("runtime.ebss", 0), sect) ldr.SetSymSect(ldr.LookupOrCreateSym("runtime.ebss", 0), sect)
bssGcEnd := state.datsize - int64(sect.Vaddr) bssGcEnd := state.datsize - int64(sect.Vaddr)
@ -1710,26 +1710,26 @@ func (state *dodataState) allocateDataSections2(ctxt *Link) {
{"runtime.gcbss", sym.SBSS, bssGcEnd}, {"runtime.gcbss", sym.SBSS, bssGcEnd},
} }
for _, g := range gcsToEmit { for _, g := range gcsToEmit {
var gc GCProg2 var gc GCProg
gc.Init(ctxt, g.symName) gc.Init(ctxt, g.symName)
for _, s := range state.data2[g.symKind] { for _, s := range state.data[g.symKind] {
gc.AddSym(s) gc.AddSym(s)
} }
gc.End(g.gcEnd) gc.End(g.gcEnd)
} }
/* pointer-free bss */ /* pointer-free bss */
sect = state.allocateNamedSectionAndAssignSyms2(&Segdata, ".noptrbss", sym.SNOPTRBSS, sym.Sxxx, 06) sect = state.allocateNamedSectionAndAssignSyms(&Segdata, ".noptrbss", sym.SNOPTRBSS, sym.Sxxx, 06)
ldr.SetSymSect(ldr.LookupOrCreateSym("runtime.noptrbss", 0), sect) ldr.SetSymSect(ldr.LookupOrCreateSym("runtime.noptrbss", 0), sect)
ldr.SetSymSect(ldr.LookupOrCreateSym("runtime.enoptrbss", 0), sect) ldr.SetSymSect(ldr.LookupOrCreateSym("runtime.enoptrbss", 0), sect)
ldr.SetSymSect(ldr.LookupOrCreateSym("runtime.end", 0), sect) ldr.SetSymSect(ldr.LookupOrCreateSym("runtime.end", 0), sect)
// Coverage instrumentation counters for libfuzzer. // Coverage instrumentation counters for libfuzzer.
if len(state.data2[sym.SLIBFUZZER_EXTRA_COUNTER]) > 0 { if len(state.data[sym.SLIBFUZZER_EXTRA_COUNTER]) > 0 {
state.allocateNamedSectionAndAssignSyms2(&Segdata, "__libfuzzer_extra_counters", sym.SLIBFUZZER_EXTRA_COUNTER, sym.Sxxx, 06) state.allocateNamedSectionAndAssignSyms(&Segdata, "__libfuzzer_extra_counters", sym.SLIBFUZZER_EXTRA_COUNTER, sym.Sxxx, 06)
} }
if len(state.data2[sym.STLSBSS]) > 0 { if len(state.data[sym.STLSBSS]) > 0 {
var sect *sym.Section var sect *sym.Section
// FIXME: not clear why it is sometimes necessary to suppress .tbss section creation. // FIXME: not clear why it is sometimes necessary to suppress .tbss section creation.
if (ctxt.IsELF || ctxt.HeadType == objabi.Haix) && (ctxt.LinkMode == LinkExternal || !*FlagD) { if (ctxt.IsELF || ctxt.HeadType == objabi.Haix) && (ctxt.LinkMode == LinkExternal || !*FlagD) {
@ -1740,8 +1740,8 @@ func (state *dodataState) allocateDataSections2(ctxt *Link) {
} }
state.datsize = 0 state.datsize = 0
for _, s := range state.data2[sym.STLSBSS] { for _, s := range state.data[sym.STLSBSS] {
state.datsize = aligndatsize2(state, state.datsize, s) state.datsize = aligndatsize(state, state.datsize, s)
if sect != nil { if sect != nil {
ldr.SetSymSect(s, sect) ldr.SetSymSect(s, sect)
} }
@ -1776,11 +1776,11 @@ func (state *dodataState) allocateDataSections2(ctxt *Link) {
state.datsize = 0 state.datsize = 0
/* read-only executable ELF, Mach-O sections */ /* read-only executable ELF, Mach-O sections */
if len(state.data2[sym.STEXT]) != 0 { if len(state.data[sym.STEXT]) != 0 {
culprit := ldr.SymName(state.data2[sym.STEXT][0]) culprit := ldr.SymName(state.data[sym.STEXT][0])
Errorf(nil, "dodata found an sym.STEXT symbol: %s", culprit) Errorf(nil, "dodata found an sym.STEXT symbol: %s", culprit)
} }
state.allocateSingleSymSections2(&Segtext, sym.SELFRXSECT, sym.SRODATA, 04) state.allocateSingleSymSections(&Segtext, sym.SELFRXSECT, sym.SRODATA, 04)
/* read-only data */ /* read-only data */
sect = state.allocateNamedDataSection(segro, ".rodata", sym.ReadOnly, 04) sect = state.allocateNamedDataSection(segro, ".rodata", sym.ReadOnly, 04)
@ -1792,19 +1792,19 @@ func (state *dodataState) allocateDataSections2(ctxt *Link) {
} }
for _, symn := range sym.ReadOnly { for _, symn := range sym.ReadOnly {
symnStartValue := state.datsize symnStartValue := state.datsize
state.assignToSection2(sect, symn, sym.SRODATA) state.assignToSection(sect, symn, sym.SRODATA)
if ctxt.HeadType == objabi.Haix { if ctxt.HeadType == objabi.Haix {
// Read-only symbols might be wrapped inside their outer // Read-only symbols might be wrapped inside their outer
// symbol. // symbol.
// XCOFF symbol table needs to know the size of // XCOFF symbol table needs to know the size of
// these outer symbols. // these outer symbols.
xcoffUpdateOuterSize2(ctxt, state.datsize-symnStartValue, symn) xcoffUpdateOuterSize(ctxt, state.datsize-symnStartValue, symn)
} }
} }
/* read-only ELF, Mach-O sections */ /* read-only ELF, Mach-O sections */
state.allocateSingleSymSections2(segro, sym.SELFROSECT, sym.SRODATA, 04) state.allocateSingleSymSections(segro, sym.SELFROSECT, sym.SRODATA, 04)
state.allocateSingleSymSections2(segro, sym.SMACHOPLT, sym.SRODATA, 04) state.allocateSingleSymSections(segro, sym.SMACHOPLT, sym.SRODATA, 04)
// There is some data that are conceptually read-only but are written to by // There is some data that are conceptually read-only but are written to by
// relocations. On GNU systems, we can arrange for the dynamic linker to // relocations. On GNU systems, we can arrange for the dynamic linker to
@ -1868,19 +1868,19 @@ func (state *dodataState) allocateDataSections2(ctxt *Link) {
symn := sym.RelROMap[symnro] symn := sym.RelROMap[symnro]
symnStartValue := state.datsize symnStartValue := state.datsize
for _, s := range state.data2[symn] { for _, s := range state.data[symn] {
outer := ldr.OuterSym(s) outer := ldr.OuterSym(s)
if s != 0 && ldr.SymSect(outer) != nil && ldr.SymSect(outer) != sect { if s != 0 && ldr.SymSect(outer) != nil && ldr.SymSect(outer) != sect {
ctxt.Errorf(s, "s.Outer (%s) in different section from s, %s != %s", ldr.SymName(outer), ldr.SymSect(outer).Name, sect.Name) ctxt.Errorf(s, "s.Outer (%s) in different section from s, %s != %s", ldr.SymName(outer), ldr.SymSect(outer).Name, sect.Name)
} }
} }
state.assignToSection2(sect, symn, sym.SRODATA) state.assignToSection(sect, symn, sym.SRODATA)
if ctxt.HeadType == objabi.Haix { if ctxt.HeadType == objabi.Haix {
// Read-only symbols might be wrapped inside their outer // Read-only symbols might be wrapped inside their outer
// symbol. // symbol.
// XCOFF symbol table needs to know the size of // XCOFF symbol table needs to know the size of
// these outer symbols. // these outer symbols.
xcoffUpdateOuterSize2(ctxt, state.datsize-symnStartValue, symn) xcoffUpdateOuterSize(ctxt, state.datsize-symnStartValue, symn)
} }
} }
@ -1898,22 +1898,22 @@ func (state *dodataState) allocateDataSections2(ctxt *Link) {
sect.Length = uint64(state.datsize) - sect.Vaddr sect.Length = uint64(state.datsize) - sect.Vaddr
/* itablink */ /* itablink */
sect = state.allocateNamedSectionAndAssignSyms2(seg, genrelrosecname(".itablink"), sym.SITABLINK, sym.Sxxx, relroSecPerm) sect = state.allocateNamedSectionAndAssignSyms(seg, genrelrosecname(".itablink"), sym.SITABLINK, sym.Sxxx, relroSecPerm)
ldr.SetSymSect(ldr.LookupOrCreateSym("runtime.itablink", 0), sect) ldr.SetSymSect(ldr.LookupOrCreateSym("runtime.itablink", 0), sect)
ldr.SetSymSect(ldr.LookupOrCreateSym("runtime.eitablink", 0), sect) ldr.SetSymSect(ldr.LookupOrCreateSym("runtime.eitablink", 0), sect)
if ctxt.HeadType == objabi.Haix { if ctxt.HeadType == objabi.Haix {
// Store .itablink size because its symbols are wrapped // Store .itablink size because its symbols are wrapped
// under an outer symbol: runtime.itablink. // under an outer symbol: runtime.itablink.
xcoffUpdateOuterSize2(ctxt, int64(sect.Length), sym.SITABLINK) xcoffUpdateOuterSize(ctxt, int64(sect.Length), sym.SITABLINK)
} }
/* gosymtab */ /* gosymtab */
sect = state.allocateNamedSectionAndAssignSyms2(seg, genrelrosecname(".gosymtab"), sym.SSYMTAB, sym.SRODATA, relroSecPerm) sect = state.allocateNamedSectionAndAssignSyms(seg, genrelrosecname(".gosymtab"), sym.SSYMTAB, sym.SRODATA, relroSecPerm)
ldr.SetSymSect(ldr.LookupOrCreateSym("runtime.symtab", 0), sect) ldr.SetSymSect(ldr.LookupOrCreateSym("runtime.symtab", 0), sect)
ldr.SetSymSect(ldr.LookupOrCreateSym("runtime.esymtab", 0), sect) ldr.SetSymSect(ldr.LookupOrCreateSym("runtime.esymtab", 0), sect)
/* gopclntab */ /* gopclntab */
sect = state.allocateNamedSectionAndAssignSyms2(seg, genrelrosecname(".gopclntab"), sym.SPCLNTAB, sym.SRODATA, relroSecPerm) sect = state.allocateNamedSectionAndAssignSyms(seg, genrelrosecname(".gopclntab"), sym.SPCLNTAB, sym.SRODATA, relroSecPerm)
ldr.SetSymSect(ldr.LookupOrCreateSym("runtime.pclntab", 0), sect) ldr.SetSymSect(ldr.LookupOrCreateSym("runtime.pclntab", 0), sect)
ldr.SetSymSect(ldr.LookupOrCreateSym("runtime.epclntab", 0), sect) ldr.SetSymSect(ldr.LookupOrCreateSym("runtime.epclntab", 0), sect)
@ -1924,35 +1924,35 @@ func (state *dodataState) allocateDataSections2(ctxt *Link) {
siz := 0 siz := 0
for symn := sym.SELFRXSECT; symn < sym.SXREF; symn++ { for symn := sym.SELFRXSECT; symn < sym.SXREF; symn++ {
siz += len(state.data2[symn]) siz += len(state.data[symn])
} }
ctxt.datap2 = make([]loader.Sym, 0, siz) ctxt.datap = make([]loader.Sym, 0, siz)
for symn := sym.SELFRXSECT; symn < sym.SXREF; symn++ { for symn := sym.SELFRXSECT; symn < sym.SXREF; symn++ {
ctxt.datap2 = append(ctxt.datap2, state.data2[symn]...) ctxt.datap = append(ctxt.datap, state.data[symn]...)
} }
} }
// allocateDwarfSections allocates sym.Section objects for DWARF // allocateDwarfSections allocates sym.Section objects for DWARF
// symbols, and assigns symbols to sections. // symbols, and assigns symbols to sections.
func (state *dodataState) allocateDwarfSections2(ctxt *Link) { func (state *dodataState) allocateDwarfSections(ctxt *Link) {
alignOne := func(state *dodataState, datsize int64, s loader.Sym) int64 { return datsize } alignOne := func(state *dodataState, datsize int64, s loader.Sym) int64 { return datsize }
ldr := ctxt.loader ldr := ctxt.loader
for i := 0; i < len(dwarfp2); i++ { for i := 0; i < len(dwarfp); i++ {
// First the section symbol. // First the section symbol.
s := dwarfp2[i].secSym() s := dwarfp[i].secSym()
sect := state.allocateNamedDataSection(&Segdwarf, ldr.SymName(s), []sym.SymKind{}, 04) sect := state.allocateNamedDataSection(&Segdwarf, ldr.SymName(s), []sym.SymKind{}, 04)
ldr.SetSymSect(s, sect) ldr.SetSymSect(s, sect)
sect.Sym2 = sym.LoaderSym(s) sect.Sym = sym.LoaderSym(s)
curType := ldr.SymType(s) curType := ldr.SymType(s)
state.setSymType(s, sym.SRODATA) state.setSymType(s, sym.SRODATA)
ldr.SetSymValue(s, int64(uint64(state.datsize)-sect.Vaddr)) ldr.SetSymValue(s, int64(uint64(state.datsize)-sect.Vaddr))
state.datsize += ldr.SymSize(s) state.datsize += ldr.SymSize(s)
// Then any sub-symbols for the section symbol. // Then any sub-symbols for the section symbol.
subSyms := dwarfp2[i].subSyms() subSyms := dwarfp[i].subSyms()
state.assignDsymsToSection2(sect, subSyms, sym.SRODATA, alignOne) state.assignDsymsToSection(sect, subSyms, sym.SRODATA, alignOne)
for j := 0; j < len(subSyms); j++ { for j := 0; j < len(subSyms); j++ {
s := subSyms[j] s := subSyms[j]
@ -1973,7 +1973,7 @@ type symNameSize struct {
sym loader.Sym sym loader.Sym
} }
func (state *dodataState) dodataSect2(ctxt *Link, symn sym.SymKind, syms []loader.Sym) (result []loader.Sym, maxAlign int32) { func (state *dodataState) dodataSect(ctxt *Link, symn sym.SymKind, syms []loader.Sym) (result []loader.Sym, maxAlign int32) {
var head, tail loader.Sym var head, tail loader.Sym
ldr := ctxt.loader ldr := ctxt.loader
sl := make([]symNameSize, len(syms)) sl := make([]symNameSize, len(syms))
@ -2040,7 +2040,7 @@ func (state *dodataState) dodataSect2(ctxt *Link, symn sym.SymKind, syms []loade
for k := range sl { for k := range sl {
s := sl[k].sym s := sl[k].sym
if s != head && s != tail { if s != head && s != tail {
align := symalign2(ldr, s) align := symalign(ldr, s)
if maxAlign < align { if maxAlign < align {
maxAlign = align maxAlign = align
} }
@ -2071,9 +2071,9 @@ func (ctxt *Link) textbuildid() {
s.SetData([]byte(data)) s.SetData([]byte(data))
s.SetSize(int64(len(data))) s.SetSize(int64(len(data)))
ctxt.Textp2 = append(ctxt.Textp2, 0) ctxt.Textp = append(ctxt.Textp, 0)
copy(ctxt.Textp2[1:], ctxt.Textp2) copy(ctxt.Textp[1:], ctxt.Textp)
ctxt.Textp2[0] = s.Sym() ctxt.Textp[0] = s.Sym()
} }
func (ctxt *Link) buildinfo() { func (ctxt *Link) buildinfo() {
@ -2143,16 +2143,16 @@ func (ctxt *Link) textaddress() {
etext := ldr.LookupOrCreateSym("runtime.etext", 0) etext := ldr.LookupOrCreateSym("runtime.etext", 0)
ldr.SetSymSect(etext, sect) ldr.SetSymSect(etext, sect)
ctxt.Textp2 = append(ctxt.Textp2, etext, 0) ctxt.Textp = append(ctxt.Textp, etext, 0)
copy(ctxt.Textp2[1:], ctxt.Textp2) copy(ctxt.Textp[1:], ctxt.Textp)
ctxt.Textp2[0] = text ctxt.Textp[0] = text
} }
va := uint64(*FlagTextAddr) va := uint64(*FlagTextAddr)
n := 1 n := 1
sect.Vaddr = va sect.Vaddr = va
ntramps := 0 ntramps := 0
for _, s := range ctxt.Textp2 { for _, s := range ctxt.Textp {
sect, n, va = assignAddress(ctxt, sect, n, s, va, false) sect, n, va = assignAddress(ctxt, sect, n, s, va, false)
trampoline(ctxt, s) // resolve jumps, may add trampolines if jump too far trampoline(ctxt, s) // resolve jumps, may add trampolines if jump too far
@ -2175,9 +2175,9 @@ func (ctxt *Link) textaddress() {
// merge tramps into Textp, keeping Textp in address order // merge tramps into Textp, keeping Textp in address order
if ntramps != 0 { if ntramps != 0 {
newtextp := make([]loader.Sym, 0, len(ctxt.Textp2)+ntramps) newtextp := make([]loader.Sym, 0, len(ctxt.Textp)+ntramps)
i := 0 i := 0
for _, s := range ctxt.Textp2 { for _, s := range ctxt.Textp {
for ; i < ntramps && ldr.SymValue(ctxt.tramps[i]) < ldr.SymValue(s); i++ { for ; i < ntramps && ldr.SymValue(ctxt.tramps[i]) < ldr.SymValue(s); i++ {
newtextp = append(newtextp, ctxt.tramps[i]) newtextp = append(newtextp, ctxt.tramps[i])
} }
@ -2185,7 +2185,7 @@ func (ctxt *Link) textaddress() {
} }
newtextp = append(newtextp, ctxt.tramps[i:ntramps]...) newtextp = append(newtextp, ctxt.tramps[i:ntramps]...)
ctxt.Textp2 = newtextp ctxt.Textp = newtextp
} }
} }
@ -2410,7 +2410,7 @@ func (ctxt *Link) address() []*sym.Segment {
} }
} }
for _, s := range ctxt.datap2 { for _, s := range ctxt.datap {
if sect := ldr.SymSect(s); sect != nil { if sect := ldr.SymSect(s); sect != nil {
ldr.AddToSymValue(s, int64(sect.Vaddr)) ldr.AddToSymValue(s, int64(sect.Vaddr))
} }
@ -2420,7 +2420,7 @@ func (ctxt *Link) address() []*sym.Segment {
} }
} }
for _, si := range dwarfp2 { for _, si := range dwarfp {
for _, s := range si.syms { for _, s := range si.syms {
if sect := ldr.SymSect(s); sect != nil { if sect := ldr.SymSect(s); sect != nil {
ldr.AddToSymValue(s, int64(sect.Vaddr)) ldr.AddToSymValue(s, int64(sect.Vaddr))
@ -2443,8 +2443,8 @@ func (ctxt *Link) address() []*sym.Segment {
ldr.SetSymValue(s, int64(sect.Vaddr+16)) ldr.SetSymValue(s, int64(sect.Vaddr+16))
} }
ctxt.xdefine2("runtime.text", sym.STEXT, int64(text.Vaddr)) ctxt.xdefine("runtime.text", sym.STEXT, int64(text.Vaddr))
ctxt.xdefine2("runtime.etext", sym.STEXT, int64(lasttext.Vaddr+lasttext.Length)) ctxt.xdefine("runtime.etext", sym.STEXT, int64(lasttext.Vaddr+lasttext.Length))
// If there are multiple text sections, create runtime.text.n for // If there are multiple text sections, create runtime.text.n for
// their section Vaddr, using n for index // their section Vaddr, using n for index
@ -2457,41 +2457,41 @@ func (ctxt *Link) address() []*sym.Segment {
if ctxt.HeadType != objabi.Haix || ctxt.LinkMode != LinkExternal { if ctxt.HeadType != objabi.Haix || ctxt.LinkMode != LinkExternal {
// Addresses are already set on AIX with external linker // Addresses are already set on AIX with external linker
// because these symbols are part of their sections. // because these symbols are part of their sections.
ctxt.xdefine2(symname, sym.STEXT, int64(sect.Vaddr)) ctxt.xdefine(symname, sym.STEXT, int64(sect.Vaddr))
} }
n++ n++
} }
ctxt.xdefine2("runtime.rodata", sym.SRODATA, int64(rodata.Vaddr)) ctxt.xdefine("runtime.rodata", sym.SRODATA, int64(rodata.Vaddr))
ctxt.xdefine2("runtime.erodata", sym.SRODATA, int64(rodata.Vaddr+rodata.Length)) ctxt.xdefine("runtime.erodata", sym.SRODATA, int64(rodata.Vaddr+rodata.Length))
ctxt.xdefine2("runtime.types", sym.SRODATA, int64(types.Vaddr)) ctxt.xdefine("runtime.types", sym.SRODATA, int64(types.Vaddr))
ctxt.xdefine2("runtime.etypes", sym.SRODATA, int64(types.Vaddr+types.Length)) ctxt.xdefine("runtime.etypes", sym.SRODATA, int64(types.Vaddr+types.Length))
ctxt.xdefine2("runtime.itablink", sym.SRODATA, int64(itablink.Vaddr)) ctxt.xdefine("runtime.itablink", sym.SRODATA, int64(itablink.Vaddr))
ctxt.xdefine2("runtime.eitablink", sym.SRODATA, int64(itablink.Vaddr+itablink.Length)) ctxt.xdefine("runtime.eitablink", sym.SRODATA, int64(itablink.Vaddr+itablink.Length))
s := ldr.Lookup("runtime.gcdata", 0) s := ldr.Lookup("runtime.gcdata", 0)
ldr.SetAttrLocal(s, true) ldr.SetAttrLocal(s, true)
ctxt.xdefine2("runtime.egcdata", sym.SRODATA, ldr.SymAddr(s)+ldr.SymSize(s)) ctxt.xdefine("runtime.egcdata", sym.SRODATA, ldr.SymAddr(s)+ldr.SymSize(s))
ldr.SetSymSect(ldr.LookupOrCreateSym("runtime.egcdata", 0), ldr.SymSect(s)) ldr.SetSymSect(ldr.LookupOrCreateSym("runtime.egcdata", 0), ldr.SymSect(s))
s = ldr.LookupOrCreateSym("runtime.gcbss", 0) s = ldr.LookupOrCreateSym("runtime.gcbss", 0)
ldr.SetAttrLocal(s, true) ldr.SetAttrLocal(s, true)
ctxt.xdefine2("runtime.egcbss", sym.SRODATA, ldr.SymAddr(s)+ldr.SymSize(s)) ctxt.xdefine("runtime.egcbss", sym.SRODATA, ldr.SymAddr(s)+ldr.SymSize(s))
ldr.SetSymSect(ldr.LookupOrCreateSym("runtime.egcbss", 0), ldr.SymSect(s)) ldr.SetSymSect(ldr.LookupOrCreateSym("runtime.egcbss", 0), ldr.SymSect(s))
ctxt.xdefine2("runtime.symtab", sym.SRODATA, int64(symtab.Vaddr)) ctxt.xdefine("runtime.symtab", sym.SRODATA, int64(symtab.Vaddr))
ctxt.xdefine2("runtime.esymtab", sym.SRODATA, int64(symtab.Vaddr+symtab.Length)) ctxt.xdefine("runtime.esymtab", sym.SRODATA, int64(symtab.Vaddr+symtab.Length))
ctxt.xdefine2("runtime.pclntab", sym.SRODATA, int64(pclntab.Vaddr)) ctxt.xdefine("runtime.pclntab", sym.SRODATA, int64(pclntab.Vaddr))
ctxt.xdefine2("runtime.epclntab", sym.SRODATA, int64(pclntab.Vaddr+pclntab.Length)) ctxt.xdefine("runtime.epclntab", sym.SRODATA, int64(pclntab.Vaddr+pclntab.Length))
ctxt.xdefine2("runtime.noptrdata", sym.SNOPTRDATA, int64(noptr.Vaddr)) ctxt.xdefine("runtime.noptrdata", sym.SNOPTRDATA, int64(noptr.Vaddr))
ctxt.xdefine2("runtime.enoptrdata", sym.SNOPTRDATA, int64(noptr.Vaddr+noptr.Length)) ctxt.xdefine("runtime.enoptrdata", sym.SNOPTRDATA, int64(noptr.Vaddr+noptr.Length))
ctxt.xdefine2("runtime.bss", sym.SBSS, int64(bss.Vaddr)) ctxt.xdefine("runtime.bss", sym.SBSS, int64(bss.Vaddr))
ctxt.xdefine2("runtime.ebss", sym.SBSS, int64(bss.Vaddr+bss.Length)) ctxt.xdefine("runtime.ebss", sym.SBSS, int64(bss.Vaddr+bss.Length))
ctxt.xdefine2("runtime.data", sym.SDATA, int64(data.Vaddr)) ctxt.xdefine("runtime.data", sym.SDATA, int64(data.Vaddr))
ctxt.xdefine2("runtime.edata", sym.SDATA, int64(data.Vaddr+data.Length)) ctxt.xdefine("runtime.edata", sym.SDATA, int64(data.Vaddr+data.Length))
ctxt.xdefine2("runtime.noptrbss", sym.SNOPTRBSS, int64(noptrbss.Vaddr)) ctxt.xdefine("runtime.noptrbss", sym.SNOPTRBSS, int64(noptrbss.Vaddr))
ctxt.xdefine2("runtime.enoptrbss", sym.SNOPTRBSS, int64(noptrbss.Vaddr+noptrbss.Length)) ctxt.xdefine("runtime.enoptrbss", sym.SNOPTRBSS, int64(noptrbss.Vaddr+noptrbss.Length))
ctxt.xdefine2("runtime.end", sym.SBSS, int64(Segdata.Vaddr+Segdata.Length)) ctxt.xdefine("runtime.end", sym.SBSS, int64(Segdata.Vaddr+Segdata.Length))
if ctxt.IsSolaris() { if ctxt.IsSolaris() {
// On Solaris, in the runtime it sets the external names of the // On Solaris, in the runtime it sets the external names of the
@ -2503,9 +2503,9 @@ func (ctxt *Link) address() []*sym.Segment {
ldr.SetSymExtname(etext, "runtime.etext") ldr.SetSymExtname(etext, "runtime.etext")
ldr.SetSymExtname(edata, "runtime.edata") ldr.SetSymExtname(edata, "runtime.edata")
ldr.SetSymExtname(end, "runtime.end") ldr.SetSymExtname(end, "runtime.end")
ctxt.xdefine2("_etext", ldr.SymType(etext), ldr.SymValue(etext)) ctxt.xdefine("_etext", ldr.SymType(etext), ldr.SymValue(etext))
ctxt.xdefine2("_edata", ldr.SymType(edata), ldr.SymValue(edata)) ctxt.xdefine("_edata", ldr.SymType(edata), ldr.SymValue(edata))
ctxt.xdefine2("_end", ldr.SymType(end), ldr.SymValue(end)) ctxt.xdefine("_end", ldr.SymType(end), ldr.SymValue(end))
ldr.SetSymSect(ldr.Lookup("_etext", 0), ldr.SymSect(etext)) ldr.SetSymSect(ldr.Lookup("_etext", 0), ldr.SymSect(etext))
ldr.SetSymSect(ldr.Lookup("_edata", 0), ldr.SymSect(edata)) ldr.SetSymSect(ldr.Lookup("_edata", 0), ldr.SymSect(edata))
ldr.SetSymSect(ldr.Lookup("_end", 0), ldr.SymSect(end)) ldr.SetSymSect(ldr.Lookup("_end", 0), ldr.SymSect(end))

View File

@ -27,13 +27,13 @@ import (
"strings" "strings"
) )
// dwctxt2 is a wrapper intended to satisfy the method set of // dwctxt is a wrapper intended to satisfy the method set of
// dwarf.Context, so that functions like dwarf.PutAttrs will work with // dwarf.Context, so that functions like dwarf.PutAttrs will work with
// DIEs that use loader.Sym as opposed to *sym.Symbol. It is also // DIEs that use loader.Sym as opposed to *sym.Symbol. It is also
// being used as a place to store tables/maps that are useful as part // being used as a place to store tables/maps that are useful as part
// of type conversion (this is just a convenience; it would be easy to // of type conversion (this is just a convenience; it would be easy to
// split these things out into another type if need be). // split these things out into another type if need be).
type dwctxt2 struct { type dwctxt struct {
linkctxt *Link linkctxt *Link
ldr *loader.Loader ldr *loader.Loader
arch *sys.Arch arch *sys.Arch
@ -59,8 +59,8 @@ type dwctxt2 struct {
uintptrInfoSym loader.Sym uintptrInfoSym loader.Sym
} }
func newdwctxt2(linkctxt *Link, forTypeGen bool) dwctxt2 { func newdwctxt(linkctxt *Link, forTypeGen bool) dwctxt {
d := dwctxt2{ d := dwctxt{
linkctxt: linkctxt, linkctxt: linkctxt,
ldr: linkctxt.loader, ldr: linkctxt.loader,
arch: linkctxt.Arch, arch: linkctxt.Arch,
@ -79,33 +79,33 @@ func newdwctxt2(linkctxt *Link, forTypeGen bool) dwctxt2 {
type dwSym loader.Sym type dwSym loader.Sym
func (s dwSym) Length(dwarfContext interface{}) int64 { func (s dwSym) Length(dwarfContext interface{}) int64 {
l := dwarfContext.(dwctxt2).ldr l := dwarfContext.(dwctxt).ldr
return int64(len(l.Data(loader.Sym(s)))) return int64(len(l.Data(loader.Sym(s))))
} }
func (c dwctxt2) PtrSize() int { func (c dwctxt) PtrSize() int {
return c.arch.PtrSize return c.arch.PtrSize
} }
func (c dwctxt2) AddInt(s dwarf.Sym, size int, i int64) { func (c dwctxt) AddInt(s dwarf.Sym, size int, i int64) {
ds := loader.Sym(s.(dwSym)) ds := loader.Sym(s.(dwSym))
dsu := c.ldr.MakeSymbolUpdater(ds) dsu := c.ldr.MakeSymbolUpdater(ds)
dsu.AddUintXX(c.arch, uint64(i), size) dsu.AddUintXX(c.arch, uint64(i), size)
} }
func (c dwctxt2) AddBytes(s dwarf.Sym, b []byte) { func (c dwctxt) AddBytes(s dwarf.Sym, b []byte) {
ds := loader.Sym(s.(dwSym)) ds := loader.Sym(s.(dwSym))
dsu := c.ldr.MakeSymbolUpdater(ds) dsu := c.ldr.MakeSymbolUpdater(ds)
dsu.AddBytes(b) dsu.AddBytes(b)
} }
func (c dwctxt2) AddString(s dwarf.Sym, v string) { func (c dwctxt) AddString(s dwarf.Sym, v string) {
ds := loader.Sym(s.(dwSym)) ds := loader.Sym(s.(dwSym))
dsu := c.ldr.MakeSymbolUpdater(ds) dsu := c.ldr.MakeSymbolUpdater(ds)
dsu.Addstring(v) dsu.Addstring(v)
} }
func (c dwctxt2) AddAddress(s dwarf.Sym, data interface{}, value int64) { func (c dwctxt) AddAddress(s dwarf.Sym, data interface{}, value int64) {
ds := loader.Sym(s.(dwSym)) ds := loader.Sym(s.(dwSym))
dsu := c.ldr.MakeSymbolUpdater(ds) dsu := c.ldr.MakeSymbolUpdater(ds)
if value != 0 { if value != 0 {
@ -115,7 +115,7 @@ func (c dwctxt2) AddAddress(s dwarf.Sym, data interface{}, value int64) {
dsu.AddAddrPlus(c.arch, tgtds, value) dsu.AddAddrPlus(c.arch, tgtds, value)
} }
func (c dwctxt2) AddCURelativeAddress(s dwarf.Sym, data interface{}, value int64) { func (c dwctxt) AddCURelativeAddress(s dwarf.Sym, data interface{}, value int64) {
ds := loader.Sym(s.(dwSym)) ds := loader.Sym(s.(dwSym))
dsu := c.ldr.MakeSymbolUpdater(ds) dsu := c.ldr.MakeSymbolUpdater(ds)
if value != 0 { if value != 0 {
@ -125,7 +125,7 @@ func (c dwctxt2) AddCURelativeAddress(s dwarf.Sym, data interface{}, value int64
dsu.AddCURelativeAddrPlus(c.arch, tgtds, value) dsu.AddCURelativeAddrPlus(c.arch, tgtds, value)
} }
func (c dwctxt2) AddSectionOffset(s dwarf.Sym, size int, t interface{}, ofs int64) { func (c dwctxt) AddSectionOffset(s dwarf.Sym, size int, t interface{}, ofs int64) {
ds := loader.Sym(s.(dwSym)) ds := loader.Sym(s.(dwSym))
dsu := c.ldr.MakeSymbolUpdater(ds) dsu := c.ldr.MakeSymbolUpdater(ds)
tds := loader.Sym(t.(dwSym)) tds := loader.Sym(t.(dwSym))
@ -137,7 +137,7 @@ func (c dwctxt2) AddSectionOffset(s dwarf.Sym, size int, t interface{}, ofs int6
dsu.AddSymRef(c.arch, tds, ofs, objabi.R_ADDROFF, size) dsu.AddSymRef(c.arch, tds, ofs, objabi.R_ADDROFF, size)
} }
func (c dwctxt2) AddDWARFAddrSectionOffset(s dwarf.Sym, t interface{}, ofs int64) { func (c dwctxt) AddDWARFAddrSectionOffset(s dwarf.Sym, t interface{}, ofs int64) {
size := 4 size := 4
if isDwarf64(c.linkctxt) { if isDwarf64(c.linkctxt) {
size = 8 size = 8
@ -153,25 +153,25 @@ func (c dwctxt2) AddDWARFAddrSectionOffset(s dwarf.Sym, t interface{}, ofs int64
dsu.AddSymRef(c.arch, tds, ofs, objabi.R_DWARFSECREF, size) dsu.AddSymRef(c.arch, tds, ofs, objabi.R_DWARFSECREF, size)
} }
func (c dwctxt2) Logf(format string, args ...interface{}) { func (c dwctxt) Logf(format string, args ...interface{}) {
c.linkctxt.Logf(format, args...) c.linkctxt.Logf(format, args...)
} }
// At the moment these interfaces are only used in the compiler. // At the moment these interfaces are only used in the compiler.
func (c dwctxt2) AddFileRef(s dwarf.Sym, f interface{}) { func (c dwctxt) AddFileRef(s dwarf.Sym, f interface{}) {
panic("should be used only in the compiler") panic("should be used only in the compiler")
} }
func (c dwctxt2) CurrentOffset(s dwarf.Sym) int64 { func (c dwctxt) CurrentOffset(s dwarf.Sym) int64 {
panic("should be used only in the compiler") panic("should be used only in the compiler")
} }
func (c dwctxt2) RecordDclReference(s dwarf.Sym, t dwarf.Sym, dclIdx int, inlIndex int) { func (c dwctxt) RecordDclReference(s dwarf.Sym, t dwarf.Sym, dclIdx int, inlIndex int) {
panic("should be used only in the compiler") panic("should be used only in the compiler")
} }
func (c dwctxt2) RecordChildDieOffsets(s dwarf.Sym, vars []*dwarf.Var, offsets []int32) { func (c dwctxt) RecordChildDieOffsets(s dwarf.Sym, vars []*dwarf.Var, offsets []int32) {
panic("should be used only in the compiler") panic("should be used only in the compiler")
} }
@ -207,11 +207,11 @@ func (dsi *dwarfSecInfo) subSyms() []loader.Sym {
return dsi.syms[1:] return dsi.syms[1:]
} }
// dwarfp2 stores the collected DWARF symbols created during // dwarfp stores the collected DWARF symbols created during
// dwarf generation. // dwarf generation.
var dwarfp2 []dwarfSecInfo var dwarfp []dwarfSecInfo
func (d *dwctxt2) writeabbrev() dwarfSecInfo { func (d *dwctxt) writeabbrev() dwarfSecInfo {
abrvs := d.ldr.LookupOrCreateSym(".debug_abbrev", 0) abrvs := d.ldr.LookupOrCreateSym(".debug_abbrev", 0)
u := d.ldr.MakeSymbolUpdater(abrvs) u := d.ldr.MakeSymbolUpdater(abrvs)
u.SetType(sym.SDWARFSECT) u.SetType(sym.SDWARFSECT)
@ -269,7 +269,7 @@ func getattr(die *dwarf.DWDie, attr uint16) *dwarf.DWAttr {
// The compiler does create nameless DWARF DIEs (ex: concrete subprogram // The compiler does create nameless DWARF DIEs (ex: concrete subprogram
// instance). // instance).
// FIXME: it would be more efficient to bulk-allocate DIEs. // FIXME: it would be more efficient to bulk-allocate DIEs.
func (d *dwctxt2) newdie(parent *dwarf.DWDie, abbrev int, name string, version int) *dwarf.DWDie { func (d *dwctxt) newdie(parent *dwarf.DWDie, abbrev int, name string, version int) *dwarf.DWDie {
die := new(dwarf.DWDie) die := new(dwarf.DWDie)
die.Abbrev = abbrev die.Abbrev = abbrev
die.Link = parent.Child die.Link = parent.Child
@ -316,7 +316,7 @@ func walktypedef(die *dwarf.DWDie) *dwarf.DWDie {
return die return die
} }
func (d *dwctxt2) walksymtypedef(symIdx loader.Sym) loader.Sym { func (d *dwctxt) walksymtypedef(symIdx loader.Sym) loader.Sym {
// We're being given the loader symbol for the type DIE, e.g. // We're being given the loader symbol for the type DIE, e.g.
// "go.info.type.uintptr". Map that first to the type symbol (e.g. // "go.info.type.uintptr". Map that first to the type symbol (e.g.
@ -351,11 +351,11 @@ func findchild(die *dwarf.DWDie, name string) *dwarf.DWDie {
// find looks up the loader symbol for the DWARF DIE generated for the // find looks up the loader symbol for the DWARF DIE generated for the
// type with the specified name. // type with the specified name.
func (d *dwctxt2) find(name string) loader.Sym { func (d *dwctxt) find(name string) loader.Sym {
return d.tmap[name] return d.tmap[name]
} }
func (d *dwctxt2) mustFind(name string) loader.Sym { func (d *dwctxt) mustFind(name string) loader.Sym {
r := d.find(name) r := d.find(name)
if r == 0 { if r == 0 {
Exitf("dwarf find: cannot find %s", name) Exitf("dwarf find: cannot find %s", name)
@ -363,7 +363,7 @@ func (d *dwctxt2) mustFind(name string) loader.Sym {
return r return r
} }
func (d *dwctxt2) adddwarfref(sb *loader.SymbolBuilder, t loader.Sym, size int) int64 { func (d *dwctxt) adddwarfref(sb *loader.SymbolBuilder, t loader.Sym, size int) int64 {
var result int64 var result int64
switch size { switch size {
default: default:
@ -374,14 +374,14 @@ func (d *dwctxt2) adddwarfref(sb *loader.SymbolBuilder, t loader.Sym, size int)
return result return result
} }
func (d *dwctxt2) newrefattr(die *dwarf.DWDie, attr uint16, ref loader.Sym) *dwarf.DWAttr { func (d *dwctxt) newrefattr(die *dwarf.DWDie, attr uint16, ref loader.Sym) *dwarf.DWAttr {
if ref == 0 { if ref == 0 {
return nil return nil
} }
return newattr(die, attr, dwarf.DW_CLS_REFERENCE, 0, dwSym(ref)) return newattr(die, attr, dwarf.DW_CLS_REFERENCE, 0, dwSym(ref))
} }
func (d *dwctxt2) dtolsym(s dwarf.Sym) loader.Sym { func (d *dwctxt) dtolsym(s dwarf.Sym) loader.Sym {
if s == nil { if s == nil {
return 0 return 0
} }
@ -389,7 +389,7 @@ func (d *dwctxt2) dtolsym(s dwarf.Sym) loader.Sym {
return dws return dws
} }
func (d *dwctxt2) putdie(syms []loader.Sym, die *dwarf.DWDie) []loader.Sym { func (d *dwctxt) putdie(syms []loader.Sym, die *dwarf.DWDie) []loader.Sym {
s := d.dtolsym(die.Sym) s := d.dtolsym(die.Sym)
if s == 0 { if s == 0 {
s = syms[len(syms)-1] s = syms[len(syms)-1]
@ -441,11 +441,11 @@ func newmemberoffsetattr(die *dwarf.DWDie, offs int32) {
// GDB doesn't like FORM_addr for AT_location, so emit a // GDB doesn't like FORM_addr for AT_location, so emit a
// location expression that evals to a const. // location expression that evals to a const.
func (d *dwctxt2) newabslocexprattr(die *dwarf.DWDie, addr int64, symIdx loader.Sym) { func (d *dwctxt) newabslocexprattr(die *dwarf.DWDie, addr int64, symIdx loader.Sym) {
newattr(die, dwarf.DW_AT_location, dwarf.DW_CLS_ADDRESS, addr, dwSym(symIdx)) newattr(die, dwarf.DW_AT_location, dwarf.DW_CLS_ADDRESS, addr, dwSym(symIdx))
} }
func (d *dwctxt2) lookupOrDiag(n string) loader.Sym { func (d *dwctxt) lookupOrDiag(n string) loader.Sym {
symIdx := d.ldr.Lookup(n, 0) symIdx := d.ldr.Lookup(n, 0)
if symIdx == 0 { if symIdx == 0 {
Exitf("dwarf: missing type: %s", n) Exitf("dwarf: missing type: %s", n)
@ -457,7 +457,7 @@ func (d *dwctxt2) lookupOrDiag(n string) loader.Sym {
return symIdx return symIdx
} }
func (d *dwctxt2) dotypedef(parent *dwarf.DWDie, gotype loader.Sym, name string, def *dwarf.DWDie) *dwarf.DWDie { func (d *dwctxt) dotypedef(parent *dwarf.DWDie, gotype loader.Sym, name string, def *dwarf.DWDie) *dwarf.DWDie {
// Only emit typedefs for real names. // Only emit typedefs for real names.
if strings.HasPrefix(name, "map[") { if strings.HasPrefix(name, "map[") {
return nil return nil
@ -497,7 +497,7 @@ func (d *dwctxt2) dotypedef(parent *dwarf.DWDie, gotype loader.Sym, name string,
} }
// Define gotype, for composite ones recurse into constituents. // Define gotype, for composite ones recurse into constituents.
func (d *dwctxt2) defgotype(gotype loader.Sym) loader.Sym { func (d *dwctxt) defgotype(gotype loader.Sym) loader.Sym {
if gotype == 0 { if gotype == 0 {
return d.mustFind("<unspecified>") return d.mustFind("<unspecified>")
} }
@ -524,7 +524,7 @@ func (d *dwctxt2) defgotype(gotype loader.Sym) loader.Sym {
return loader.Sym(gtdwSym.Sym.(dwSym)) return loader.Sym(gtdwSym.Sym.(dwSym))
} }
func (d *dwctxt2) newtype(gotype loader.Sym) *dwarf.DWDie { func (d *dwctxt) newtype(gotype loader.Sym) *dwarf.DWDie {
sn := d.ldr.SymName(gotype) sn := d.ldr.SymName(gotype)
name := sn[5:] // could also decode from Type.string name := sn[5:] // could also decode from Type.string
tdata := d.ldr.Data(gotype) tdata := d.ldr.Data(gotype)
@ -714,12 +714,12 @@ func (d *dwctxt2) newtype(gotype loader.Sym) *dwarf.DWDie {
return die return die
} }
func (d *dwctxt2) nameFromDIESym(dwtypeDIESym loader.Sym) string { func (d *dwctxt) nameFromDIESym(dwtypeDIESym loader.Sym) string {
sn := d.ldr.SymName(dwtypeDIESym) sn := d.ldr.SymName(dwtypeDIESym)
return sn[len(dwarf.InfoPrefix):] return sn[len(dwarf.InfoPrefix):]
} }
func (d *dwctxt2) defptrto(dwtype loader.Sym) loader.Sym { func (d *dwctxt) defptrto(dwtype loader.Sym) loader.Sym {
// FIXME: it would be nice if the compiler attached an aux symbol // FIXME: it would be nice if the compiler attached an aux symbol
// ref from the element type to the pointer type -- it would be // ref from the element type to the pointer type -- it would be
@ -753,7 +753,7 @@ func (d *dwctxt2) defptrto(dwtype loader.Sym) loader.Sym {
// Copies src's children into dst. Copies attributes by value. // Copies src's children into dst. Copies attributes by value.
// DWAttr.data is copied as pointer only. If except is one of // DWAttr.data is copied as pointer only. If except is one of
// the top-level children, it will not be copied. // the top-level children, it will not be copied.
func (d *dwctxt2) copychildrenexcept(ctxt *Link, dst *dwarf.DWDie, src *dwarf.DWDie, except *dwarf.DWDie) { func (d *dwctxt) copychildrenexcept(ctxt *Link, dst *dwarf.DWDie, src *dwarf.DWDie, except *dwarf.DWDie) {
for src = src.Child; src != nil; src = src.Link { for src = src.Child; src != nil; src = src.Link {
if src == except { if src == except {
continue continue
@ -768,13 +768,13 @@ func (d *dwctxt2) copychildrenexcept(ctxt *Link, dst *dwarf.DWDie, src *dwarf.DW
reverselist(&dst.Child) reverselist(&dst.Child)
} }
func (d *dwctxt2) copychildren(ctxt *Link, dst *dwarf.DWDie, src *dwarf.DWDie) { func (d *dwctxt) copychildren(ctxt *Link, dst *dwarf.DWDie, src *dwarf.DWDie) {
d.copychildrenexcept(ctxt, dst, src, nil) d.copychildrenexcept(ctxt, dst, src, nil)
} }
// Search children (assumed to have TAG_member) for the one named // Search children (assumed to have TAG_member) for the one named
// field and set its AT_type to dwtype // field and set its AT_type to dwtype
func (d *dwctxt2) substitutetype(structdie *dwarf.DWDie, field string, dwtype loader.Sym) { func (d *dwctxt) substitutetype(structdie *dwarf.DWDie, field string, dwtype loader.Sym) {
child := findchild(structdie, field) child := findchild(structdie, field)
if child == nil { if child == nil {
Exitf("dwarf substitutetype: %s does not have member %s", Exitf("dwarf substitutetype: %s does not have member %s",
@ -790,7 +790,7 @@ func (d *dwctxt2) substitutetype(structdie *dwarf.DWDie, field string, dwtype lo
} }
} }
func (d *dwctxt2) findprotodie(ctxt *Link, name string) *dwarf.DWDie { func (d *dwctxt) findprotodie(ctxt *Link, name string) *dwarf.DWDie {
die, ok := prototypedies[name] die, ok := prototypedies[name]
if ok && die == nil { if ok && die == nil {
d.defgotype(d.lookupOrDiag(name)) d.defgotype(d.lookupOrDiag(name))
@ -802,7 +802,7 @@ func (d *dwctxt2) findprotodie(ctxt *Link, name string) *dwarf.DWDie {
return die return die
} }
func (d *dwctxt2) synthesizestringtypes(ctxt *Link, die *dwarf.DWDie) { func (d *dwctxt) synthesizestringtypes(ctxt *Link, die *dwarf.DWDie) {
prototype := walktypedef(d.findprotodie(ctxt, "type.runtime.stringStructDWARF")) prototype := walktypedef(d.findprotodie(ctxt, "type.runtime.stringStructDWARF"))
if prototype == nil { if prototype == nil {
return return
@ -816,7 +816,7 @@ func (d *dwctxt2) synthesizestringtypes(ctxt *Link, die *dwarf.DWDie) {
} }
} }
func (d *dwctxt2) synthesizeslicetypes(ctxt *Link, die *dwarf.DWDie) { func (d *dwctxt) synthesizeslicetypes(ctxt *Link, die *dwarf.DWDie) {
prototype := walktypedef(d.findprotodie(ctxt, "type.runtime.slice")) prototype := walktypedef(d.findprotodie(ctxt, "type.runtime.slice"))
if prototype == nil { if prototype == nil {
return return
@ -846,7 +846,7 @@ const (
BucketSize = 8 BucketSize = 8
) )
func (d *dwctxt2) mkinternaltype(ctxt *Link, abbrev int, typename, keyname, valname string, f func(*dwarf.DWDie)) loader.Sym { func (d *dwctxt) mkinternaltype(ctxt *Link, abbrev int, typename, keyname, valname string, f func(*dwarf.DWDie)) loader.Sym {
name := mkinternaltypename(typename, keyname, valname) name := mkinternaltypename(typename, keyname, valname)
symname := dwarf.InfoPrefix + name symname := dwarf.InfoPrefix + name
s := d.ldr.Lookup(symname, 0) s := d.ldr.Lookup(symname, 0)
@ -858,7 +858,7 @@ func (d *dwctxt2) mkinternaltype(ctxt *Link, abbrev int, typename, keyname, valn
return d.dtolsym(die.Sym) return d.dtolsym(die.Sym)
} }
func (d *dwctxt2) synthesizemaptypes(ctxt *Link, die *dwarf.DWDie) { func (d *dwctxt) synthesizemaptypes(ctxt *Link, die *dwarf.DWDie) {
hash := walktypedef(d.findprotodie(ctxt, "type.runtime.hmap")) hash := walktypedef(d.findprotodie(ctxt, "type.runtime.hmap"))
bucket := walktypedef(d.findprotodie(ctxt, "type.runtime.bmap")) bucket := walktypedef(d.findprotodie(ctxt, "type.runtime.bmap"))
@ -954,7 +954,7 @@ func (d *dwctxt2) synthesizemaptypes(ctxt *Link, die *dwarf.DWDie) {
} }
} }
func (d *dwctxt2) synthesizechantypes(ctxt *Link, die *dwarf.DWDie) { func (d *dwctxt) synthesizechantypes(ctxt *Link, die *dwarf.DWDie) {
sudog := walktypedef(d.findprotodie(ctxt, "type.runtime.sudog")) sudog := walktypedef(d.findprotodie(ctxt, "type.runtime.sudog"))
waitq := walktypedef(d.findprotodie(ctxt, "type.runtime.waitq")) waitq := walktypedef(d.findprotodie(ctxt, "type.runtime.waitq"))
hchan := walktypedef(d.findprotodie(ctxt, "type.runtime.hchan")) hchan := walktypedef(d.findprotodie(ctxt, "type.runtime.hchan"))
@ -1001,7 +1001,7 @@ func (d *dwctxt2) synthesizechantypes(ctxt *Link, die *dwarf.DWDie) {
} }
} }
func (d *dwctxt2) dwarfDefineGlobal(ctxt *Link, symIdx loader.Sym, str string, v int64, gotype loader.Sym) { func (d *dwctxt) dwarfDefineGlobal(ctxt *Link, symIdx loader.Sym, str string, v int64, gotype loader.Sym) {
// Find a suitable CU DIE to include the global. // Find a suitable CU DIE to include the global.
// One would think it's as simple as just looking at the unit, but that might // One would think it's as simple as just looking at the unit, but that might
// not have any reachable code. So, we go to the runtime's CU if our unit // not have any reachable code. So, we go to the runtime's CU if our unit
@ -1022,7 +1022,7 @@ func (d *dwctxt2) dwarfDefineGlobal(ctxt *Link, symIdx loader.Sym, str string, v
// createUnitLength creates the initial length field with value v and update // createUnitLength creates the initial length field with value v and update
// offset of unit_length if needed. // offset of unit_length if needed.
func (d *dwctxt2) createUnitLength(su *loader.SymbolBuilder, v uint64) { func (d *dwctxt) createUnitLength(su *loader.SymbolBuilder, v uint64) {
if isDwarf64(d.linkctxt) { if isDwarf64(d.linkctxt) {
su.AddUint32(d.arch, 0xFFFFFFFF) su.AddUint32(d.arch, 0xFFFFFFFF)
} }
@ -1030,7 +1030,7 @@ func (d *dwctxt2) createUnitLength(su *loader.SymbolBuilder, v uint64) {
} }
// addDwarfAddrField adds a DWARF field in DWARF 64bits or 32bits. // addDwarfAddrField adds a DWARF field in DWARF 64bits or 32bits.
func (d *dwctxt2) addDwarfAddrField(sb *loader.SymbolBuilder, v uint64) { func (d *dwctxt) addDwarfAddrField(sb *loader.SymbolBuilder, v uint64) {
if isDwarf64(d.linkctxt) { if isDwarf64(d.linkctxt) {
sb.AddUint(d.arch, v) sb.AddUint(d.arch, v)
} else { } else {
@ -1039,7 +1039,7 @@ func (d *dwctxt2) addDwarfAddrField(sb *loader.SymbolBuilder, v uint64) {
} }
// addDwarfAddrRef adds a DWARF pointer in DWARF 64bits or 32bits. // addDwarfAddrRef adds a DWARF pointer in DWARF 64bits or 32bits.
func (d *dwctxt2) addDwarfAddrRef(sb *loader.SymbolBuilder, t loader.Sym) { func (d *dwctxt) addDwarfAddrRef(sb *loader.SymbolBuilder, t loader.Sym) {
if isDwarf64(d.linkctxt) { if isDwarf64(d.linkctxt) {
d.adddwarfref(sb, t, 8) d.adddwarfref(sb, t, 8)
} else { } else {
@ -1048,9 +1048,9 @@ func (d *dwctxt2) addDwarfAddrRef(sb *loader.SymbolBuilder, t loader.Sym) {
} }
// calcCompUnitRanges calculates the PC ranges of the compilation units. // calcCompUnitRanges calculates the PC ranges of the compilation units.
func (d *dwctxt2) calcCompUnitRanges() { func (d *dwctxt) calcCompUnitRanges() {
var prevUnit *sym.CompilationUnit var prevUnit *sym.CompilationUnit
for _, s := range d.linkctxt.Textp2 { for _, s := range d.linkctxt.Textp {
sym := loader.Sym(s) sym := loader.Sym(s)
fi := d.ldr.FuncInfo(sym) fi := d.ldr.FuncInfo(sym)
@ -1073,7 +1073,7 @@ func (d *dwctxt2) calcCompUnitRanges() {
// only create boundaries between symbols from // only create boundaries between symbols from
// different units. // different units.
sval := d.ldr.SymValue(sym) sval := d.ldr.SymValue(sym)
u0val := d.ldr.SymValue(loader.Sym(unit.Textp2[0])) u0val := d.ldr.SymValue(loader.Sym(unit.Textp[0]))
if prevUnit != unit { if prevUnit != unit {
unit.PCs = append(unit.PCs, dwarf.Range{Start: sval - u0val}) unit.PCs = append(unit.PCs, dwarf.Range{Start: sval - u0val})
prevUnit = unit prevUnit = unit
@ -1119,7 +1119,7 @@ func getCompilationDir() string {
return "." return "."
} }
func (d *dwctxt2) importInfoSymbol(ctxt *Link, dsym loader.Sym) { func (d *dwctxt) importInfoSymbol(ctxt *Link, dsym loader.Sym) {
d.ldr.SetAttrReachable(dsym, true) d.ldr.SetAttrReachable(dsym, true)
d.ldr.SetAttrNotInSymbolTable(dsym, true) d.ldr.SetAttrNotInSymbolTable(dsym, true)
if d.ldr.SymType(dsym) != sym.SDWARFINFO { if d.ldr.SymType(dsym) != sym.SDWARFINFO {
@ -1154,7 +1154,7 @@ func expandFile(fname string) string {
return expandGoroot(fname) return expandGoroot(fname)
} }
func (d *dwctxt2) writelines(unit *sym.CompilationUnit, ls loader.Sym) { func (d *dwctxt) writelines(unit *sym.CompilationUnit, ls loader.Sym) {
is_stmt := uint8(1) // initially = recommended default_is_stmt = 1, tracks is_stmt toggles. is_stmt := uint8(1) // initially = recommended default_is_stmt = 1, tracks is_stmt toggles.
@ -1230,7 +1230,7 @@ func (d *dwctxt2) writelines(unit *sym.CompilationUnit, ls loader.Sym) {
// Output the state machine for each function remaining. // Output the state machine for each function remaining.
var lastAddr int64 var lastAddr int64
for _, s := range unit.Textp2 { for _, s := range unit.Textp {
fnSym := loader.Sym(s) fnSym := loader.Sym(s)
// Set the PC. // Set the PC.
@ -1274,7 +1274,7 @@ func (d *dwctxt2) writelines(unit *sym.CompilationUnit, ls loader.Sym) {
} }
// writepcranges generates the DW_AT_ranges table for compilation unit cu. // writepcranges generates the DW_AT_ranges table for compilation unit cu.
func (d *dwctxt2) writepcranges(unit *sym.CompilationUnit, base loader.Sym, pcs []dwarf.Range, ranges loader.Sym) { func (d *dwctxt) writepcranges(unit *sym.CompilationUnit, base loader.Sym, pcs []dwarf.Range, ranges loader.Sym) {
rsu := d.ldr.MakeSymbolUpdater(ranges) rsu := d.ldr.MakeSymbolUpdater(ranges)
rDwSym := dwSym(ranges) rDwSym := dwSym(ranges)
@ -1319,7 +1319,7 @@ func appendPCDeltaCFA(arch *sys.Arch, b []byte, deltapc, cfa int64) []byte {
return b return b
} }
func (d *dwctxt2) writeframes() dwarfSecInfo { func (d *dwctxt) writeframes() dwarfSecInfo {
fs := d.ldr.LookupOrCreateSym(".debug_frame", 0) fs := d.ldr.LookupOrCreateSym(".debug_frame", 0)
fsd := dwSym(fs) fsd := dwSym(fs)
fsu := d.ldr.MakeSymbolUpdater(fs) fsu := d.ldr.MakeSymbolUpdater(fs)
@ -1381,7 +1381,7 @@ func (d *dwctxt2) writeframes() dwarfSecInfo {
var deltaBuf []byte var deltaBuf []byte
pcsp := obj.NewPCIter(uint32(d.arch.MinLC)) pcsp := obj.NewPCIter(uint32(d.arch.MinLC))
for _, s := range d.linkctxt.Textp2 { for _, s := range d.linkctxt.Textp {
fn := loader.Sym(s) fn := loader.Sym(s)
fi := d.ldr.FuncInfo(fn) fi := d.ldr.FuncInfo(fn)
if !fi.Valid() { if !fi.Valid() {
@ -1488,7 +1488,7 @@ func appendSyms(syms []loader.Sym, src []sym.LoaderSym) []loader.Sym {
return syms return syms
} }
func (d *dwctxt2) writeinfo(units []*sym.CompilationUnit, abbrevsym loader.Sym, pubNames, pubTypes *pubWriter2) dwarfSecInfo { func (d *dwctxt) writeinfo(units []*sym.CompilationUnit, abbrevsym loader.Sym, pubNames, pubTypes *pubWriter) dwarfSecInfo {
infosec := d.ldr.LookupOrCreateSym(".debug_info", 0) infosec := d.ldr.LookupOrCreateSym(".debug_info", 0)
disu := d.ldr.MakeSymbolUpdater(infosec) disu := d.ldr.MakeSymbolUpdater(infosec)
@ -1501,7 +1501,7 @@ func (d *dwctxt2) writeinfo(units []*sym.CompilationUnit, abbrevsym loader.Sym,
s := d.dtolsym(compunit.Sym) s := d.dtolsym(compunit.Sym)
su := d.ldr.MakeSymbolUpdater(s) su := d.ldr.MakeSymbolUpdater(s)
if len(u.Textp2) == 0 && u.DWInfo.Child == nil { if len(u.Textp) == 0 && u.DWInfo.Child == nil {
continue continue
} }
@ -1524,10 +1524,10 @@ func (d *dwctxt2) writeinfo(units []*sym.CompilationUnit, abbrevsym loader.Sym,
dwarf.PutAttrs(d, ds, compunit.Abbrev, compunit.Attr) dwarf.PutAttrs(d, ds, compunit.Abbrev, compunit.Attr)
cu := []loader.Sym{s} cu := []loader.Sym{s}
cu = appendSyms(cu, u.AbsFnDIEs2) cu = appendSyms(cu, u.AbsFnDIEs)
cu = appendSyms(cu, u.FuncDIEs2) cu = appendSyms(cu, u.FuncDIEs)
if u.Consts2 != 0 { if u.Consts != 0 {
cu = append(cu, loader.Sym(u.Consts2)) cu = append(cu, loader.Sym(u.Consts))
} }
var cusize int64 var cusize int64
for _, child := range cu { for _, child := range cu {
@ -1581,8 +1581,8 @@ func (d *dwctxt2) writeinfo(units []*sym.CompilationUnit, abbrevsym loader.Sym,
* because we need die->offs and infoo/infosize; * because we need die->offs and infoo/infosize;
*/ */
type pubWriter2 struct { type pubWriter struct {
d *dwctxt2 d *dwctxt
s loader.Sym s loader.Sym
su *loader.SymbolBuilder su *loader.SymbolBuilder
sname string sname string
@ -1591,14 +1591,14 @@ type pubWriter2 struct {
culengthOff int64 culengthOff int64
} }
func newPubWriter2(d *dwctxt2, sname string) *pubWriter2 { func newPubWriter(d *dwctxt, sname string) *pubWriter {
s := d.ldr.LookupOrCreateSym(sname, 0) s := d.ldr.LookupOrCreateSym(sname, 0)
u := d.ldr.MakeSymbolUpdater(s) u := d.ldr.MakeSymbolUpdater(s)
u.SetType(sym.SDWARFSECT) u.SetType(sym.SDWARFSECT)
return &pubWriter2{d: d, s: s, su: u, sname: sname} return &pubWriter{d: d, s: s, su: u, sname: sname}
} }
func (pw *pubWriter2) beginCompUnit(compunit *dwarf.DWDie) { func (pw *pubWriter) beginCompUnit(compunit *dwarf.DWDie) {
pw.sectionstart = pw.su.Size() pw.sectionstart = pw.su.Size()
// Write .debug_pubnames/types Header (sec 6.1.1) // Write .debug_pubnames/types Header (sec 6.1.1)
@ -1609,7 +1609,7 @@ func (pw *pubWriter2) beginCompUnit(compunit *dwarf.DWDie) {
pw.d.addDwarfAddrField(pw.su, uint64(0)) // debug_info_length, will be filled in later. pw.d.addDwarfAddrField(pw.su, uint64(0)) // debug_info_length, will be filled in later.
} }
func (pw *pubWriter2) add(die *dwarf.DWDie, offset int64) { func (pw *pubWriter) add(die *dwarf.DWDie, offset int64) {
dwa := getattr(die, dwarf.DW_AT_name) dwa := getattr(die, dwarf.DW_AT_name)
name := dwa.Data.(string) name := dwa.Data.(string)
if pw.d.dtolsym(die.Sym) == 0 { if pw.d.dtolsym(die.Sym) == 0 {
@ -1619,7 +1619,7 @@ func (pw *pubWriter2) add(die *dwarf.DWDie, offset int64) {
pw.su.Addstring(name) pw.su.Addstring(name)
} }
func (pw *pubWriter2) endCompUnit(compunit *dwarf.DWDie, culength uint32) { func (pw *pubWriter) endCompUnit(compunit *dwarf.DWDie, culength uint32) {
pw.d.addDwarfAddrField(pw.su, 0) // Null offset pw.d.addDwarfAddrField(pw.su, 0) // Null offset
// On AIX, save the current size of this compilation unit. // On AIX, save the current size of this compilation unit.
@ -1649,7 +1649,7 @@ func ispubtype(die *dwarf.DWDie) bool {
return die.Abbrev >= dwarf.DW_ABRV_NULLTYPE return die.Abbrev >= dwarf.DW_ABRV_NULLTYPE
} }
func (d *dwctxt2) writegdbscript() dwarfSecInfo { func (d *dwctxt) writegdbscript() dwarfSecInfo {
// TODO (aix): make it available // TODO (aix): make it available
if d.linkctxt.HeadType == objabi.Haix { if d.linkctxt.HeadType == objabi.Haix {
return dwarfSecInfo{} return dwarfSecInfo{}
@ -1713,7 +1713,7 @@ func dwarfEnabled(ctxt *Link) bool {
// mkBuiltinType populates the dwctxt2 sym lookup maps for the // mkBuiltinType populates the dwctxt2 sym lookup maps for the
// newly created builtin type DIE 'typeDie'. // newly created builtin type DIE 'typeDie'.
func (d *dwctxt2) mkBuiltinType(ctxt *Link, abrv int, tname string) *dwarf.DWDie { func (d *dwctxt) mkBuiltinType(ctxt *Link, abrv int, tname string) *dwarf.DWDie {
// create type DIE // create type DIE
die := d.newdie(&dwtypes, abrv, tname, 0) die := d.newdie(&dwtypes, abrv, tname, 0)
@ -1742,7 +1742,7 @@ func dwarfGenerateDebugInfo(ctxt *Link) {
return return
} }
d := newdwctxt2(ctxt, true) d := newdwctxt(ctxt, true)
if ctxt.HeadType == objabi.Haix { if ctxt.HeadType == objabi.Haix {
// Initial map used to store package size for each DWARF section. // Initial map used to store package size for each DWARF section.
@ -1803,7 +1803,7 @@ func dwarfGenerateDebugInfo(ctxt *Link) {
for _, unit := range lib.Units { for _, unit := range lib.Units {
// We drop the constants into the first CU. // We drop the constants into the first CU.
if consts != 0 { if consts != 0 {
unit.Consts2 = sym.LoaderSym(consts) unit.Consts = sym.LoaderSym(consts)
d.importInfoSymbol(ctxt, consts) d.importInfoSymbol(ctxt, consts)
consts = 0 consts = 0
} }
@ -1850,7 +1850,7 @@ func dwarfGenerateDebugInfo(ctxt *Link) {
} }
newattr(unit.DWInfo, dwarf.DW_AT_go_package_name, dwarf.DW_CLS_STRING, int64(len(pkgname)), pkgname) newattr(unit.DWInfo, dwarf.DW_AT_go_package_name, dwarf.DW_CLS_STRING, int64(len(pkgname)), pkgname)
if len(unit.Textp2) == 0 { if len(unit.Textp) == 0 {
unit.DWInfo.Abbrev = dwarf.DW_ABRV_COMPUNIT_TEXTLESS unit.DWInfo.Abbrev = dwarf.DW_ABRV_COMPUNIT_TEXTLESS
} }
@ -1858,7 +1858,7 @@ func dwarfGenerateDebugInfo(ctxt *Link) {
// referenced types, create the file table for debug_line, find all // referenced types, create the file table for debug_line, find all
// referenced abstract functions. // referenced abstract functions.
// Collect all debug_range symbols in unit.rangeSyms // Collect all debug_range symbols in unit.rangeSyms
for _, s := range unit.Textp2 { // textp2 has been dead-code-eliminated already. for _, s := range unit.Textp { // Textp has been dead-code-eliminated already.
fnSym := loader.Sym(s) fnSym := loader.Sym(s)
infosym, _, rangesym, _ := d.ldr.GetFuncDwarfAuxSyms(fnSym) infosym, _, rangesym, _ := d.ldr.GetFuncDwarfAuxSyms(fnSym)
if infosym == 0 { if infosym == 0 {
@ -1867,7 +1867,7 @@ func dwarfGenerateDebugInfo(ctxt *Link) {
d.ldr.SetAttrNotInSymbolTable(infosym, true) d.ldr.SetAttrNotInSymbolTable(infosym, true)
d.ldr.SetAttrReachable(infosym, true) d.ldr.SetAttrReachable(infosym, true)
unit.FuncDIEs2 = append(unit.FuncDIEs2, sym.LoaderSym(infosym)) unit.FuncDIEs = append(unit.FuncDIEs, sym.LoaderSym(infosym))
if rangesym != 0 { if rangesym != 0 {
rs := len(d.ldr.Data(rangesym)) rs := len(d.ldr.Data(rangesym))
d.ldr.SetAttrNotInSymbolTable(rangesym, true) d.ldr.SetAttrNotInSymbolTable(rangesym, true)
@ -1875,7 +1875,7 @@ func dwarfGenerateDebugInfo(ctxt *Link) {
if ctxt.HeadType == objabi.Haix { if ctxt.HeadType == objabi.Haix {
addDwsectCUSize(".debug_ranges", unit.Lib.Pkg, uint64(rs)) addDwsectCUSize(".debug_ranges", unit.Lib.Pkg, uint64(rs))
} }
unit.RangeSyms2 = append(unit.RangeSyms2, sym.LoaderSym(rangesym)) unit.RangeSyms = append(unit.RangeSyms, sym.LoaderSym(rangesym))
} }
drelocs := d.ldr.Relocs(infosym) drelocs := d.ldr.Relocs(infosym)
@ -1891,7 +1891,7 @@ func dwarfGenerateDebugInfo(ctxt *Link) {
if strings.HasPrefix(rsn, dwarf.InfoPrefix) && strings.HasSuffix(rsn, dwarf.AbstractFuncSuffix) && !d.ldr.AttrOnList(rsym) { if strings.HasPrefix(rsn, dwarf.InfoPrefix) && strings.HasSuffix(rsn, dwarf.AbstractFuncSuffix) && !d.ldr.AttrOnList(rsym) {
// abstract function // abstract function
d.ldr.SetAttrOnList(rsym, true) d.ldr.SetAttrOnList(rsym, true)
unit.AbsFnDIEs2 = append(unit.AbsFnDIEs2, sym.LoaderSym(rsym)) unit.AbsFnDIEs = append(unit.AbsFnDIEs, sym.LoaderSym(rsym))
d.importInfoSymbol(ctxt, rsym) d.importInfoSymbol(ctxt, rsym)
continue continue
} }
@ -1956,7 +1956,7 @@ func dwarfGenerateDebugInfo(ctxt *Link) {
// autos (which may not appear directly as param/var DIEs). // autos (which may not appear directly as param/var DIEs).
for _, lib := range ctxt.Library { for _, lib := range ctxt.Library {
for _, unit := range lib.Units { for _, unit := range lib.Units {
lists := [][]sym.LoaderSym{unit.AbsFnDIEs2, unit.FuncDIEs2} lists := [][]sym.LoaderSym{unit.AbsFnDIEs, unit.FuncDIEs}
for _, list := range lists { for _, list := range lists {
for _, s := range list { for _, s := range list {
symIdx := loader.Sym(s) symIdx := loader.Sym(s)
@ -1990,7 +1990,7 @@ func dwarfGenerateDebugSyms(ctxt *Link) {
if !dwarfEnabled(ctxt) { if !dwarfEnabled(ctxt) {
return return
} }
d := &dwctxt2{ d := &dwctxt{
linkctxt: ctxt, linkctxt: ctxt,
ldr: ctxt.loader, ldr: ctxt.loader,
arch: ctxt.Arch, arch: ctxt.Arch,
@ -1998,9 +1998,9 @@ func dwarfGenerateDebugSyms(ctxt *Link) {
d.dwarfGenerateDebugSyms() d.dwarfGenerateDebugSyms()
} }
func (d *dwctxt2) dwarfGenerateDebugSyms() { func (d *dwctxt) dwarfGenerateDebugSyms() {
abbrevSec := d.writeabbrev() abbrevSec := d.writeabbrev()
dwarfp2 = append(dwarfp2, abbrevSec) dwarfp = append(dwarfp, abbrevSec)
d.calcCompUnitRanges() d.calcCompUnitRanges()
sort.Sort(compilationUnitByStartPC(d.linkctxt.compUnits)) sort.Sort(compilationUnitByStartPC(d.linkctxt.compUnits))
@ -2010,7 +2010,7 @@ func (d *dwctxt2) dwarfGenerateDebugSyms() {
dlu := d.ldr.MakeSymbolUpdater(debugLine) dlu := d.ldr.MakeSymbolUpdater(debugLine)
dlu.SetType(sym.SDWARFSECT) dlu.SetType(sym.SDWARFSECT)
d.ldr.SetAttrReachable(debugLine, true) d.ldr.SetAttrReachable(debugLine, true)
dwarfp2 = append(dwarfp2, dwarfSecInfo{syms: []loader.Sym{debugLine}}) dwarfp = append(dwarfp, dwarfSecInfo{syms: []loader.Sym{debugLine}})
debugRanges := d.ldr.LookupOrCreateSym(".debug_ranges", 0) debugRanges := d.ldr.LookupOrCreateSym(".debug_ranges", 0)
dru := d.ldr.MakeSymbolUpdater(debugRanges) dru := d.ldr.MakeSymbolUpdater(debugRanges)
@ -2024,7 +2024,7 @@ func (d *dwctxt2) dwarfGenerateDebugSyms() {
continue continue
} }
d.writelines(u, debugLine) d.writelines(u, debugLine)
base := loader.Sym(u.Textp2[0]) base := loader.Sym(u.Textp[0])
d.writepcranges(u, base, u.PCs, debugRanges) d.writepcranges(u, base, u.PCs, debugRanges)
} }
@ -2034,39 +2034,39 @@ func (d *dwctxt2) dwarfGenerateDebugSyms() {
reversetree(&dwtypes.Child) reversetree(&dwtypes.Child)
movetomodule(d.linkctxt, &dwtypes) movetomodule(d.linkctxt, &dwtypes)
pubNames := newPubWriter2(d, ".debug_pubnames") pubNames := newPubWriter(d, ".debug_pubnames")
pubTypes := newPubWriter2(d, ".debug_pubtypes") pubTypes := newPubWriter(d, ".debug_pubtypes")
infoSec := d.writeinfo(d.linkctxt.compUnits, abbrevSec.secSym(), pubNames, pubTypes) infoSec := d.writeinfo(d.linkctxt.compUnits, abbrevSec.secSym(), pubNames, pubTypes)
framesSec := d.writeframes() framesSec := d.writeframes()
dwarfp2 = append(dwarfp2, framesSec) dwarfp = append(dwarfp, framesSec)
dwarfp2 = append(dwarfp2, dwarfSecInfo{syms: []loader.Sym{pubNames.s}}) dwarfp = append(dwarfp, dwarfSecInfo{syms: []loader.Sym{pubNames.s}})
dwarfp2 = append(dwarfp2, dwarfSecInfo{syms: []loader.Sym{pubTypes.s}}) dwarfp = append(dwarfp, dwarfSecInfo{syms: []loader.Sym{pubTypes.s}})
gdbScriptSec := d.writegdbscript() gdbScriptSec := d.writegdbscript()
if gdbScriptSec.secSym() != 0 { if gdbScriptSec.secSym() != 0 {
dwarfp2 = append(dwarfp2, gdbScriptSec) dwarfp = append(dwarfp, gdbScriptSec)
} }
dwarfp2 = append(dwarfp2, infoSec) dwarfp = append(dwarfp, infoSec)
locSec := d.collectlocs(d.linkctxt.compUnits) locSec := d.collectlocs(d.linkctxt.compUnits)
if locSec.secSym() != 0 { if locSec.secSym() != 0 {
dwarfp2 = append(dwarfp2, locSec) dwarfp = append(dwarfp, locSec)
} }
rsyms := []loader.Sym{debugRanges} rsyms := []loader.Sym{debugRanges}
for _, unit := range d.linkctxt.compUnits { for _, unit := range d.linkctxt.compUnits {
for _, s := range unit.RangeSyms2 { for _, s := range unit.RangeSyms {
rsyms = append(rsyms, loader.Sym(s)) rsyms = append(rsyms, loader.Sym(s))
} }
} }
dwarfp2 = append(dwarfp2, dwarfSecInfo{syms: rsyms}) dwarfp = append(dwarfp, dwarfSecInfo{syms: rsyms})
} }
func (d *dwctxt2) collectlocs(units []*sym.CompilationUnit) dwarfSecInfo { func (d *dwctxt) collectlocs(units []*sym.CompilationUnit) dwarfSecInfo {
empty := true empty := true
syms := []loader.Sym{} syms := []loader.Sym{}
for _, u := range units { for _, u := range units {
for _, fn := range u.FuncDIEs2 { for _, fn := range u.FuncDIEs {
relocs := d.ldr.Relocs(loader.Sym(fn)) relocs := d.ldr.Relocs(loader.Sym(fn))
for i := 0; i < relocs.Count(); i++ { for i := 0; i < relocs.Count(); i++ {
reloc := relocs.At2(i) reloc := relocs.At2(i)
@ -2102,7 +2102,7 @@ func (d *dwctxt2) collectlocs(units []*sym.CompilationUnit) dwarfSecInfo {
// represented by s. // represented by s.
// The prefix dwarf.InfoPrefix+".pkg." needs to be removed in order to get // The prefix dwarf.InfoPrefix+".pkg." needs to be removed in order to get
// the package name. // the package name.
func (d *dwctxt2) getPkgFromCUSym(s loader.Sym) string { func (d *dwctxt) getPkgFromCUSym(s loader.Sym) string {
return strings.TrimPrefix(d.ldr.SymName(s), dwarf.InfoPrefix+".pkg.") return strings.TrimPrefix(d.ldr.SymName(s), dwarf.InfoPrefix+".pkg.")
} }
@ -2135,7 +2135,7 @@ func dwarfaddelfsectionsyms(ctxt *Link) {
} }
ldr := ctxt.loader ldr := ctxt.loader
for _, si := range dwarfp2 { for _, si := range dwarfp {
s := si.secSym() s := si.secSym()
sect := ldr.SymSect(si.secSym()) sect := ldr.SymSect(si.secSym())
putelfsectionsym(ctxt, ctxt.Out, s, sect.Elfsect.(*ElfShdr).shnum) putelfsectionsym(ctxt, ctxt.Out, s, sect.Elfsect.(*ElfShdr).shnum)

View File

@ -61,10 +61,10 @@ func dwarfcompress(ctxt *Link) {
var compressedCount int var compressedCount int
resChannel := make(chan compressedSect) resChannel := make(chan compressedSect)
for i := range dwarfp2 { for i := range dwarfp {
go func(resIndex int, syms []loader.Sym) { go func(resIndex int, syms []loader.Sym) {
resChannel <- compressedSect{resIndex, compressSyms(ctxt, syms), syms} resChannel <- compressedSect{resIndex, compressSyms(ctxt, syms), syms}
}(compressedCount, dwarfp2[i].syms) }(compressedCount, dwarfp[i].syms)
compressedCount++ compressedCount++
} }
res := make([]compressedSect, compressedCount) res := make([]compressedSect, compressedCount)
@ -103,14 +103,14 @@ func dwarfcompress(ctxt *Link) {
} }
} }
} }
dwarfp2 = newDwarfp dwarfp = newDwarfp
// Re-compute the locations of the compressed DWARF symbols // Re-compute the locations of the compressed DWARF symbols
// and sections, since the layout of these within the file is // and sections, since the layout of these within the file is
// based on Section.Vaddr and Symbol.Value. // based on Section.Vaddr and Symbol.Value.
pos := Segdwarf.Vaddr pos := Segdwarf.Vaddr
var prevSect *sym.Section var prevSect *sym.Section
for _, si := range dwarfp2 { for _, si := range dwarfp {
for _, s := range si.syms { for _, s := range si.syms {
ldr.SetSymValue(s, int64(pos)) ldr.SetSymValue(s, int64(pos))
sect := ldr.SymSect(s) sect := ldr.SymSect(s)
@ -137,11 +137,11 @@ func (v compilationUnitByStartPC) Swap(i, j int) { v[i], v[j] = v[j], v[i] }
func (v compilationUnitByStartPC) Less(i, j int) bool { func (v compilationUnitByStartPC) Less(i, j int) bool {
switch { switch {
case len(v[i].Textp2) == 0 && len(v[j].Textp2) == 0: case len(v[i].Textp) == 0 && len(v[j].Textp) == 0:
return v[i].Lib.Pkg < v[j].Lib.Pkg return v[i].Lib.Pkg < v[j].Lib.Pkg
case len(v[i].Textp2) != 0 && len(v[j].Textp2) == 0: case len(v[i].Textp) != 0 && len(v[j].Textp) == 0:
return true return true
case len(v[i].Textp2) == 0 && len(v[j].Textp2) != 0: case len(v[i].Textp) == 0 && len(v[j].Textp) != 0:
return false return false
default: default:
return v[i].PCs[0].Start < v[j].PCs[0].Start return v[i].PCs[0].Start < v[j].PCs[0].Start

View File

@ -744,10 +744,10 @@ func elfhash(name string) uint32 {
} }
func elfWriteDynEntSym(ctxt *Link, s *loader.SymbolBuilder, tag int, t loader.Sym) { func elfWriteDynEntSym(ctxt *Link, s *loader.SymbolBuilder, tag int, t loader.Sym) {
Elfwritedynentsymplus2(ctxt, s, tag, t, 0) Elfwritedynentsymplus(ctxt, s, tag, t, 0)
} }
func Elfwritedynent2(arch *sys.Arch, s *loader.SymbolBuilder, tag int, val uint64) { func Elfwritedynent(arch *sys.Arch, s *loader.SymbolBuilder, tag int, val uint64) {
if elf64 { if elf64 {
s.AddUint64(arch, uint64(tag)) s.AddUint64(arch, uint64(tag))
s.AddUint64(arch, val) s.AddUint64(arch, val)
@ -757,11 +757,11 @@ func Elfwritedynent2(arch *sys.Arch, s *loader.SymbolBuilder, tag int, val uint6
} }
} }
func elfwritedynentsym2(ctxt *Link, s *loader.SymbolBuilder, tag int, t loader.Sym) { func elfwritedynentsym(ctxt *Link, s *loader.SymbolBuilder, tag int, t loader.Sym) {
Elfwritedynentsymplus2(ctxt, s, tag, t, 0) Elfwritedynentsymplus(ctxt, s, tag, t, 0)
} }
func Elfwritedynentsymplus2(ctxt *Link, s *loader.SymbolBuilder, tag int, t loader.Sym, add int64) { func Elfwritedynentsymplus(ctxt *Link, s *loader.SymbolBuilder, tag int, t loader.Sym, add int64) {
if elf64 { if elf64 {
s.AddUint64(ctxt.Arch, uint64(tag)) s.AddUint64(ctxt.Arch, uint64(tag))
} else { } else {
@ -770,7 +770,7 @@ func Elfwritedynentsymplus2(ctxt *Link, s *loader.SymbolBuilder, tag int, t load
s.AddAddrPlus(ctxt.Arch, t, add) s.AddAddrPlus(ctxt.Arch, t, add)
} }
func elfwritedynentsymsize2(ctxt *Link, s *loader.SymbolBuilder, tag int, t loader.Sym) { func elfwritedynentsymsize(ctxt *Link, s *loader.SymbolBuilder, tag int, t loader.Sym) {
if elf64 { if elf64 {
s.AddUint64(ctxt.Arch, uint64(tag)) s.AddUint64(ctxt.Arch, uint64(tag))
} else { } else {
@ -1028,7 +1028,7 @@ havelib:
return aux return aux
} }
func elfdynhash2(ctxt *Link) { func elfdynhash(ctxt *Link) {
if !ctxt.IsELF { if !ctxt.IsELF {
return return
} }
@ -1147,22 +1147,22 @@ func elfdynhash2(ctxt *Link) {
elfverneed = nfile elfverneed = nfile
if elfverneed != 0 { if elfverneed != 0 {
elfWriteDynEntSym(ctxt, s, DT_VERNEED, gnuVersionR.Sym()) elfWriteDynEntSym(ctxt, s, DT_VERNEED, gnuVersionR.Sym())
Elfwritedynent2(ctxt.Arch, s, DT_VERNEEDNUM, uint64(nfile)) Elfwritedynent(ctxt.Arch, s, DT_VERNEEDNUM, uint64(nfile))
elfWriteDynEntSym(ctxt, s, DT_VERSYM, gnuVersion.Sym()) elfWriteDynEntSym(ctxt, s, DT_VERSYM, gnuVersion.Sym())
} }
sy := ldr.CreateSymForUpdate(elfRelType+".plt", 0) sy := ldr.CreateSymForUpdate(elfRelType+".plt", 0)
if sy.Size() > 0 { if sy.Size() > 0 {
if elfRelType == ".rela" { if elfRelType == ".rela" {
Elfwritedynent2(ctxt.Arch, s, DT_PLTREL, DT_RELA) Elfwritedynent(ctxt.Arch, s, DT_PLTREL, DT_RELA)
} else { } else {
Elfwritedynent2(ctxt.Arch, s, DT_PLTREL, DT_REL) Elfwritedynent(ctxt.Arch, s, DT_PLTREL, DT_REL)
} }
elfwritedynentsymsize2(ctxt, s, DT_PLTRELSZ, sy.Sym()) elfwritedynentsymsize(ctxt, s, DT_PLTRELSZ, sy.Sym())
elfWriteDynEntSym(ctxt, s, DT_JMPREL, sy.Sym()) elfWriteDynEntSym(ctxt, s, DT_JMPREL, sy.Sym())
} }
Elfwritedynent2(ctxt.Arch, s, DT_NULL, 0) Elfwritedynent(ctxt.Arch, s, DT_NULL, 0)
} }
func elfphload(seg *sym.Segment) *ElfPhdr { func elfphload(seg *sym.Segment) *ElfPhdr {
@ -1382,14 +1382,14 @@ func elfrelocsect(ctxt *Link, sect *sym.Section, syms []loader.Sym) {
ldr.Errorf(s, "missing xsym in relocation") ldr.Errorf(s, "missing xsym in relocation")
continue continue
} }
esr := ElfSymForReloc2(ctxt, r.Xsym) esr := ElfSymForReloc(ctxt, r.Xsym)
if esr == 0 { if esr == 0 {
ldr.Errorf(s, "reloc %d (%s) to non-elf symbol %s (outer=%s) %d (%s)", r.Type(), sym.RelocName(ctxt.Arch, r.Type()), ldr.SymName(r.Sym()), ldr.SymName(r.Xsym), ldr.SymType(r.Sym()), ldr.SymType(r.Sym()).String()) ldr.Errorf(s, "reloc %d (%s) to non-elf symbol %s (outer=%s) %d (%s)", r.Type(), sym.RelocName(ctxt.Arch, r.Type()), ldr.SymName(r.Sym()), ldr.SymName(r.Xsym), ldr.SymType(r.Sym()), ldr.SymType(r.Sym()).String())
} }
if !ldr.AttrReachable(r.Xsym) { if !ldr.AttrReachable(r.Xsym) {
ldr.Errorf(s, "unreachable reloc %d (%s) target %v", r.Type(), sym.RelocName(ctxt.Arch, r.Type()), ldr.SymName(r.Xsym)) ldr.Errorf(s, "unreachable reloc %d (%s) target %v", r.Type(), sym.RelocName(ctxt.Arch, r.Type()), ldr.SymName(r.Xsym))
} }
if !thearch.Elfreloc2(ctxt, ldr, s, r, int64(uint64(ldr.SymValue(s)+int64(r.Off()))-sect.Vaddr)) { if !thearch.Elfreloc1(ctxt, ldr, s, r, int64(uint64(ldr.SymValue(s)+int64(r.Off()))-sect.Vaddr)) {
ldr.Errorf(s, "unsupported obj reloc %d (%s)/%d to %s", r.Type, sym.RelocName(ctxt.Arch, r.Type()), r.Siz(), ldr.SymName(r.Sym())) ldr.Errorf(s, "unsupported obj reloc %d (%s)/%d to %s", r.Type, sym.RelocName(ctxt.Arch, r.Type()), r.Siz(), ldr.SymName(r.Sym()))
} }
} }
@ -1406,25 +1406,25 @@ func Elfemitreloc(ctxt *Link) {
for _, sect := range Segtext.Sections { for _, sect := range Segtext.Sections {
if sect.Name == ".text" { if sect.Name == ".text" {
elfrelocsect(ctxt, sect, ctxt.Textp2) elfrelocsect(ctxt, sect, ctxt.Textp)
} else { } else {
elfrelocsect(ctxt, sect, ctxt.datap2) elfrelocsect(ctxt, sect, ctxt.datap)
} }
} }
for _, sect := range Segrodata.Sections { for _, sect := range Segrodata.Sections {
elfrelocsect(ctxt, sect, ctxt.datap2) elfrelocsect(ctxt, sect, ctxt.datap)
} }
for _, sect := range Segrelrodata.Sections { for _, sect := range Segrelrodata.Sections {
elfrelocsect(ctxt, sect, ctxt.datap2) elfrelocsect(ctxt, sect, ctxt.datap)
} }
for _, sect := range Segdata.Sections { for _, sect := range Segdata.Sections {
elfrelocsect(ctxt, sect, ctxt.datap2) elfrelocsect(ctxt, sect, ctxt.datap)
} }
for i := 0; i < len(Segdwarf.Sections); i++ { for i := 0; i < len(Segdwarf.Sections); i++ {
sect := Segdwarf.Sections[i] sect := Segdwarf.Sections[i]
si := dwarfp2[i] si := dwarfp[i]
if si.secSym() != loader.Sym(sect.Sym2) || if si.secSym() != loader.Sym(sect.Sym) ||
ctxt.loader.SymSect(si.secSym()) != sect { ctxt.loader.SymSect(si.secSym()) != sect {
panic("inconsistency between dwarfp and Segdwarf") panic("inconsistency between dwarfp and Segdwarf")
} }
@ -1656,47 +1656,47 @@ func (ctxt *Link) doelf() {
/* /*
* .dynamic table * .dynamic table
*/ */
elfwritedynentsym2(ctxt, dynamic, DT_HASH, hash.Sym()) elfwritedynentsym(ctxt, dynamic, DT_HASH, hash.Sym())
elfwritedynentsym2(ctxt, dynamic, DT_SYMTAB, dynsym.Sym()) elfwritedynentsym(ctxt, dynamic, DT_SYMTAB, dynsym.Sym())
if elf64 { if elf64 {
Elfwritedynent2(ctxt.Arch, dynamic, DT_SYMENT, ELF64SYMSIZE) Elfwritedynent(ctxt.Arch, dynamic, DT_SYMENT, ELF64SYMSIZE)
} else { } else {
Elfwritedynent2(ctxt.Arch, dynamic, DT_SYMENT, ELF32SYMSIZE) Elfwritedynent(ctxt.Arch, dynamic, DT_SYMENT, ELF32SYMSIZE)
} }
elfwritedynentsym2(ctxt, dynamic, DT_STRTAB, dynstr.Sym()) elfwritedynentsym(ctxt, dynamic, DT_STRTAB, dynstr.Sym())
elfwritedynentsymsize2(ctxt, dynamic, DT_STRSZ, dynstr.Sym()) elfwritedynentsymsize(ctxt, dynamic, DT_STRSZ, dynstr.Sym())
if elfRelType == ".rela" { if elfRelType == ".rela" {
rela := ldr.LookupOrCreateSym(".rela", 0) rela := ldr.LookupOrCreateSym(".rela", 0)
elfwritedynentsym2(ctxt, dynamic, DT_RELA, rela) elfwritedynentsym(ctxt, dynamic, DT_RELA, rela)
elfwritedynentsymsize2(ctxt, dynamic, DT_RELASZ, rela) elfwritedynentsymsize(ctxt, dynamic, DT_RELASZ, rela)
Elfwritedynent2(ctxt.Arch, dynamic, DT_RELAENT, ELF64RELASIZE) Elfwritedynent(ctxt.Arch, dynamic, DT_RELAENT, ELF64RELASIZE)
} else { } else {
rel := ldr.LookupOrCreateSym(".rel", 0) rel := ldr.LookupOrCreateSym(".rel", 0)
elfwritedynentsym2(ctxt, dynamic, DT_REL, rel) elfwritedynentsym(ctxt, dynamic, DT_REL, rel)
elfwritedynentsymsize2(ctxt, dynamic, DT_RELSZ, rel) elfwritedynentsymsize(ctxt, dynamic, DT_RELSZ, rel)
Elfwritedynent2(ctxt.Arch, dynamic, DT_RELENT, ELF32RELSIZE) Elfwritedynent(ctxt.Arch, dynamic, DT_RELENT, ELF32RELSIZE)
} }
if rpath.val != "" { if rpath.val != "" {
Elfwritedynent2(ctxt.Arch, dynamic, DT_RUNPATH, uint64(dynstr.Addstring(rpath.val))) Elfwritedynent(ctxt.Arch, dynamic, DT_RUNPATH, uint64(dynstr.Addstring(rpath.val)))
} }
if ctxt.IsPPC64() { if ctxt.IsPPC64() {
elfwritedynentsym2(ctxt, dynamic, DT_PLTGOT, plt.Sym()) elfwritedynentsym(ctxt, dynamic, DT_PLTGOT, plt.Sym())
} else { } else {
elfwritedynentsym2(ctxt, dynamic, DT_PLTGOT, gotplt.Sym()) elfwritedynentsym(ctxt, dynamic, DT_PLTGOT, gotplt.Sym())
} }
if ctxt.IsPPC64() { if ctxt.IsPPC64() {
Elfwritedynent2(ctxt.Arch, dynamic, DT_PPC64_OPT, 0) Elfwritedynent(ctxt.Arch, dynamic, DT_PPC64_OPT, 0)
} }
// Solaris dynamic linker can't handle an empty .rela.plt if // Solaris dynamic linker can't handle an empty .rela.plt if
// DT_JMPREL is emitted so we have to defer generation of DT_PLTREL, // DT_JMPREL is emitted so we have to defer generation of DT_PLTREL,
// DT_PLTRELSZ, and DT_JMPREL dynamic entries until after we know the // DT_PLTRELSZ, and DT_JMPREL dynamic entries until after we know the
// size of .rel(a).plt section. // size of .rel(a).plt section.
Elfwritedynent2(ctxt.Arch, dynamic, DT_DEBUG, 0) Elfwritedynent(ctxt.Arch, dynamic, DT_DEBUG, 0)
} }
if ctxt.IsShared() { if ctxt.IsShared() {
@ -1730,7 +1730,7 @@ func (ctxt *Link) doelf() {
} }
// Do not write DT_NULL. elfdynhash will finish it. // Do not write DT_NULL. elfdynhash will finish it.
func shsym2(sh *ElfShdr, ldr *loader.Loader, s loader.Sym) { func shsym(sh *ElfShdr, ldr *loader.Loader, s loader.Sym) {
if s == 0 { if s == 0 {
panic("bad symbol in shsym2") panic("bad symbol in shsym2")
} }
@ -2010,13 +2010,13 @@ func Asmbelf(ctxt *Link, symo int64) {
} }
} }
sh.info = i sh.info = i
shsym2(sh, ldr, s) shsym(sh, ldr, s)
sh = elfshname(".dynstr") sh = elfshname(".dynstr")
sh.type_ = SHT_STRTAB sh.type_ = SHT_STRTAB
sh.flags = SHF_ALLOC sh.flags = SHF_ALLOC
sh.addralign = 1 sh.addralign = 1
shsym2(sh, ldr, ldr.Lookup(".dynstr", 0)) shsym(sh, ldr, ldr.Lookup(".dynstr", 0))
if elfverneed != 0 { if elfverneed != 0 {
sh := elfshname(".gnu.version") sh := elfshname(".gnu.version")
@ -2025,7 +2025,7 @@ func Asmbelf(ctxt *Link, symo int64) {
sh.addralign = 2 sh.addralign = 2
sh.link = uint32(elfshname(".dynsym").shnum) sh.link = uint32(elfshname(".dynsym").shnum)
sh.entsize = 2 sh.entsize = 2
shsym2(sh, ldr, ldr.Lookup(".gnu.version", 0)) shsym(sh, ldr, ldr.Lookup(".gnu.version", 0))
sh = elfshname(".gnu.version_r") sh = elfshname(".gnu.version_r")
sh.type_ = SHT_GNU_VERNEED sh.type_ = SHT_GNU_VERNEED
@ -2033,7 +2033,7 @@ func Asmbelf(ctxt *Link, symo int64) {
sh.addralign = uint64(ctxt.Arch.RegSize) sh.addralign = uint64(ctxt.Arch.RegSize)
sh.info = uint32(elfverneed) sh.info = uint32(elfverneed)
sh.link = uint32(elfshname(".dynstr").shnum) sh.link = uint32(elfshname(".dynstr").shnum)
shsym2(sh, ldr, ldr.Lookup(".gnu.version_r", 0)) shsym(sh, ldr, ldr.Lookup(".gnu.version_r", 0))
} }
if elfRelType == ".rela" { if elfRelType == ".rela" {
@ -2044,7 +2044,7 @@ func Asmbelf(ctxt *Link, symo int64) {
sh.addralign = uint64(ctxt.Arch.RegSize) sh.addralign = uint64(ctxt.Arch.RegSize)
sh.link = uint32(elfshname(".dynsym").shnum) sh.link = uint32(elfshname(".dynsym").shnum)
sh.info = uint32(elfshname(".plt").shnum) sh.info = uint32(elfshname(".plt").shnum)
shsym2(sh, ldr, ldr.Lookup(".rela.plt", 0)) shsym(sh, ldr, ldr.Lookup(".rela.plt", 0))
sh = elfshname(".rela") sh = elfshname(".rela")
sh.type_ = SHT_RELA sh.type_ = SHT_RELA
@ -2052,7 +2052,7 @@ func Asmbelf(ctxt *Link, symo int64) {
sh.entsize = ELF64RELASIZE sh.entsize = ELF64RELASIZE
sh.addralign = 8 sh.addralign = 8
sh.link = uint32(elfshname(".dynsym").shnum) sh.link = uint32(elfshname(".dynsym").shnum)
shsym2(sh, ldr, ldr.Lookup(".rela", 0)) shsym(sh, ldr, ldr.Lookup(".rela", 0))
} else { } else {
sh := elfshname(".rel.plt") sh := elfshname(".rel.plt")
sh.type_ = SHT_REL sh.type_ = SHT_REL
@ -2060,7 +2060,7 @@ func Asmbelf(ctxt *Link, symo int64) {
sh.entsize = ELF32RELSIZE sh.entsize = ELF32RELSIZE
sh.addralign = 4 sh.addralign = 4
sh.link = uint32(elfshname(".dynsym").shnum) sh.link = uint32(elfshname(".dynsym").shnum)
shsym2(sh, ldr, ldr.Lookup(".rel.plt", 0)) shsym(sh, ldr, ldr.Lookup(".rel.plt", 0))
sh = elfshname(".rel") sh = elfshname(".rel")
sh.type_ = SHT_REL sh.type_ = SHT_REL
@ -2068,7 +2068,7 @@ func Asmbelf(ctxt *Link, symo int64) {
sh.entsize = ELF32RELSIZE sh.entsize = ELF32RELSIZE
sh.addralign = 4 sh.addralign = 4
sh.link = uint32(elfshname(".dynsym").shnum) sh.link = uint32(elfshname(".dynsym").shnum)
shsym2(sh, ldr, ldr.Lookup(".rel", 0)) shsym(sh, ldr, ldr.Lookup(".rel", 0))
} }
if eh.machine == EM_PPC64 { if eh.machine == EM_PPC64 {
@ -2076,7 +2076,7 @@ func Asmbelf(ctxt *Link, symo int64) {
sh.type_ = SHT_PROGBITS sh.type_ = SHT_PROGBITS
sh.flags = SHF_ALLOC + SHF_EXECINSTR sh.flags = SHF_ALLOC + SHF_EXECINSTR
sh.addralign = 4 sh.addralign = 4
shsym2(sh, ldr, ldr.Lookup(".glink", 0)) shsym(sh, ldr, ldr.Lookup(".glink", 0))
} }
sh = elfshname(".plt") sh = elfshname(".plt")
@ -2097,7 +2097,7 @@ func Asmbelf(ctxt *Link, symo int64) {
sh.entsize = 4 sh.entsize = 4
} }
sh.addralign = sh.entsize sh.addralign = sh.entsize
shsym2(sh, ldr, ldr.Lookup(".plt", 0)) shsym(sh, ldr, ldr.Lookup(".plt", 0))
// On ppc64, .got comes from the input files, so don't // On ppc64, .got comes from the input files, so don't
// create it here, and .got.plt is not used. // create it here, and .got.plt is not used.
@ -2107,14 +2107,14 @@ func Asmbelf(ctxt *Link, symo int64) {
sh.flags = SHF_ALLOC + SHF_WRITE sh.flags = SHF_ALLOC + SHF_WRITE
sh.entsize = uint64(ctxt.Arch.RegSize) sh.entsize = uint64(ctxt.Arch.RegSize)
sh.addralign = uint64(ctxt.Arch.RegSize) sh.addralign = uint64(ctxt.Arch.RegSize)
shsym2(sh, ldr, ldr.Lookup(".got", 0)) shsym(sh, ldr, ldr.Lookup(".got", 0))
sh = elfshname(".got.plt") sh = elfshname(".got.plt")
sh.type_ = SHT_PROGBITS sh.type_ = SHT_PROGBITS
sh.flags = SHF_ALLOC + SHF_WRITE sh.flags = SHF_ALLOC + SHF_WRITE
sh.entsize = uint64(ctxt.Arch.RegSize) sh.entsize = uint64(ctxt.Arch.RegSize)
sh.addralign = uint64(ctxt.Arch.RegSize) sh.addralign = uint64(ctxt.Arch.RegSize)
shsym2(sh, ldr, ldr.Lookup(".got.plt", 0)) shsym(sh, ldr, ldr.Lookup(".got.plt", 0))
} }
sh = elfshname(".hash") sh = elfshname(".hash")
@ -2123,7 +2123,7 @@ func Asmbelf(ctxt *Link, symo int64) {
sh.entsize = 4 sh.entsize = 4
sh.addralign = uint64(ctxt.Arch.RegSize) sh.addralign = uint64(ctxt.Arch.RegSize)
sh.link = uint32(elfshname(".dynsym").shnum) sh.link = uint32(elfshname(".dynsym").shnum)
shsym2(sh, ldr, ldr.Lookup(".hash", 0)) shsym(sh, ldr, ldr.Lookup(".hash", 0))
/* sh and PT_DYNAMIC for .dynamic section */ /* sh and PT_DYNAMIC for .dynamic section */
sh = elfshname(".dynamic") sh = elfshname(".dynamic")
@ -2133,7 +2133,7 @@ func Asmbelf(ctxt *Link, symo int64) {
sh.entsize = 2 * uint64(ctxt.Arch.RegSize) sh.entsize = 2 * uint64(ctxt.Arch.RegSize)
sh.addralign = uint64(ctxt.Arch.RegSize) sh.addralign = uint64(ctxt.Arch.RegSize)
sh.link = uint32(elfshname(".dynstr").shnum) sh.link = uint32(elfshname(".dynstr").shnum)
shsym2(sh, ldr, ldr.Lookup(".dynamic", 0)) shsym(sh, ldr, ldr.Lookup(".dynamic", 0))
ph := newElfPhdr() ph := newElfPhdr()
ph.type_ = PT_DYNAMIC ph.type_ = PT_DYNAMIC
ph.flags = PF_R + PF_W ph.flags = PF_R + PF_W
@ -2177,7 +2177,7 @@ elfobj:
sh := elfshname(".shstrtab") sh := elfshname(".shstrtab")
sh.type_ = SHT_STRTAB sh.type_ = SHT_STRTAB
sh.addralign = 1 sh.addralign = 1
shsym2(sh, ldr, ldr.Lookup(".shstrtab", 0)) shsym(sh, ldr, ldr.Lookup(".shstrtab", 0))
eh.shstrndx = uint16(sh.shnum) eh.shstrndx = uint16(sh.shnum)
// put these sections early in the list // put these sections early in the list
@ -2215,7 +2215,7 @@ elfobj:
for _, sect := range Segdata.Sections { for _, sect := range Segdata.Sections {
elfshreloc(ctxt.Arch, sect) elfshreloc(ctxt.Arch, sect)
} }
for _, si := range dwarfp2 { for _, si := range dwarfp {
sect := ldr.SymSect(si.secSym()) sect := ldr.SymSect(si.secSym())
elfshreloc(ctxt.Arch, sect) elfshreloc(ctxt.Arch, sect)
} }
@ -2280,7 +2280,7 @@ elfobj:
} }
if ctxt.LinkMode != LinkExternal { if ctxt.LinkMode != LinkExternal {
eh.entry = uint64(Entryvalue2(ctxt)) eh.entry = uint64(Entryvalue(ctxt))
} }
eh.version = EV_CURRENT eh.version = EV_CURRENT
@ -2321,12 +2321,12 @@ elfobj:
} }
} }
func elfadddynsym2(ldr *loader.Loader, target *Target, syms *ArchSyms, s loader.Sym) { func elfadddynsym(ldr *loader.Loader, target *Target, syms *ArchSyms, s loader.Sym) {
ldr.SetSymDynid(s, int32(Nelfsym)) ldr.SetSymDynid(s, int32(Nelfsym))
Nelfsym++ Nelfsym++
d := ldr.MakeSymbolUpdater(syms.DynSym2) d := ldr.MakeSymbolUpdater(syms.DynSym)
name := ldr.SymExtname(s) name := ldr.SymExtname(s)
dstru := ldr.MakeSymbolUpdater(syms.DynStr2) dstru := ldr.MakeSymbolUpdater(syms.DynStr)
st := ldr.SymType(s) st := ldr.SymType(s)
cgoeStatic := ldr.AttrCgoExportStatic(s) cgoeStatic := ldr.AttrCgoExportStatic(s)
cgoeDynamic := ldr.AttrCgoExportDynamic(s) cgoeDynamic := ldr.AttrCgoExportDynamic(s)
@ -2369,8 +2369,8 @@ func elfadddynsym2(ldr *loader.Loader, target *Target, syms *ArchSyms, s loader.
dil := ldr.SymDynimplib(s) dil := ldr.SymDynimplib(s)
if target.Arch.Family == sys.AMD64 && !cgoeDynamic && dil != "" && !seenlib[dil] { if target.Arch.Family == sys.AMD64 && !cgoeDynamic && dil != "" && !seenlib[dil] {
du := ldr.MakeSymbolUpdater(syms.Dynamic2) du := ldr.MakeSymbolUpdater(syms.Dynamic)
Elfwritedynent2(target.Arch, du, DT_NEEDED, uint64(dstru.Addstring(dil))) Elfwritedynent(target.Arch, du, DT_NEEDED, uint64(dstru.Addstring(dil)))
} }
} else { } else {

View File

@ -309,24 +309,24 @@ func adddynlib(ctxt *Link, lib string) {
seenlib[lib] = true seenlib[lib] = true
if ctxt.IsELF { if ctxt.IsELF {
dsu := ctxt.loader.MakeSymbolUpdater(ctxt.DynStr2) dsu := ctxt.loader.MakeSymbolUpdater(ctxt.DynStr)
if dsu.Size() == 0 { if dsu.Size() == 0 {
dsu.Addstring("") dsu.Addstring("")
} }
du := ctxt.loader.MakeSymbolUpdater(ctxt.Dynamic2) du := ctxt.loader.MakeSymbolUpdater(ctxt.Dynamic)
Elfwritedynent2(ctxt.Arch, du, DT_NEEDED, uint64(dsu.Addstring(lib))) Elfwritedynent(ctxt.Arch, du, DT_NEEDED, uint64(dsu.Addstring(lib)))
} else { } else {
Errorf(nil, "adddynlib: unsupported binary format") Errorf(nil, "adddynlib: unsupported binary format")
} }
} }
func Adddynsym2(ldr *loader.Loader, target *Target, syms *ArchSyms, s loader.Sym) { func Adddynsym(ldr *loader.Loader, target *Target, syms *ArchSyms, s loader.Sym) {
if ldr.SymDynid(s) >= 0 || target.LinkMode == LinkExternal { if ldr.SymDynid(s) >= 0 || target.LinkMode == LinkExternal {
return return
} }
if target.IsELF { if target.IsELF {
elfadddynsym2(ldr, target, syms, s) elfadddynsym(ldr, target, syms, s)
} else if target.HeadType == objabi.Hdarwin { } else if target.HeadType == objabi.Hdarwin {
ldr.Errorf(s, "adddynsym: missed symbol (Extname=%s)", ldr.SymExtname(s)) ldr.Errorf(s, "adddynsym: missed symbol (Extname=%s)", ldr.SymExtname(s))
} else if target.HeadType == objabi.Hwindows { } else if target.HeadType == objabi.Hwindows {
@ -368,7 +368,7 @@ func fieldtrack(arch *sys.Arch, l *loader.Loader) {
func (ctxt *Link) addexport() { func (ctxt *Link) addexport() {
// Track undefined external symbols during external link. // Track undefined external symbols during external link.
if ctxt.LinkMode == LinkExternal { if ctxt.LinkMode == LinkExternal {
for _, s := range ctxt.Textp2 { for _, s := range ctxt.Textp {
if ctxt.loader.AttrSpecial(s) || ctxt.loader.AttrSubSymbol(s) { if ctxt.loader.AttrSpecial(s) || ctxt.loader.AttrSubSymbol(s) {
continue continue
} }
@ -393,8 +393,8 @@ func (ctxt *Link) addexport() {
return return
} }
for _, exp := range ctxt.dynexp2 { for _, exp := range ctxt.dynexp {
Adddynsym2(ctxt.loader, &ctxt.Target, &ctxt.ArchSyms, exp) Adddynsym(ctxt.loader, &ctxt.Target, &ctxt.ArchSyms, exp)
} }
for _, lib := range dynlib { for _, lib := range dynlib {
adddynlib(ctxt, lib) adddynlib(ctxt, lib)

View File

@ -248,11 +248,11 @@ func PrepareAddmoduledata(ctxt *Link) (*loader.SymbolBuilder, loader.Sym) {
ctxt.loader.SetAttrLocal(ifs, true) ctxt.loader.SetAttrLocal(ifs, true)
initfunc.SetType(sym.STEXT) initfunc.SetType(sym.STEXT)
// Add the init func and/or addmoduledata to Textp2. // Add the init func and/or addmoduledata to Textp.
if ctxt.BuildMode == BuildModePlugin { if ctxt.BuildMode == BuildModePlugin {
ctxt.Textp2 = append(ctxt.Textp2, amd) ctxt.Textp = append(ctxt.Textp, amd)
} }
ctxt.Textp2 = append(ctxt.Textp2, initfunc.Sym()) ctxt.Textp = append(ctxt.Textp, initfunc.Sym())
// Create an init array entry // Create an init array entry
amdi := ctxt.loader.LookupOrCreateSym("go.link.addmoduledatainit", 0) amdi := ctxt.loader.LookupOrCreateSym("go.link.addmoduledatainit", 0)

View File

@ -98,27 +98,27 @@ import (
// relocation. Rather than allowing them universal access to all symbols, // relocation. Rather than allowing them universal access to all symbols,
// we keep a subset for relocation application. // we keep a subset for relocation application.
type ArchSyms struct { type ArchSyms struct {
Rel2 loader.Sym Rel loader.Sym
Rela2 loader.Sym Rela loader.Sym
RelPLT2 loader.Sym RelPLT loader.Sym
RelaPLT2 loader.Sym RelaPLT loader.Sym
LinkEditGOT2 loader.Sym LinkEditGOT loader.Sym
LinkEditPLT2 loader.Sym LinkEditPLT loader.Sym
TOC2 loader.Sym TOC loader.Sym
DotTOC2 []loader.Sym // for each version DotTOC []loader.Sym // for each version
GOT2 loader.Sym GOT loader.Sym
PLT2 loader.Sym PLT loader.Sym
GOTPLT2 loader.Sym GOTPLT loader.Sym
Tlsg2 loader.Sym Tlsg loader.Sym
Tlsoffset int Tlsoffset int
Dynamic2 loader.Sym Dynamic loader.Sym
DynSym2 loader.Sym DynSym loader.Sym
DynStr2 loader.Sym DynStr loader.Sym
} }
// mkArchSym is a helper for setArchSyms, to set up a special symbol. // mkArchSym is a helper for setArchSyms, to set up a special symbol.
@ -135,15 +135,15 @@ func (ctxt *Link) mkArchSymVec(name string, ver int, ls []loader.Sym) {
// setArchSyms sets up the ArchSyms structure, and must be called before // setArchSyms sets up the ArchSyms structure, and must be called before
// relocations are applied. // relocations are applied.
func (ctxt *Link) setArchSyms() { func (ctxt *Link) setArchSyms() {
ctxt.mkArchSym(".got", 0, &ctxt.GOT2) ctxt.mkArchSym(".got", 0, &ctxt.GOT)
ctxt.mkArchSym(".plt", 0, &ctxt.PLT2) ctxt.mkArchSym(".plt", 0, &ctxt.PLT)
ctxt.mkArchSym(".got.plt", 0, &ctxt.GOTPLT2) ctxt.mkArchSym(".got.plt", 0, &ctxt.GOTPLT)
ctxt.mkArchSym(".dynamic", 0, &ctxt.Dynamic2) ctxt.mkArchSym(".dynamic", 0, &ctxt.Dynamic)
ctxt.mkArchSym(".dynsym", 0, &ctxt.DynSym2) ctxt.mkArchSym(".dynsym", 0, &ctxt.DynSym)
ctxt.mkArchSym(".dynstr", 0, &ctxt.DynStr2) ctxt.mkArchSym(".dynstr", 0, &ctxt.DynStr)
if ctxt.IsPPC64() { if ctxt.IsPPC64() {
ctxt.mkArchSym("TOC", 0, &ctxt.TOC2) ctxt.mkArchSym("TOC", 0, &ctxt.TOC)
// NB: note the +2 below for DotTOC2 compared to the +1 for // NB: note the +2 below for DotTOC2 compared to the +1 for
// DocTOC. This is because loadlibfull() creates an additional // DocTOC. This is because loadlibfull() creates an additional
@ -151,23 +151,23 @@ func (ctxt *Link) setArchSyms() {
// *sym.Symbol symbols. Symbols that are assigned this final // *sym.Symbol symbols. Symbols that are assigned this final
// version are not going to have TOC references, so it should // version are not going to have TOC references, so it should
// be ok for them to inherit an invalid .TOC. symbol. // be ok for them to inherit an invalid .TOC. symbol.
ctxt.DotTOC2 = make([]loader.Sym, ctxt.Syms.MaxVersion()+2) ctxt.DotTOC = make([]loader.Sym, ctxt.Syms.MaxVersion()+2)
for i := 0; i <= ctxt.Syms.MaxVersion(); i++ { for i := 0; i <= ctxt.Syms.MaxVersion(); i++ {
if i >= 2 && i < sym.SymVerStatic { // these versions are not used currently if i >= 2 && i < sym.SymVerStatic { // these versions are not used currently
continue continue
} }
ctxt.mkArchSymVec(".TOC.", i, ctxt.DotTOC2) ctxt.mkArchSymVec(".TOC.", i, ctxt.DotTOC)
} }
} }
if ctxt.IsElf() { if ctxt.IsElf() {
ctxt.mkArchSym(".rel", 0, &ctxt.Rel2) ctxt.mkArchSym(".rel", 0, &ctxt.Rel)
ctxt.mkArchSym(".rela", 0, &ctxt.Rela2) ctxt.mkArchSym(".rela", 0, &ctxt.Rela)
ctxt.mkArchSym(".rel.plt", 0, &ctxt.RelPLT2) ctxt.mkArchSym(".rel.plt", 0, &ctxt.RelPLT)
ctxt.mkArchSym(".rela.plt", 0, &ctxt.RelaPLT2) ctxt.mkArchSym(".rela.plt", 0, &ctxt.RelaPLT)
} }
if ctxt.IsDarwin() { if ctxt.IsDarwin() {
ctxt.mkArchSym(".linkedit.got", 0, &ctxt.LinkEditGOT2) ctxt.mkArchSym(".linkedit.got", 0, &ctxt.LinkEditGOT)
ctxt.mkArchSym(".linkedit.plt", 0, &ctxt.LinkEditPLT2) ctxt.mkArchSym(".linkedit.plt", 0, &ctxt.LinkEditPLT)
} }
} }
@ -219,10 +219,9 @@ type Arch struct {
Asmb func(*Link, *loader.Loader) Asmb func(*Link, *loader.Loader)
Asmb2 func(*Link, *loader.Loader) Asmb2 func(*Link, *loader.Loader)
Elfreloc2 func(*Link, *loader.Loader, loader.Sym, loader.ExtRelocView, int64) bool Elfreloc1 func(*Link, *loader.Loader, loader.Sym, loader.ExtRelocView, int64) bool
Elfsetupplt func(ctxt *Link, plt, gotplt *loader.SymbolBuilder, dynamic loader.Sym) Elfsetupplt func(ctxt *Link, plt, gotplt *loader.SymbolBuilder, dynamic loader.Sym)
Gentext func(*Link) Gentext func(*Link, *loader.Loader)
Gentext2 func(*Link, *loader.Loader)
Machoreloc1 func(*sys.Arch, *OutBuf, *loader.Loader, loader.Sym, loader.ExtRelocView, int64) bool Machoreloc1 func(*sys.Arch, *OutBuf, *loader.Loader, loader.Sym, loader.ExtRelocView, int64) bool
PEreloc1 func(*sys.Arch, *OutBuf, *loader.Loader, loader.Sym, loader.ExtRelocView, int64) bool PEreloc1 func(*sys.Arch, *OutBuf, *loader.Loader, loader.Sym, loader.ExtRelocView, int64) bool
Xcoffreloc1 func(*sys.Arch, *OutBuf, *loader.Loader, loader.Sym, loader.ExtRelocView, int64) bool Xcoffreloc1 func(*sys.Arch, *OutBuf, *loader.Loader, loader.Sym, loader.ExtRelocView, int64) bool
@ -618,7 +617,7 @@ func setupdynexp(ctxt *Link) {
ctxt.loader.SetSymExtname(t, ctxt.loader.SymExtname(s)) ctxt.loader.SetSymExtname(t, ctxt.loader.SymExtname(s))
d[i] = t d[i] = t
} }
ctxt.dynexp2 = d ctxt.dynexp = d
ctxt.cgo_export_static = nil ctxt.cgo_export_static = nil
ctxt.cgo_export_dynamic = nil ctxt.cgo_export_dynamic = nil
@ -717,7 +716,7 @@ func (ctxt *Link) linksetup() {
Errorf(nil, "runtime declared tlsg variable %v", sb.Type()) Errorf(nil, "runtime declared tlsg variable %v", sb.Type())
} }
ctxt.loader.SetAttrReachable(tlsg, true) ctxt.loader.SetAttrReachable(tlsg, true)
ctxt.Tlsg2 = tlsg ctxt.Tlsg = tlsg
} }
var moduledata loader.Sym var moduledata loader.Sym
@ -766,7 +765,7 @@ func (ctxt *Link) linksetup() {
// the GC. // the GC.
mdsb.SetType(sym.SNOPTRDATA) mdsb.SetType(sym.SNOPTRDATA)
ctxt.loader.SetAttrReachable(moduledata, true) ctxt.loader.SetAttrReachable(moduledata, true)
ctxt.Moduledata2 = moduledata ctxt.Moduledata = moduledata
// If package versioning is required, generate a hash of the // If package versioning is required, generate a hash of the
// packages used in the link. // packages used in the link.
@ -787,7 +786,7 @@ func (ctxt *Link) linksetup() {
} }
} }
// DWARF-gen and other phases require that the unit Textp2 slices // DWARF-gen and other phases require that the unit Textp slices
// be populated, so that it can walk the functions in each unit. // be populated, so that it can walk the functions in each unit.
// Call into the loader to do this (requires that we collect the // Call into the loader to do this (requires that we collect the
// set of internal libraries first). NB: might be simpler if we // set of internal libraries first). NB: might be simpler if we
@ -798,7 +797,7 @@ func (ctxt *Link) linksetup() {
for _, lib := range ctxt.Library { for _, lib := range ctxt.Library {
intlibs = append(intlibs, isRuntimeDepPkg(lib.Pkg)) intlibs = append(intlibs, isRuntimeDepPkg(lib.Pkg))
} }
ctxt.Textp2 = ctxt.loader.AssignTextSymbolOrder(ctxt.Library, intlibs, ctxt.Textp2) ctxt.Textp = ctxt.loader.AssignTextSymbolOrder(ctxt.Library, intlibs, ctxt.Textp)
} }
// mangleTypeSym shortens the names of symbols that represent Go types // mangleTypeSym shortens the names of symbols that represent Go types
@ -1803,7 +1802,7 @@ func ldobj(ctxt *Link, f *bio.Reader, lib *sym.Library, length int64, pn string,
return return
} }
ehdr.flags = flags ehdr.flags = flags
ctxt.Textp2 = append(ctxt.Textp2, textp...) ctxt.Textp = append(ctxt.Textp, textp...)
} }
return ldhostobj(ldelf, ctxt.HeadType, f, pkg, length, pn, file) return ldhostobj(ldelf, ctxt.HeadType, f, pkg, length, pn, file)
} }
@ -1815,7 +1814,7 @@ func ldobj(ctxt *Link, f *bio.Reader, lib *sym.Library, length int64, pn string,
Errorf(nil, "%v", err) Errorf(nil, "%v", err)
return return
} }
ctxt.Textp2 = append(ctxt.Textp2, textp...) ctxt.Textp = append(ctxt.Textp, textp...)
} }
return ldhostobj(ldmacho, ctxt.HeadType, f, pkg, length, pn, file) return ldhostobj(ldmacho, ctxt.HeadType, f, pkg, length, pn, file)
} }
@ -1830,7 +1829,7 @@ func ldobj(ctxt *Link, f *bio.Reader, lib *sym.Library, length int64, pn string,
if rsrc != 0 { if rsrc != 0 {
setpersrc(ctxt, rsrc) setpersrc(ctxt, rsrc)
} }
ctxt.Textp2 = append(ctxt.Textp2, textp...) ctxt.Textp = append(ctxt.Textp, textp...)
} }
return ldhostobj(ldpe, ctxt.HeadType, f, pkg, length, pn, file) return ldhostobj(ldpe, ctxt.HeadType, f, pkg, length, pn, file)
} }
@ -1842,7 +1841,7 @@ func ldobj(ctxt *Link, f *bio.Reader, lib *sym.Library, length int64, pn string,
Errorf(nil, "%v", err) Errorf(nil, "%v", err)
return return
} }
ctxt.Textp2 = append(ctxt.Textp2, textp...) ctxt.Textp = append(ctxt.Textp, textp...)
} }
return ldhostobj(ldxcoff, ctxt.HeadType, f, pkg, length, pn, file) return ldhostobj(ldxcoff, ctxt.HeadType, f, pkg, length, pn, file)
} }
@ -2242,14 +2241,14 @@ func (ctxt *Link) dostkcheck() {
// Check every function, but do the nosplit functions in a first pass, // Check every function, but do the nosplit functions in a first pass,
// to make the printed failure chains as short as possible. // to make the printed failure chains as short as possible.
for _, s := range ctxt.Textp2 { for _, s := range ctxt.Textp {
if ldr.IsNoSplit(s) { if ldr.IsNoSplit(s) {
ch.sym = s ch.sym = s
sc.check(&ch, 0) sc.check(&ch, 0)
} }
} }
for _, s := range ctxt.Textp2 { for _, s := range ctxt.Textp {
if !ldr.IsNoSplit(s) { if !ldr.IsNoSplit(s) {
ch.sym = s ch.sym = s
sc.check(&ch, 0) sc.check(&ch, 0)
@ -2435,7 +2434,7 @@ const (
DeletedAutoSym = 'x' DeletedAutoSym = 'x'
) )
func (ctxt *Link) xdefine2(p string, t sym.SymKind, v int64) { func (ctxt *Link) xdefine(p string, t sym.SymKind, v int64) {
ldr := ctxt.loader ldr := ctxt.loader
s := ldr.CreateSymForUpdate(p, 0) s := ldr.CreateSymForUpdate(p, 0)
s.SetType(t) s.SetType(t)
@ -2456,7 +2455,7 @@ func datoff(ldr *loader.Loader, s loader.Sym, addr int64) int64 {
return 0 return 0
} }
func Entryvalue2(ctxt *Link) int64 { func Entryvalue(ctxt *Link) int64 {
a := *flagEntrySymbol a := *flagEntrySymbol
if a[0] >= '0' && a[0] <= '9' { if a[0] >= '0' && a[0] <= '9' {
return atolwhex(a) return atolwhex(a)
@ -2479,7 +2478,7 @@ func (ctxt *Link) callgraph() {
} }
ldr := ctxt.loader ldr := ctxt.loader
for _, s := range ctxt.Textp2 { for _, s := range ctxt.Textp {
relocs := ldr.Relocs(s) relocs := ldr.Relocs(s)
for i := 0; i < relocs.Count(); i++ { for i := 0; i < relocs.Count(); i++ {
r := relocs.At2(i) r := relocs.At2(i)
@ -2549,7 +2548,7 @@ func dfs(lib *sym.Library, mark map[*sym.Library]markKind, order *[]*sym.Library
*order = append(*order, lib) *order = append(*order, lib)
} }
func ElfSymForReloc2(ctxt *Link, s loader.Sym) int32 { func ElfSymForReloc(ctxt *Link, s loader.Sym) int32 {
// If putelfsym created a local version of this symbol, use that in all // If putelfsym created a local version of this symbol, use that in all
// relocations. // relocations.
les := ctxt.loader.SymLocalElfSym(s) les := ctxt.loader.SymLocalElfSym(s)

View File

@ -70,9 +70,9 @@ type Link struct {
Library []*sym.Library Library []*sym.Library
LibraryByPkg map[string]*sym.Library LibraryByPkg map[string]*sym.Library
Shlibs []Shlib Shlibs []Shlib
Textp2 []loader.Sym Textp []loader.Sym
NumFilesyms int NumFilesyms int
Moduledata2 loader.Sym Moduledata loader.Sym
PackageFile map[string]string PackageFile map[string]string
PackageShlib map[string]string PackageShlib map[string]string
@ -88,8 +88,8 @@ type Link struct {
cgo_export_static map[string]bool cgo_export_static map[string]bool
cgo_export_dynamic map[string]bool cgo_export_dynamic map[string]bool
datap2 []loader.Sym datap []loader.Sym
dynexp2 []loader.Sym dynexp []loader.Sym
// Elf symtab variables. // Elf symtab variables.
numelfsym int // starts at 0, 1 is reserved numelfsym int // starts at 0, 1 is reserved

View File

@ -550,7 +550,7 @@ func machoshbits(ctxt *Link, mseg *MachoSeg, sect *sym.Section, segname string)
if sect.Name == ".got" { if sect.Name == ".got" {
msect.name = "__nl_symbol_ptr" msect.name = "__nl_symbol_ptr"
msect.flag = S_NON_LAZY_SYMBOL_POINTERS msect.flag = S_NON_LAZY_SYMBOL_POINTERS
msect.res1 = uint32(ctxt.loader.SymSize(ctxt.ArchSyms.LinkEditPLT2) / 4) /* offset into indirect symbol table */ msect.res1 = uint32(ctxt.loader.SymSize(ctxt.ArchSyms.LinkEditPLT) / 4) /* offset into indirect symbol table */
} }
if sect.Name == ".init_array" { if sect.Name == ".init_array" {
@ -662,17 +662,17 @@ func Asmbmacho(ctxt *Link) {
case sys.AMD64: case sys.AMD64:
ml := newMachoLoad(ctxt.Arch, LC_UNIXTHREAD, 42+2) ml := newMachoLoad(ctxt.Arch, LC_UNIXTHREAD, 42+2)
ml.data[0] = 4 /* thread type */ ml.data[0] = 4 /* thread type */
ml.data[1] = 42 /* word count */ ml.data[1] = 42 /* word count */
ml.data[2+32] = uint32(Entryvalue2(ctxt)) /* start pc */ ml.data[2+32] = uint32(Entryvalue(ctxt)) /* start pc */
ml.data[2+32+1] = uint32(Entryvalue2(ctxt) >> 32) ml.data[2+32+1] = uint32(Entryvalue(ctxt) >> 32)
case sys.ARM64: case sys.ARM64:
ml := newMachoLoad(ctxt.Arch, LC_UNIXTHREAD, 68+2) ml := newMachoLoad(ctxt.Arch, LC_UNIXTHREAD, 68+2)
ml.data[0] = 6 /* thread type */ ml.data[0] = 6 /* thread type */
ml.data[1] = 68 /* word count */ ml.data[1] = 68 /* word count */
ml.data[2+64] = uint32(Entryvalue2(ctxt)) /* start pc */ ml.data[2+64] = uint32(Entryvalue(ctxt)) /* start pc */
ml.data[2+64+1] = uint32(Entryvalue2(ctxt) >> 32) ml.data[2+64+1] = uint32(Entryvalue(ctxt) >> 32)
} }
} }
@ -681,8 +681,8 @@ func Asmbmacho(ctxt *Link) {
// must match domacholink below // must match domacholink below
s1 := ldr.SymSize(ldr.Lookup(".machosymtab", 0)) s1 := ldr.SymSize(ldr.Lookup(".machosymtab", 0))
s2 := ldr.SymSize(ctxt.ArchSyms.LinkEditPLT2) s2 := ldr.SymSize(ctxt.ArchSyms.LinkEditPLT)
s3 := ldr.SymSize(ctxt.ArchSyms.LinkEditGOT2) s3 := ldr.SymSize(ctxt.ArchSyms.LinkEditGOT)
s4 := ldr.SymSize(ldr.Lookup(".machosymstr", 0)) s4 := ldr.SymSize(ldr.Lookup(".machosymstr", 0))
if ctxt.LinkMode != LinkExternal { if ctxt.LinkMode != LinkExternal {
@ -758,7 +758,7 @@ func collectmachosyms(ctxt *Link) {
} }
// Add text symbols. // Add text symbols.
for _, s := range ctxt.Textp2 { for _, s := range ctxt.Textp {
addsym(s) addsym(s)
} }
@ -826,7 +826,7 @@ func machosymorder(ctxt *Link) {
// On Mac OS X Mountain Lion, we must sort exported symbols // On Mac OS X Mountain Lion, we must sort exported symbols
// So we sort them here and pre-allocate dynid for them // So we sort them here and pre-allocate dynid for them
// See https://golang.org/issue/4029 // See https://golang.org/issue/4029
for _, s := range ctxt.dynexp2 { for _, s := range ctxt.dynexp {
if !ldr.AttrReachable(s) { if !ldr.AttrReachable(s) {
panic("dynexp symbol is not reachable") panic("dynexp symbol is not reachable")
} }
@ -953,8 +953,8 @@ func machodysymtab(ctxt *Link) {
// must match domacholink below // must match domacholink below
s1 := ldr.SymSize(ldr.Lookup(".machosymtab", 0)) s1 := ldr.SymSize(ldr.Lookup(".machosymtab", 0))
s2 := ldr.SymSize(ctxt.ArchSyms.LinkEditPLT2) s2 := ldr.SymSize(ctxt.ArchSyms.LinkEditPLT)
s3 := ldr.SymSize(ctxt.ArchSyms.LinkEditGOT2) s3 := ldr.SymSize(ctxt.ArchSyms.LinkEditGOT)
ml.data[12] = uint32(linkoff + s1) /* indirectsymoff */ ml.data[12] = uint32(linkoff + s1) /* indirectsymoff */
ml.data[13] = uint32((s2 + s3) / 4) /* nindirectsyms */ ml.data[13] = uint32((s2 + s3) / 4) /* nindirectsyms */
@ -971,8 +971,8 @@ func Domacholink(ctxt *Link) int64 {
// write data that will be linkedit section // write data that will be linkedit section
s1 := ldr.Lookup(".machosymtab", 0) s1 := ldr.Lookup(".machosymtab", 0)
s2 := ctxt.ArchSyms.LinkEditPLT2 s2 := ctxt.ArchSyms.LinkEditPLT
s3 := ctxt.ArchSyms.LinkEditGOT2 s3 := ctxt.ArchSyms.LinkEditGOT
s4 := ldr.Lookup(".machosymstr", 0) s4 := ldr.Lookup(".machosymstr", 0)
// Force the linkedit section to end on a 16-byte // Force the linkedit section to end on a 16-byte
@ -1062,17 +1062,17 @@ func Machoemitreloc(ctxt *Link) {
} }
ldr := ctxt.loader ldr := ctxt.loader
machorelocsect(ctxt, ldr, Segtext.Sections[0], ctxt.Textp2) machorelocsect(ctxt, ldr, Segtext.Sections[0], ctxt.Textp)
for _, sect := range Segtext.Sections[1:] { for _, sect := range Segtext.Sections[1:] {
machorelocsect(ctxt, ldr, sect, ctxt.datap2) machorelocsect(ctxt, ldr, sect, ctxt.datap)
} }
for _, sect := range Segdata.Sections { for _, sect := range Segdata.Sections {
machorelocsect(ctxt, ldr, sect, ctxt.datap2) machorelocsect(ctxt, ldr, sect, ctxt.datap)
} }
for i := 0; i < len(Segdwarf.Sections); i++ { for i := 0; i < len(Segdwarf.Sections); i++ {
sect := Segdwarf.Sections[i] sect := Segdwarf.Sections[i]
si := dwarfp2[i] si := dwarfp[i]
if si.secSym() != loader.Sym(sect.Sym2) || if si.secSym() != loader.Sym(sect.Sym) ||
ctxt.loader.SymSect(si.secSym()) != sect { ctxt.loader.SymSect(si.secSym()) != sect {
panic("inconsistency between dwarfp and Segdwarf") panic("inconsistency between dwarfp and Segdwarf")
} }

View File

@ -275,7 +275,7 @@ func Main(arch *sys.Arch, theArch Arch) {
ctxt.setArchSyms() ctxt.setArchSyms()
ctxt.addexport() ctxt.addexport()
bench.Start("Gentext") bench.Start("Gentext")
thearch.Gentext2(ctxt, ctxt.loader) // trampolines, call stubs, etc. thearch.Gentext(ctxt, ctxt.loader) // trampolines, call stubs, etc.
bench.Start("textaddress") bench.Start("textaddress")
ctxt.textaddress() ctxt.textaddress()
@ -292,7 +292,7 @@ func Main(arch *sys.Arch, theArch Arch) {
bench.Start("symtab") bench.Start("symtab")
symGroupType := ctxt.symtab() symGroupType := ctxt.symtab()
bench.Start("dodata") bench.Start("dodata")
ctxt.dodata2(symGroupType) ctxt.dodata(symGroupType)
bench.Start("address") bench.Start("address")
order := ctxt.address() order := ctxt.address()
bench.Start("dwarfcompress") bench.Start("dwarfcompress")

View File

@ -259,7 +259,7 @@ func (ctxt *Link) pclntab() loader.Bitmap {
// offset to file table [4 bytes] // offset to file table [4 bytes]
// Find container symbols and mark them as such. // Find container symbols and mark them as such.
for _, s := range ctxt.Textp2 { for _, s := range ctxt.Textp {
outer := ldr.OuterSym(s) outer := ldr.OuterSym(s)
if outer != 0 { if outer != 0 {
state.container.Set(outer) state.container.Set(outer)
@ -268,8 +268,8 @@ func (ctxt *Link) pclntab() loader.Bitmap {
// Gather some basic stats and info. // Gather some basic stats and info.
var nfunc int32 var nfunc int32
prevSect := ldr.SymSect(ctxt.Textp2[0]) prevSect := ldr.SymSect(ctxt.Textp[0])
for _, s := range ctxt.Textp2 { for _, s := range ctxt.Textp {
if !emitPcln(ctxt, s, state.container) { if !emitPcln(ctxt, s, state.container) {
continue continue
} }
@ -297,7 +297,7 @@ func (ctxt *Link) pclntab() loader.Bitmap {
ftab.SetUint(ctxt.Arch, 8, uint64(nfunc)) ftab.SetUint(ctxt.Arch, 8, uint64(nfunc))
pclntabPclntabOffset = int32(8 + ctxt.Arch.PtrSize) pclntabPclntabOffset = int32(8 + ctxt.Arch.PtrSize)
szHint := len(ctxt.Textp2) * 2 szHint := len(ctxt.Textp) * 2
funcnameoff := make(map[string]int32, szHint) funcnameoff := make(map[string]int32, szHint)
nameToOffset := func(name string) int32 { nameToOffset := func(name string) int32 {
nameoff, ok := funcnameoff[name] nameoff, ok := funcnameoff[name]
@ -350,8 +350,8 @@ func (ctxt *Link) pclntab() loader.Bitmap {
funcdataoff := []int64{} funcdataoff := []int64{}
nfunc = 0 // repurpose nfunc as a running index nfunc = 0 // repurpose nfunc as a running index
prevFunc := ctxt.Textp2[0] prevFunc := ctxt.Textp[0]
for _, s := range ctxt.Textp2 { for _, s := range ctxt.Textp {
if !emitPcln(ctxt, s, state.container) { if !emitPcln(ctxt, s, state.container) {
continue continue
} }
@ -524,7 +524,7 @@ func (ctxt *Link) pclntab() loader.Bitmap {
nfunc++ nfunc++
} }
last := ctxt.Textp2[len(ctxt.Textp2)-1] last := ctxt.Textp[len(ctxt.Textp)-1]
pclntabLastFunc = last pclntabLastFunc = last
// Final entry of table is just end pc. // Final entry of table is just end pc.
setAddr(ftab, ctxt.Arch, 8+int64(ctxt.Arch.PtrSize)+int64(nfunc)*2*int64(ctxt.Arch.PtrSize), last, ldr.SymSize(last)) setAddr(ftab, ctxt.Arch, 8+int64(ctxt.Arch.PtrSize)+int64(nfunc)*2*int64(ctxt.Arch.PtrSize), last, ldr.SymSize(last))
@ -592,8 +592,8 @@ func (ctxt *Link) findfunctab(container loader.Bitmap) {
ldr.SetAttrLocal(tsym, true) ldr.SetAttrLocal(tsym, true)
// find min and max address // find min and max address
min := ldr.SymValue(ctxt.Textp2[0]) min := ldr.SymValue(ctxt.Textp[0])
lastp := ctxt.Textp2[len(ctxt.Textp2)-1] lastp := ctxt.Textp[len(ctxt.Textp)-1]
max := ldr.SymValue(lastp) + ldr.SymSize(lastp) max := ldr.SymValue(lastp) + ldr.SymSize(lastp)
// for each subbucket, compute the minimum of all symbol indexes // for each subbucket, compute the minimum of all symbol indexes
@ -605,18 +605,18 @@ func (ctxt *Link) findfunctab(container loader.Bitmap) {
indexes[i] = NOIDX indexes[i] = NOIDX
} }
idx := int32(0) idx := int32(0)
for i, s := range ctxt.Textp2 { for i, s := range ctxt.Textp {
if !emitPcln(ctxt, s, container) { if !emitPcln(ctxt, s, container) {
continue continue
} }
p := ldr.SymValue(s) p := ldr.SymValue(s)
var e loader.Sym var e loader.Sym
i++ i++
if i < len(ctxt.Textp2) { if i < len(ctxt.Textp) {
e = ctxt.Textp2[i] e = ctxt.Textp[i]
} }
for e != 0 && !emitPcln(ctxt, e, container) && i < len(ctxt.Textp2) { for e != 0 && !emitPcln(ctxt, e, container) && i < len(ctxt.Textp) {
e = ctxt.Textp2[i] e = ctxt.Textp[i]
i++ i++
} }
q := max q := max

View File

@ -542,9 +542,9 @@ func (f *peFile) emitRelocations(ctxt *Link) {
seg *sym.Segment seg *sym.Segment
syms []loader.Sym syms []loader.Sym
}{ }{
{f.textSect, &Segtext, ctxt.Textp2}, {f.textSect, &Segtext, ctxt.Textp},
{f.rdataSect, &Segrodata, ctxt.datap2}, {f.rdataSect, &Segrodata, ctxt.datap},
{f.dataSect, &Segdata, ctxt.datap2}, {f.dataSect, &Segdata, ctxt.datap},
} }
for _, s := range sects { for _, s := range sects {
s.peSect.emitRelocations(ctxt.Out, func() int { s.peSect.emitRelocations(ctxt.Out, func() int {
@ -559,8 +559,8 @@ func (f *peFile) emitRelocations(ctxt *Link) {
dwarfLoop: dwarfLoop:
for i := 0; i < len(Segdwarf.Sections); i++ { for i := 0; i < len(Segdwarf.Sections); i++ {
sect := Segdwarf.Sections[i] sect := Segdwarf.Sections[i]
si := dwarfp2[i] si := dwarfp[i]
if si.secSym() != loader.Sym(sect.Sym2) || if si.secSym() != loader.Sym(sect.Sym) ||
ldr.SymSect(si.secSym()) != sect { ldr.SymSect(si.secSym()) != sect {
panic("inconsistency between dwarfp and Segdwarf") panic("inconsistency between dwarfp and Segdwarf")
} }
@ -704,7 +704,7 @@ func (f *peFile) writeSymbols(ctxt *Link) {
} }
// Add text symbols. // Add text symbols.
for _, s := range ctxt.Textp2 { for _, s := range ctxt.Textp {
addsym(s) addsym(s)
} }
@ -841,8 +841,8 @@ func (f *peFile) writeOptionalHeader(ctxt *Link) {
oh64.SizeOfUninitializedData = 0 oh64.SizeOfUninitializedData = 0
oh.SizeOfUninitializedData = 0 oh.SizeOfUninitializedData = 0
if ctxt.LinkMode != LinkExternal { if ctxt.LinkMode != LinkExternal {
oh64.AddressOfEntryPoint = uint32(Entryvalue2(ctxt) - PEBASE) oh64.AddressOfEntryPoint = uint32(Entryvalue(ctxt) - PEBASE)
oh.AddressOfEntryPoint = uint32(Entryvalue2(ctxt) - PEBASE) oh.AddressOfEntryPoint = uint32(Entryvalue(ctxt) - PEBASE)
} }
oh64.BaseOfCode = f.textSect.virtualAddress oh64.BaseOfCode = f.textSect.virtualAddress
oh.BaseOfCode = f.textSect.virtualAddress oh.BaseOfCode = f.textSect.virtualAddress
@ -1477,10 +1477,10 @@ func addPEBaseReloc(ctxt *Link) {
// Get relocation information // Get relocation information
ldr := ctxt.loader ldr := ctxt.loader
for _, s := range ctxt.Textp2 { for _, s := range ctxt.Textp {
addPEBaseRelocSym(ldr, s, &rt) addPEBaseRelocSym(ldr, s, &rt)
} }
for _, s := range ctxt.datap2 { for _, s := range ctxt.datap {
addPEBaseRelocSym(ldr, s, &rt) addPEBaseRelocSym(ldr, s, &rt)
} }

View File

@ -183,7 +183,7 @@ func genelfsym(ctxt *Link, elfbind int) {
// Text symbols. // Text symbols.
s := ldr.Lookup("runtime.text", 0) s := ldr.Lookup("runtime.text", 0)
putelfsym(ctxt, s, STT_FUNC, elfbind) putelfsym(ctxt, s, STT_FUNC, elfbind)
for _, s := range ctxt.Textp2 { for _, s := range ctxt.Textp {
putelfsym(ctxt, s, STT_FUNC, elfbind) putelfsym(ctxt, s, STT_FUNC, elfbind)
} }
s = ldr.Lookup("runtime.etext", 0) s = ldr.Lookup("runtime.etext", 0)
@ -288,7 +288,7 @@ func Asmplan9sym(ctxt *Link) {
} }
// Add text symbols. // Add text symbols.
for _, s := range ctxt.Textp2 { for _, s := range ctxt.Textp {
putplan9sym(ctxt, ldr, s, TextSym) putplan9sym(ctxt, ldr, s, TextSym)
} }
@ -410,38 +410,38 @@ func (ctxt *Link) symtab() []sym.SymKind {
// Define these so that they'll get put into the symbol table. // Define these so that they'll get put into the symbol table.
// data.c:/^address will provide the actual values. // data.c:/^address will provide the actual values.
ctxt.xdefine2("runtime.text", sym.STEXT, 0) ctxt.xdefine("runtime.text", sym.STEXT, 0)
ctxt.xdefine2("runtime.etext", sym.STEXT, 0) ctxt.xdefine("runtime.etext", sym.STEXT, 0)
ctxt.xdefine2("runtime.itablink", sym.SRODATA, 0) ctxt.xdefine("runtime.itablink", sym.SRODATA, 0)
ctxt.xdefine2("runtime.eitablink", sym.SRODATA, 0) ctxt.xdefine("runtime.eitablink", sym.SRODATA, 0)
ctxt.xdefine2("runtime.rodata", sym.SRODATA, 0) ctxt.xdefine("runtime.rodata", sym.SRODATA, 0)
ctxt.xdefine2("runtime.erodata", sym.SRODATA, 0) ctxt.xdefine("runtime.erodata", sym.SRODATA, 0)
ctxt.xdefine2("runtime.types", sym.SRODATA, 0) ctxt.xdefine("runtime.types", sym.SRODATA, 0)
ctxt.xdefine2("runtime.etypes", sym.SRODATA, 0) ctxt.xdefine("runtime.etypes", sym.SRODATA, 0)
ctxt.xdefine2("runtime.noptrdata", sym.SNOPTRDATA, 0) ctxt.xdefine("runtime.noptrdata", sym.SNOPTRDATA, 0)
ctxt.xdefine2("runtime.enoptrdata", sym.SNOPTRDATA, 0) ctxt.xdefine("runtime.enoptrdata", sym.SNOPTRDATA, 0)
ctxt.xdefine2("runtime.data", sym.SDATA, 0) ctxt.xdefine("runtime.data", sym.SDATA, 0)
ctxt.xdefine2("runtime.edata", sym.SDATA, 0) ctxt.xdefine("runtime.edata", sym.SDATA, 0)
ctxt.xdefine2("runtime.bss", sym.SBSS, 0) ctxt.xdefine("runtime.bss", sym.SBSS, 0)
ctxt.xdefine2("runtime.ebss", sym.SBSS, 0) ctxt.xdefine("runtime.ebss", sym.SBSS, 0)
ctxt.xdefine2("runtime.noptrbss", sym.SNOPTRBSS, 0) ctxt.xdefine("runtime.noptrbss", sym.SNOPTRBSS, 0)
ctxt.xdefine2("runtime.enoptrbss", sym.SNOPTRBSS, 0) ctxt.xdefine("runtime.enoptrbss", sym.SNOPTRBSS, 0)
ctxt.xdefine2("runtime.end", sym.SBSS, 0) ctxt.xdefine("runtime.end", sym.SBSS, 0)
ctxt.xdefine2("runtime.epclntab", sym.SRODATA, 0) ctxt.xdefine("runtime.epclntab", sym.SRODATA, 0)
ctxt.xdefine2("runtime.esymtab", sym.SRODATA, 0) ctxt.xdefine("runtime.esymtab", sym.SRODATA, 0)
// garbage collection symbols // garbage collection symbols
s := ldr.CreateSymForUpdate("runtime.gcdata", 0) s := ldr.CreateSymForUpdate("runtime.gcdata", 0)
s.SetType(sym.SRODATA) s.SetType(sym.SRODATA)
s.SetSize(0) s.SetSize(0)
s.SetReachable(true) s.SetReachable(true)
ctxt.xdefine2("runtime.egcdata", sym.SRODATA, 0) ctxt.xdefine("runtime.egcdata", sym.SRODATA, 0)
s = ldr.CreateSymForUpdate("runtime.gcbss", 0) s = ldr.CreateSymForUpdate("runtime.gcbss", 0)
s.SetType(sym.SRODATA) s.SetType(sym.SRODATA)
s.SetSize(0) s.SetSize(0)
s.SetReachable(true) s.SetReachable(true)
ctxt.xdefine2("runtime.egcbss", sym.SRODATA, 0) ctxt.xdefine("runtime.egcbss", sym.SRODATA, 0)
// pseudo-symbols to mark locations of type, string, and go string data. // pseudo-symbols to mark locations of type, string, and go string data.
var symtype, symtyperel loader.Sym var symtype, symtyperel loader.Sym
@ -607,7 +607,7 @@ func (ctxt *Link) symtab() []sym.SymKind {
// runtime to use. Any changes here must be matched by changes to // runtime to use. Any changes here must be matched by changes to
// the definition of moduledata in runtime/symtab.go. // the definition of moduledata in runtime/symtab.go.
// This code uses several global variables that are set by pcln.go:pclntab. // This code uses several global variables that are set by pcln.go:pclntab.
moduledata := ldr.MakeSymbolUpdater(ctxt.Moduledata2) moduledata := ldr.MakeSymbolUpdater(ctxt.Moduledata)
pclntab := ldr.Lookup("runtime.pclntab", 0) pclntab := ldr.Lookup("runtime.pclntab", 0)
// The pclntab slice // The pclntab slice
moduledata.AddAddr(ctxt.Arch, pclntab) moduledata.AddAddr(ctxt.Arch, pclntab)

View File

@ -360,7 +360,7 @@ type XcoffLdRel64 struct {
// xcoffLoaderReloc holds information about a relocation made by the loader. // xcoffLoaderReloc holds information about a relocation made by the loader.
type xcoffLoaderReloc struct { type xcoffLoaderReloc struct {
sym2 loader.Sym sym loader.Sym
roff int32 roff int32
rtype uint16 rtype uint16
symndx int32 symndx int32
@ -568,7 +568,7 @@ var (
// xcoffUpdateOuterSize stores the size of outer symbols in order to have it // xcoffUpdateOuterSize stores the size of outer symbols in order to have it
// in the symbol table. // in the symbol table.
func xcoffUpdateOuterSize2(ctxt *Link, size int64, stype sym.SymKind) { func xcoffUpdateOuterSize(ctxt *Link, size int64, stype sym.SymKind) {
if size == 0 { if size == 0 {
return return
} }
@ -622,7 +622,7 @@ func xcoffAlign(ldr *loader.Loader, x loader.Sym, t SymbolType) uint8 {
if t == TextSym { if t == TextSym {
align = int32(Funcalign) align = int32(Funcalign)
} else { } else {
align = symalign2(ldr, x) align = symalign(ldr, x)
} }
} }
return logBase2(int(align)) return logBase2(int(align))
@ -671,7 +671,7 @@ func (f *xcoffFile) writeSymbolNewFile(ctxt *Link, name string, firstEntry uint6
dwsize = getDwsectCUSize(sect.Name, name) dwsize = getDwsectCUSize(sect.Name, name)
// .debug_abbrev is common to all packages and not found with the previous function // .debug_abbrev is common to all packages and not found with the previous function
if sect.Name == ".debug_abbrev" { if sect.Name == ".debug_abbrev" {
dwsize = uint64(ldr.SymSize(loader.Sym(sect.Sym2))) dwsize = uint64(ldr.SymSize(loader.Sym(sect.Sym)))
} }
} else { } else {
@ -693,7 +693,7 @@ func (f *xcoffFile) writeSymbolNewFile(ctxt *Link, name string, firstEntry uint6
// Dwarf relocations need the symbol number of .dw* symbols. // Dwarf relocations need the symbol number of .dw* symbols.
// It doesn't need to know it for each package, one is enough. // It doesn't need to know it for each package, one is enough.
// currSymSrcFile.csectAux == nil means first package. // currSymSrcFile.csectAux == nil means first package.
ldr.SetSymDynid(loader.Sym(sect.Sym2), int32(f.symbolCount)) ldr.SetSymDynid(loader.Sym(sect.Sym), int32(f.symbolCount))
if sect.Name == ".debug_frame" && ctxt.LinkMode != LinkExternal { if sect.Name == ".debug_frame" && ctxt.LinkMode != LinkExternal {
// CIE size must be added to the first package. // CIE size must be added to the first package.
@ -1125,7 +1125,7 @@ func (f *xcoffFile) asmaixsym(ctxt *Link) {
} }
} }
for _, s := range ctxt.Textp2 { for _, s := range ctxt.Textp {
putaixsym(ctxt, s, TextSym) putaixsym(ctxt, s, TextSym)
} }
@ -1220,7 +1220,7 @@ func Xcoffadddynrel(target *Target, ldr *loader.Loader, syms *ArchSyms, s loader
} }
xldr := &xcoffLoaderReloc{ xldr := &xcoffLoaderReloc{
sym2: s, sym: s,
roff: r.Off(), roff: r.Off(),
} }
targ := ldr.ResolveABIAlias(r.Sym()) targ := ldr.ResolveABIAlias(r.Sym())
@ -1410,7 +1410,7 @@ func (f *xcoffFile) writeLdrScn(ctxt *Link, globalOff uint64) {
off += uint64(16 * len(f.loaderReloc)) off += uint64(16 * len(f.loaderReloc))
for _, r := range f.loaderReloc { for _, r := range f.loaderReloc {
symp := r.sym2 symp := r.sym
if symp == 0 { if symp == 0 {
panic("unexpected 0 sym value") panic("unexpected 0 sym value")
} }
@ -1713,9 +1713,9 @@ func (f *xcoffFile) emitRelocations(ctxt *Link, fileoff int64) {
for _, seg := range s.segs { for _, seg := range s.segs {
for _, sect := range seg.Sections { for _, sect := range seg.Sections {
if sect.Name == ".text" { if sect.Name == ".text" {
n += relocsect(sect, ctxt.Textp2, 0) n += relocsect(sect, ctxt.Textp, 0)
} else { } else {
n += relocsect(sect, ctxt.datap2, 0) n += relocsect(sect, ctxt.datap, 0)
} }
} }
} }
@ -1725,8 +1725,8 @@ func (f *xcoffFile) emitRelocations(ctxt *Link, fileoff int64) {
dwarfLoop: dwarfLoop:
for i := 0; i < len(Segdwarf.Sections); i++ { for i := 0; i < len(Segdwarf.Sections); i++ {
sect := Segdwarf.Sections[i] sect := Segdwarf.Sections[i]
si := dwarfp2[i] si := dwarfp[i]
if si.secSym() != loader.Sym(sect.Sym2) || if si.secSym() != loader.Sym(sect.Sym) ||
ldr.SymSect(si.secSym()) != sect { ldr.SymSect(si.secSym()) != sect {
panic("inconsistency between dwarfp and Segdwarf") panic("inconsistency between dwarfp and Segdwarf")
} }

View File

@ -2275,19 +2275,19 @@ func (l *Loader) UndefinedRelocTargets(limit int) []Sym {
return result return result
} }
// AssignTextSymbolOrder populates the Textp2 slices within each // AssignTextSymbolOrder populates the Textp slices within each
// library and compilation unit, insuring that packages are laid down // library and compilation unit, insuring that packages are laid down
// in dependency order (internal first, then everything else). Return value // in dependency order (internal first, then everything else). Return value
// is a slice of all text syms. // is a slice of all text syms.
func (l *Loader) AssignTextSymbolOrder(libs []*sym.Library, intlibs []bool, extsyms []Sym) []Sym { func (l *Loader) AssignTextSymbolOrder(libs []*sym.Library, intlibs []bool, extsyms []Sym) []Sym {
// Library Textp2 lists should be empty at this point. // Library Textp lists should be empty at this point.
for _, lib := range libs { for _, lib := range libs {
if len(lib.Textp2) != 0 { if len(lib.Textp) != 0 {
panic("expected empty Textp2 slice for library") panic("expected empty Textp slice for library")
} }
if len(lib.DupTextSyms2) != 0 { if len(lib.DupTextSyms) != 0 {
panic("expected empty DupTextSyms2 slice for library") panic("expected empty DupTextSyms slice for library")
} }
} }
@ -2298,17 +2298,17 @@ func (l *Loader) AssignTextSymbolOrder(libs []*sym.Library, intlibs []bool, exts
// call the regular addToTextp. // call the regular addToTextp.
assignedToUnit := MakeBitmap(l.NSym() + 1) assignedToUnit := MakeBitmap(l.NSym() + 1)
// Start off textp2 with reachable external syms. // Start off textp with reachable external syms.
textp2 := []Sym{} textp := []Sym{}
for _, sym := range extsyms { for _, sym := range extsyms {
if !l.attrReachable.Has(sym) { if !l.attrReachable.Has(sym) {
continue continue
} }
textp2 = append(textp2, sym) textp = append(textp, sym)
} }
// Walk through all text symbols from Go object files and append // Walk through all text symbols from Go object files and append
// them to their corresponding library's textp2 list. // them to their corresponding library's textp list.
for _, o := range l.objs[goObjStart:] { for _, o := range l.objs[goObjStart:] {
r := o.r r := o.r
lib := r.unit.Lib lib := r.unit.Lib
@ -2328,15 +2328,15 @@ func (l *Loader) AssignTextSymbolOrder(libs []*sym.Library, intlibs []bool, exts
// We still need to record its presence in the current // We still need to record its presence in the current
// package, as the trampoline pass expects packages // package, as the trampoline pass expects packages
// are laid out in dependency order. // are laid out in dependency order.
lib.DupTextSyms2 = append(lib.DupTextSyms2, sym.LoaderSym(gi)) lib.DupTextSyms = append(lib.DupTextSyms, sym.LoaderSym(gi))
continue // symbol in different object continue // symbol in different object
} }
if dupok { if dupok {
lib.DupTextSyms2 = append(lib.DupTextSyms2, sym.LoaderSym(gi)) lib.DupTextSyms = append(lib.DupTextSyms, sym.LoaderSym(gi))
continue continue
} }
lib.Textp2 = append(lib.Textp2, sym.LoaderSym(gi)) lib.Textp = append(lib.Textp, sym.LoaderSym(gi))
} }
} }
@ -2346,15 +2346,15 @@ func (l *Loader) AssignTextSymbolOrder(libs []*sym.Library, intlibs []bool, exts
if intlibs[idx] != doInternal { if intlibs[idx] != doInternal {
continue continue
} }
lists := [2][]sym.LoaderSym{lib.Textp2, lib.DupTextSyms2} lists := [2][]sym.LoaderSym{lib.Textp, lib.DupTextSyms}
for i, list := range lists { for i, list := range lists {
for _, s := range list { for _, s := range list {
sym := Sym(s) sym := Sym(s)
if l.attrReachable.Has(sym) && !assignedToUnit.Has(sym) { if l.attrReachable.Has(sym) && !assignedToUnit.Has(sym) {
textp2 = append(textp2, sym) textp = append(textp, sym)
unit := l.SymUnit(sym) unit := l.SymUnit(sym)
if unit != nil { if unit != nil {
unit.Textp2 = append(unit.Textp2, s) unit.Textp = append(unit.Textp, s)
assignedToUnit.Set(sym) assignedToUnit.Set(sym)
} }
// Dupok symbols may be defined in multiple packages; the // Dupok symbols may be defined in multiple packages; the
@ -2368,12 +2368,12 @@ func (l *Loader) AssignTextSymbolOrder(libs []*sym.Library, intlibs []bool, exts
} }
} }
} }
lib.Textp2 = nil lib.Textp = nil
lib.DupTextSyms2 = nil lib.DupTextSyms = nil
} }
} }
return textp2 return textp
} }
// ErrorReporter is a helper class for reporting errors. // ErrorReporter is a helper class for reporting errors.

View File

@ -41,14 +41,14 @@ import (
"sync" "sync"
) )
func gentext2(ctxt *ld.Link, ldr *loader.Loader) { func gentext(ctxt *ld.Link, ldr *loader.Loader) {
return return
} }
func elfreloc2(ctxt *ld.Link, ldr *loader.Loader, s loader.Sym, r loader.ExtRelocView, sectoff int64) bool { func elfreloc1(ctxt *ld.Link, ldr *loader.Loader, s loader.Sym, r loader.ExtRelocView, sectoff int64) bool {
ctxt.Out.Write32(uint32(sectoff)) ctxt.Out.Write32(uint32(sectoff))
elfsym := ld.ElfSymForReloc2(ctxt, r.Xsym) elfsym := ld.ElfSymForReloc(ctxt, r.Xsym)
switch r.Type() { switch r.Type() {
default: default:
return false return false

View File

@ -54,9 +54,9 @@ func Init() (*sys.Arch, ld.Arch) {
Archrelocvariant: archrelocvariant, Archrelocvariant: archrelocvariant,
Asmb: asmb, Asmb: asmb,
Asmb2: asmb2, Asmb2: asmb2,
Elfreloc2: elfreloc2, Elfreloc1: elfreloc1,
Elfsetupplt: elfsetupplt, Elfsetupplt: elfsetupplt,
Gentext2: gentext2, Gentext: gentext,
Machoreloc1: machoreloc1, Machoreloc1: machoreloc1,
Linuxdynld: "/lib/ld.so.1", Linuxdynld: "/lib/ld.so.1",

View File

@ -41,9 +41,9 @@ import (
"sync" "sync"
) )
func gentext2(ctxt *ld.Link, ldr *loader.Loader) {} func gentext(ctxt *ld.Link, ldr *loader.Loader) {}
func elfreloc2(ctxt *ld.Link, ldr *loader.Loader, s loader.Sym, r loader.ExtRelocView, sectoff int64) bool { func elfreloc1(ctxt *ld.Link, ldr *loader.Loader, s loader.Sym, r loader.ExtRelocView, sectoff int64) bool {
// mips64 ELF relocation (endian neutral) // mips64 ELF relocation (endian neutral)
// offset uint64 // offset uint64
@ -56,7 +56,7 @@ func elfreloc2(ctxt *ld.Link, ldr *loader.Loader, s loader.Sym, r loader.ExtRelo
ctxt.Out.Write64(uint64(sectoff)) ctxt.Out.Write64(uint64(sectoff))
elfsym := ld.ElfSymForReloc2(ctxt, r.Xsym) elfsym := ld.ElfSymForReloc(ctxt, r.Xsym)
ctxt.Out.Write32(uint32(elfsym)) ctxt.Out.Write32(uint32(elfsym))
ctxt.Out.Write8(0) ctxt.Out.Write8(0)
ctxt.Out.Write8(0) ctxt.Out.Write8(0)
@ -236,8 +236,8 @@ func asmb2(ctxt *ld.Link, _ *loader.Loader) {
ctxt.Out.Write32(uint32(ld.Segtext.Filelen)) /* sizes */ ctxt.Out.Write32(uint32(ld.Segtext.Filelen)) /* sizes */
ctxt.Out.Write32(uint32(ld.Segdata.Filelen)) ctxt.Out.Write32(uint32(ld.Segdata.Filelen))
ctxt.Out.Write32(uint32(ld.Segdata.Length - ld.Segdata.Filelen)) ctxt.Out.Write32(uint32(ld.Segdata.Length - ld.Segdata.Filelen))
ctxt.Out.Write32(uint32(ld.Symsize)) /* nsyms */ ctxt.Out.Write32(uint32(ld.Symsize)) /* nsyms */
ctxt.Out.Write32(uint32(ld.Entryvalue2(ctxt))) /* va of entry */ ctxt.Out.Write32(uint32(ld.Entryvalue(ctxt))) /* va of entry */
ctxt.Out.Write32(0) ctxt.Out.Write32(0)
ctxt.Out.Write32(uint32(ld.Lcsize)) ctxt.Out.Write32(uint32(ld.Lcsize))

View File

@ -53,9 +53,9 @@ func Init() (*sys.Arch, ld.Arch) {
Archrelocvariant: archrelocvariant, Archrelocvariant: archrelocvariant,
Asmb: asmb, Asmb: asmb,
Asmb2: asmb2, Asmb2: asmb2,
Elfreloc2: elfreloc2, Elfreloc1: elfreloc1,
Elfsetupplt: elfsetupplt, Elfsetupplt: elfsetupplt,
Gentext2: gentext2, Gentext: gentext,
Machoreloc1: machoreloc1, Machoreloc1: machoreloc1,
Linuxdynld: "/lib64/ld64.so.1", Linuxdynld: "/lib64/ld64.so.1",

View File

@ -44,7 +44,7 @@ import (
"sync" "sync"
) )
func genplt2(ctxt *ld.Link, ldr *loader.Loader) { func genplt(ctxt *ld.Link, ldr *loader.Loader) {
// The ppc64 ABI PLT has similar concepts to other // The ppc64 ABI PLT has similar concepts to other
// architectures, but is laid out quite differently. When we // architectures, but is laid out quite differently. When we
// see an R_PPC64_REL24 relocation to a dynamic symbol // see an R_PPC64_REL24 relocation to a dynamic symbol
@ -94,7 +94,7 @@ func genplt2(ctxt *ld.Link, ldr *loader.Loader) {
// This assumes "case 1" from the ABI, where the caller needs // This assumes "case 1" from the ABI, where the caller needs
// us to save and restore the TOC pointer. // us to save and restore the TOC pointer.
var stubs []loader.Sym var stubs []loader.Sym
for _, s := range ctxt.Textp2 { for _, s := range ctxt.Textp {
relocs := ldr.Relocs(s) relocs := ldr.Relocs(s)
for i := 0; i < relocs.Count(); i++ { for i := 0; i < relocs.Count(); i++ {
r := relocs.At2(i) r := relocs.At2(i)
@ -104,7 +104,7 @@ func genplt2(ctxt *ld.Link, ldr *loader.Loader) {
// Reserve PLT entry and generate symbol // Reserve PLT entry and generate symbol
// resolver // resolver
addpltsym2(ctxt, ldr, r.Sym()) addpltsym(ctxt, ldr, r.Sym())
// Generate call stub. Important to note that we're looking // Generate call stub. Important to note that we're looking
// up the stub using the same version as the parent symbol (s), // up the stub using the same version as the parent symbol (s),
@ -116,7 +116,7 @@ func genplt2(ctxt *ld.Link, ldr *loader.Loader) {
stub := ldr.CreateSymForUpdate(n, ldr.SymVersion(s)) stub := ldr.CreateSymForUpdate(n, ldr.SymVersion(s))
if stub.Size() == 0 { if stub.Size() == 0 {
stubs = append(stubs, stub.Sym()) stubs = append(stubs, stub.Sym())
gencallstub2(ctxt, ldr, 1, stub, r.Sym()) gencallstub(ctxt, ldr, 1, stub, r.Sym())
} }
// Update the relocation to use the call stub // Update the relocation to use the call stub
@ -138,10 +138,10 @@ func genplt2(ctxt *ld.Link, ldr *loader.Loader) {
// So when resolving the relocations to calls to the stubs, // So when resolving the relocations to calls to the stubs,
// the addresses are known and trampolines can be inserted // the addresses are known and trampolines can be inserted
// when necessary. // when necessary.
ctxt.Textp2 = append(stubs, ctxt.Textp2...) ctxt.Textp = append(stubs, ctxt.Textp...)
} }
func genaddmoduledata2(ctxt *ld.Link, ldr *loader.Loader) { func genaddmoduledata(ctxt *ld.Link, ldr *loader.Loader) {
initfunc, addmoduledata := ld.PrepareAddmoduledata(ctxt) initfunc, addmoduledata := ld.PrepareAddmoduledata(ctxt)
if initfunc == nil { if initfunc == nil {
return return
@ -152,7 +152,7 @@ func genaddmoduledata2(ctxt *ld.Link, ldr *loader.Loader) {
} }
// addis r2, r12, .TOC.-func@ha // addis r2, r12, .TOC.-func@ha
toc := ctxt.DotTOC2[0] toc := ctxt.DotTOC[0]
rel1 := loader.Reloc{ rel1 := loader.Reloc{
Off: 0, Off: 0,
Size: 8, Size: 8,
@ -207,26 +207,26 @@ func genaddmoduledata2(ctxt *ld.Link, ldr *loader.Loader) {
o(0x4e800020) o(0x4e800020)
} }
func gentext2(ctxt *ld.Link, ldr *loader.Loader) { func gentext(ctxt *ld.Link, ldr *loader.Loader) {
if ctxt.DynlinkingGo() { if ctxt.DynlinkingGo() {
genaddmoduledata2(ctxt, ldr) genaddmoduledata(ctxt, ldr)
} }
if ctxt.LinkMode == ld.LinkInternal { if ctxt.LinkMode == ld.LinkInternal {
genplt2(ctxt, ldr) genplt(ctxt, ldr)
} }
} }
// Construct a call stub in stub that calls symbol targ via its PLT // Construct a call stub in stub that calls symbol targ via its PLT
// entry. // entry.
func gencallstub2(ctxt *ld.Link, ldr *loader.Loader, abicase int, stub *loader.SymbolBuilder, targ loader.Sym) { func gencallstub(ctxt *ld.Link, ldr *loader.Loader, abicase int, stub *loader.SymbolBuilder, targ loader.Sym) {
if abicase != 1 { if abicase != 1 {
// If we see R_PPC64_TOCSAVE or R_PPC64_REL24_NOTOC // If we see R_PPC64_TOCSAVE or R_PPC64_REL24_NOTOC
// relocations, we'll need to implement cases 2 and 3. // relocations, we'll need to implement cases 2 and 3.
log.Fatalf("gencallstub only implements case 1 calls") log.Fatalf("gencallstub only implements case 1 calls")
} }
plt := ctxt.PLT2 plt := ctxt.PLT
stub.SetType(sym.STEXT) stub.SetType(sym.STEXT)
@ -325,9 +325,9 @@ func addelfdynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s lo
su.SetRelocType(rIdx, objabi.R_ADDR) su.SetRelocType(rIdx, objabi.R_ADDR)
if targType == sym.SDYNIMPORT { if targType == sym.SDYNIMPORT {
// These happen in .toc sections // These happen in .toc sections
ld.Adddynsym2(ldr, target, syms, targ) ld.Adddynsym(ldr, target, syms, targ)
rela := ldr.MakeSymbolUpdater(syms.Rela2) rela := ldr.MakeSymbolUpdater(syms.Rela)
rela.AddAddrPlus(target.Arch, s, int64(r.Off())) rela.AddAddrPlus(target.Arch, s, int64(r.Off()))
rela.AddUint64(target.Arch, ld.ELF64_R_INFO(uint32(ldr.SymDynid(targ)), uint32(elf.R_PPC64_ADDR64))) rela.AddUint64(target.Arch, ld.ELF64_R_INFO(uint32(ldr.SymDynid(targ)), uint32(elf.R_PPC64_ADDR64)))
rela.AddUint64(target.Arch, uint64(r.Add())) rela.AddUint64(target.Arch, uint64(r.Add()))
@ -442,7 +442,7 @@ func xcoffreloc1(arch *sys.Arch, out *ld.OutBuf, ldr *loader.Loader, s loader.Sy
} }
func elfreloc2(ctxt *ld.Link, ldr *loader.Loader, s loader.Sym, r loader.ExtRelocView, sectoff int64) bool { func elfreloc1(ctxt *ld.Link, ldr *loader.Loader, s loader.Sym, r loader.ExtRelocView, sectoff int64) bool {
// Beware that bit0~bit15 start from the third byte of a instruction in Big-Endian machines. // Beware that bit0~bit15 start from the third byte of a instruction in Big-Endian machines.
rt := r.Type() rt := r.Type()
if rt == objabi.R_ADDR || rt == objabi.R_POWER_TLS || rt == objabi.R_CALLPOWER { if rt == objabi.R_ADDR || rt == objabi.R_POWER_TLS || rt == objabi.R_CALLPOWER {
@ -453,7 +453,7 @@ func elfreloc2(ctxt *ld.Link, ldr *loader.Loader, s loader.Sym, r loader.ExtRelo
} }
ctxt.Out.Write64(uint64(sectoff)) ctxt.Out.Write64(uint64(sectoff))
elfsym := ld.ElfSymForReloc2(ctxt, r.Xsym) elfsym := ld.ElfSymForReloc(ctxt, r.Xsym)
switch rt { switch rt {
default: default:
return false return false
@ -539,7 +539,7 @@ func symtoc(ldr *loader.Loader, syms *ld.ArchSyms, s loader.Sym) int64 {
v = ldr.SymVersion(out) v = ldr.SymVersion(out)
} }
toc := syms.DotTOC2[v] toc := syms.DotTOC[v]
if toc == 0 { if toc == 0 {
ldr.Errorf(s, "TOC-relative relocation in object without .TOC.") ldr.Errorf(s, "TOC-relative relocation in object without .TOC.")
return 0 return 0
@ -572,12 +572,12 @@ func archreloctoc(ldr *loader.Loader, target *ld.Target, syms *ld.ArchSyms, r lo
tarSym := ldr.ResolveABIAlias(relocs.At2(0).Sym()) tarSym := ldr.ResolveABIAlias(relocs.At2(0).Sym())
if target.IsInternal() && tarSym != 0 && ldr.AttrReachable(tarSym) && ldr.SymSect(tarSym).Seg == &ld.Segdata { if target.IsInternal() && tarSym != 0 && ldr.AttrReachable(tarSym) && ldr.SymSect(tarSym).Seg == &ld.Segdata {
t = ldr.SymValue(tarSym) + r.Add() - ldr.SymValue(syms.TOC2) t = ldr.SymValue(tarSym) + r.Add() - ldr.SymValue(syms.TOC)
// change ld to addi in the second instruction // change ld to addi in the second instruction
o2 = (o2 & 0x03FF0000) | 0xE<<26 o2 = (o2 & 0x03FF0000) | 0xE<<26
useAddi = true useAddi = true
} else { } else {
t = ldr.SymValue(rs) + r.Add() - ldr.SymValue(syms.TOC2) t = ldr.SymValue(rs) + r.Add() - ldr.SymValue(syms.TOC)
} }
if t != int64(int32(t)) { if t != int64(int32(t)) {
@ -976,22 +976,22 @@ overflow:
return t return t
} }
func addpltsym2(ctxt *ld.Link, ldr *loader.Loader, s loader.Sym) { func addpltsym(ctxt *ld.Link, ldr *loader.Loader, s loader.Sym) {
if ldr.SymPlt(s) >= 0 { if ldr.SymPlt(s) >= 0 {
return return
} }
ld.Adddynsym2(ldr, &ctxt.Target, &ctxt.ArchSyms, s) ld.Adddynsym(ldr, &ctxt.Target, &ctxt.ArchSyms, s)
if ctxt.IsELF { if ctxt.IsELF {
plt := ldr.MakeSymbolUpdater(ctxt.PLT2) plt := ldr.MakeSymbolUpdater(ctxt.PLT)
rela := ldr.MakeSymbolUpdater(ctxt.RelaPLT2) rela := ldr.MakeSymbolUpdater(ctxt.RelaPLT)
if plt.Size() == 0 { if plt.Size() == 0 {
panic("plt is not set up") panic("plt is not set up")
} }
// Create the glink resolver if necessary // Create the glink resolver if necessary
glink := ensureglinkresolver2(ctxt, ldr) glink := ensureglinkresolver(ctxt, ldr)
// Write symbol resolver stub (just a branch to the // Write symbol resolver stub (just a branch to the
// glink resolver stub) // glink resolver stub)
@ -1023,7 +1023,7 @@ func addpltsym2(ctxt *ld.Link, ldr *loader.Loader, s loader.Sym) {
} }
// Generate the glink resolver stub if necessary and return the .glink section // Generate the glink resolver stub if necessary and return the .glink section
func ensureglinkresolver2(ctxt *ld.Link, ldr *loader.Loader) *loader.SymbolBuilder { func ensureglinkresolver(ctxt *ld.Link, ldr *loader.Loader) *loader.SymbolBuilder {
gs := ldr.LookupOrCreateSym(".glink", 0) gs := ldr.LookupOrCreateSym(".glink", 0)
glink := ldr.MakeSymbolUpdater(gs) glink := ldr.MakeSymbolUpdater(gs)
if glink.Size() != 0 { if glink.Size() != 0 {
@ -1052,7 +1052,7 @@ func ensureglinkresolver2(ctxt *ld.Link, ldr *loader.Loader) *loader.SymbolBuild
glink.AddUint32(ctxt.Arch, 0x7800f082) // srdi r0,r0,2 glink.AddUint32(ctxt.Arch, 0x7800f082) // srdi r0,r0,2
// r11 = address of the first byte of the PLT // r11 = address of the first byte of the PLT
glink.AddSymRef(ctxt.Arch, ctxt.PLT2, 0, objabi.R_ADDRPOWER, 8) glink.AddSymRef(ctxt.Arch, ctxt.PLT, 0, objabi.R_ADDRPOWER, 8)
glink.AddUint32(ctxt.Arch, 0x3d600000) // addis r11,0,.plt@ha glink.AddUint32(ctxt.Arch, 0x3d600000) // addis r11,0,.plt@ha
glink.AddUint32(ctxt.Arch, 0x396b0000) // addi r11,r11,.plt@l glink.AddUint32(ctxt.Arch, 0x396b0000) // addi r11,r11,.plt@l
@ -1071,8 +1071,8 @@ func ensureglinkresolver2(ctxt *ld.Link, ldr *loader.Loader) *loader.SymbolBuild
// Add DT_PPC64_GLINK .dynamic entry, which points to 32 bytes // Add DT_PPC64_GLINK .dynamic entry, which points to 32 bytes
// before the first symbol resolver stub. // before the first symbol resolver stub.
du := ldr.MakeSymbolUpdater(ctxt.Dynamic2) du := ldr.MakeSymbolUpdater(ctxt.Dynamic)
ld.Elfwritedynentsymplus2(ctxt, du, ld.DT_PPC64_GLINK, glink.Sym(), glink.Size()-32) ld.Elfwritedynentsymplus(ctxt, du, ld.DT_PPC64_GLINK, glink.Sym(), glink.Size()-32)
return glink return glink
} }
@ -1157,8 +1157,8 @@ func asmb2(ctxt *ld.Link, _ *loader.Loader) {
ctxt.Out.Write32(uint32(ld.Segtext.Filelen)) /* sizes */ ctxt.Out.Write32(uint32(ld.Segtext.Filelen)) /* sizes */
ctxt.Out.Write32(uint32(ld.Segdata.Filelen)) ctxt.Out.Write32(uint32(ld.Segdata.Filelen))
ctxt.Out.Write32(uint32(ld.Segdata.Length - ld.Segdata.Filelen)) ctxt.Out.Write32(uint32(ld.Segdata.Length - ld.Segdata.Filelen))
ctxt.Out.Write32(uint32(ld.Symsize)) /* nsyms */ ctxt.Out.Write32(uint32(ld.Symsize)) /* nsyms */
ctxt.Out.Write32(uint32(ld.Entryvalue2(ctxt))) /* va of entry */ ctxt.Out.Write32(uint32(ld.Entryvalue(ctxt))) /* va of entry */
ctxt.Out.Write32(0) ctxt.Out.Write32(0)
ctxt.Out.Write32(uint32(ld.Lcsize)) ctxt.Out.Write32(uint32(ld.Lcsize))

View File

@ -55,9 +55,9 @@ func Init() (*sys.Arch, ld.Arch) {
Archrelocvariant: archrelocvariant, Archrelocvariant: archrelocvariant,
Asmb: asmb, Asmb: asmb,
Asmb2: asmb2, Asmb2: asmb2,
Elfreloc2: elfreloc2, Elfreloc1: elfreloc1,
Elfsetupplt: elfsetupplt, Elfsetupplt: elfsetupplt,
Gentext2: gentext2, Gentext: gentext,
Trampoline: trampoline, Trampoline: trampoline,
Machoreloc1: machoreloc1, Machoreloc1: machoreloc1,
Xcoffreloc1: xcoffreloc1, Xcoffreloc1: xcoffreloc1,

View File

@ -16,10 +16,10 @@ import (
"sync" "sync"
) )
func gentext2(ctxt *ld.Link, ldr *loader.Loader) { func gentext(ctxt *ld.Link, ldr *loader.Loader) {
} }
func elfreloc2(ctxt *ld.Link, ldr *loader.Loader, s loader.Sym, r loader.ExtRelocView, sectoff int64) bool { func elfreloc1(ctxt *ld.Link, ldr *loader.Loader, s loader.Sym, r loader.ExtRelocView, sectoff int64) bool {
log.Fatalf("elfreloc2") log.Fatalf("elfreloc2")
return false return false
} }

View File

@ -25,9 +25,9 @@ func Init() (*sys.Arch, ld.Arch) {
Archrelocvariant: archrelocvariant, Archrelocvariant: archrelocvariant,
Asmb: asmb, Asmb: asmb,
Asmb2: asmb2, Asmb2: asmb2,
Elfreloc2: elfreloc2, Elfreloc1: elfreloc1,
Elfsetupplt: elfsetupplt, Elfsetupplt: elfsetupplt,
Gentext2: gentext2, Gentext: gentext,
Machoreloc1: machoreloc1, Machoreloc1: machoreloc1,
Linuxdynld: "/lib/ld.so.1", Linuxdynld: "/lib/ld.so.1",

View File

@ -51,7 +51,7 @@ import (
// undef // undef
// //
// The job of appending the moduledata is delegated to runtime.addmoduledata. // The job of appending the moduledata is delegated to runtime.addmoduledata.
func gentext2(ctxt *ld.Link, ldr *loader.Loader) { func gentext(ctxt *ld.Link, ldr *loader.Loader) {
initfunc, addmoduledata := ld.PrepareAddmoduledata(ctxt) initfunc, addmoduledata := ld.PrepareAddmoduledata(ctxt)
if initfunc == nil { if initfunc == nil {
return return
@ -60,7 +60,7 @@ func gentext2(ctxt *ld.Link, ldr *loader.Loader) {
// larl %r2, <local.moduledata> // larl %r2, <local.moduledata>
initfunc.AddUint8(0xc0) initfunc.AddUint8(0xc0)
initfunc.AddUint8(0x20) initfunc.AddUint8(0x20)
initfunc.AddSymRef(ctxt.Arch, ctxt.Moduledata2, 6, objabi.R_PCREL, 4) initfunc.AddSymRef(ctxt.Arch, ctxt.Moduledata, 6, objabi.R_PCREL, 4)
r1 := initfunc.Relocs() r1 := initfunc.Relocs()
ldr.SetRelocVariant(initfunc.Sym(), r1.Count()-1, sym.RV_390_DBL) ldr.SetRelocVariant(initfunc.Sym(), r1.Count()-1, sym.RV_390_DBL)
@ -136,8 +136,8 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade
ldr.SetRelocVariant(s, rIdx, sym.RV_390_DBL) ldr.SetRelocVariant(s, rIdx, sym.RV_390_DBL)
su.SetRelocAdd(rIdx, r.Add()+int64(r.Siz())) su.SetRelocAdd(rIdx, r.Add()+int64(r.Siz()))
if targType == sym.SDYNIMPORT { if targType == sym.SDYNIMPORT {
addpltsym2(target, ldr, syms, targ) addpltsym(target, ldr, syms, targ)
r.SetSym(syms.PLT2) r.SetSym(syms.PLT)
su.SetRelocAdd(rIdx, r.Add()+int64(ldr.SymPlt(targ))) su.SetRelocAdd(rIdx, r.Add()+int64(ldr.SymPlt(targ)))
} }
return true return true
@ -148,8 +148,8 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade
su.SetRelocType(rIdx, objabi.R_PCREL) su.SetRelocType(rIdx, objabi.R_PCREL)
su.SetRelocAdd(rIdx, r.Add()+int64(r.Siz())) su.SetRelocAdd(rIdx, r.Add()+int64(r.Siz()))
if targType == sym.SDYNIMPORT { if targType == sym.SDYNIMPORT {
addpltsym2(target, ldr, syms, targ) addpltsym(target, ldr, syms, targ)
r.SetSym(syms.PLT2) r.SetSym(syms.PLT)
su.SetRelocAdd(rIdx, r.Add()+int64(ldr.SymPlt(targ))) su.SetRelocAdd(rIdx, r.Add()+int64(ldr.SymPlt(targ)))
} }
return true return true
@ -181,7 +181,7 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade
case objabi.ElfRelocOffset + objabi.RelocType(elf.R_390_GOTPC): case objabi.ElfRelocOffset + objabi.RelocType(elf.R_390_GOTPC):
su := ldr.MakeSymbolUpdater(s) su := ldr.MakeSymbolUpdater(s)
su.SetRelocType(rIdx, objabi.R_PCREL) su.SetRelocType(rIdx, objabi.R_PCREL)
r.SetSym(syms.GOT2) r.SetSym(syms.GOT)
su.SetRelocAdd(rIdx, r.Add()+int64(r.Siz())) su.SetRelocAdd(rIdx, r.Add()+int64(r.Siz()))
return true return true
@ -200,16 +200,16 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade
su := ldr.MakeSymbolUpdater(s) su := ldr.MakeSymbolUpdater(s)
su.SetRelocType(rIdx, objabi.R_PCREL) su.SetRelocType(rIdx, objabi.R_PCREL)
ldr.SetRelocVariant(s, rIdx, sym.RV_390_DBL) ldr.SetRelocVariant(s, rIdx, sym.RV_390_DBL)
r.SetSym(syms.GOT2) r.SetSym(syms.GOT)
su.SetRelocAdd(rIdx, r.Add()+int64(r.Siz())) su.SetRelocAdd(rIdx, r.Add()+int64(r.Siz()))
return true return true
case objabi.ElfRelocOffset + objabi.RelocType(elf.R_390_GOTENT): case objabi.ElfRelocOffset + objabi.RelocType(elf.R_390_GOTENT):
addgotsym2(target, ldr, syms, targ) addgotsym(target, ldr, syms, targ)
su := ldr.MakeSymbolUpdater(s) su := ldr.MakeSymbolUpdater(s)
su.SetRelocType(rIdx, objabi.R_PCREL) su.SetRelocType(rIdx, objabi.R_PCREL)
ldr.SetRelocVariant(s, rIdx, sym.RV_390_DBL) ldr.SetRelocVariant(s, rIdx, sym.RV_390_DBL)
r.SetSym(syms.GOT2) r.SetSym(syms.GOT)
su.SetRelocAdd(rIdx, r.Add()+int64(ldr.SymGot(targ))+int64(r.Siz())) su.SetRelocAdd(rIdx, r.Add()+int64(ldr.SymGot(targ))+int64(r.Siz()))
return true return true
} }
@ -221,10 +221,10 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade
return false return false
} }
func elfreloc2(ctxt *ld.Link, ldr *loader.Loader, s loader.Sym, r loader.ExtRelocView, sectoff int64) bool { func elfreloc1(ctxt *ld.Link, ldr *loader.Loader, s loader.Sym, r loader.ExtRelocView, sectoff int64) bool {
ctxt.Out.Write64(uint64(sectoff)) ctxt.Out.Write64(uint64(sectoff))
elfsym := ld.ElfSymForReloc2(ctxt, r.Xsym) elfsym := ld.ElfSymForReloc(ctxt, r.Xsym)
siz := r.Siz() siz := r.Siz()
xst := ldr.SymType(r.Xsym) xst := ldr.SymType(r.Xsym)
switch r.Type() { switch r.Type() {
@ -391,17 +391,17 @@ func archrelocvariant(target *ld.Target, ldr *loader.Loader, r loader.Reloc2, rv
} }
} }
func addpltsym2(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loader.Sym) { func addpltsym(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loader.Sym) {
if ldr.SymPlt(s) >= 0 { if ldr.SymPlt(s) >= 0 {
return return
} }
ld.Adddynsym2(ldr, target, syms, s) ld.Adddynsym(ldr, target, syms, s)
if target.IsElf() { if target.IsElf() {
plt := ldr.MakeSymbolUpdater(syms.PLT2) plt := ldr.MakeSymbolUpdater(syms.PLT)
got := ldr.MakeSymbolUpdater(syms.GOT2) got := ldr.MakeSymbolUpdater(syms.GOT)
rela := ldr.MakeSymbolUpdater(syms.RelaPLT2) rela := ldr.MakeSymbolUpdater(syms.RelaPLT)
if plt.Size() == 0 { if plt.Size() == 0 {
panic("plt is not set up") panic("plt is not set up")
} }
@ -457,18 +457,18 @@ func addpltsym2(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s load
} }
} }
func addgotsym2(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loader.Sym) { func addgotsym(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loader.Sym) {
if ldr.SymGot(s) >= 0 { if ldr.SymGot(s) >= 0 {
return return
} }
ld.Adddynsym2(ldr, target, syms, s) ld.Adddynsym(ldr, target, syms, s)
got := ldr.MakeSymbolUpdater(syms.GOT2) got := ldr.MakeSymbolUpdater(syms.GOT)
ldr.SetGot(s, int32(got.Size())) ldr.SetGot(s, int32(got.Size()))
got.AddUint64(target.Arch, 0) got.AddUint64(target.Arch, 0)
if target.IsElf() { if target.IsElf() {
rela := ldr.MakeSymbolUpdater(syms.Rela2) rela := ldr.MakeSymbolUpdater(syms.Rela)
rela.AddAddrPlus(target.Arch, got.Sym(), int64(ldr.SymGot(s))) rela.AddAddrPlus(target.Arch, got.Sym(), int64(ldr.SymGot(s)))
rela.AddUint64(target.Arch, ld.ELF64_R_INFO(uint32(ldr.SymDynid(s)), uint32(elf.R_390_GLOB_DAT))) rela.AddUint64(target.Arch, ld.ELF64_R_INFO(uint32(ldr.SymDynid(s)), uint32(elf.R_390_GLOB_DAT)))
rela.AddUint64(target.Arch, 0) rela.AddUint64(target.Arch, 0)

View File

@ -52,9 +52,9 @@ func Init() (*sys.Arch, ld.Arch) {
Archrelocvariant: archrelocvariant, Archrelocvariant: archrelocvariant,
Asmb: asmb, Asmb: asmb,
Asmb2: asmb2, Asmb2: asmb2,
Elfreloc2: elfreloc2, Elfreloc1: elfreloc1,
Elfsetupplt: elfsetupplt, Elfsetupplt: elfsetupplt,
Gentext2: gentext2, Gentext: gentext,
Machoreloc1: machoreloc1, Machoreloc1: machoreloc1,
Linuxdynld: "/lib64/ld64.so.1", Linuxdynld: "/lib64/ld64.so.1",

View File

@ -20,9 +20,9 @@ type CompilationUnit struct {
DWInfo *dwarf.DWDie // CU root DIE DWInfo *dwarf.DWDie // CU root DIE
DWARFFileTable []string // The file table used to generate the .debug_lines DWARFFileTable []string // The file table used to generate the .debug_lines
Consts2 LoaderSym // Package constants DIEs (loader) Consts LoaderSym // Package constants DIEs
FuncDIEs2 []LoaderSym // Function DIE subtrees (loader) FuncDIEs []LoaderSym // Function DIE subtrees
AbsFnDIEs2 []LoaderSym // Abstract function DIE subtrees (loader) AbsFnDIEs []LoaderSym // Abstract function DIE subtrees
RangeSyms2 []LoaderSym // Symbols for debug_range (loader) RangeSyms []LoaderSym // Symbols for debug_range
Textp2 []LoaderSym // Text symbols in this CU (loader) Textp []LoaderSym // Text symbols in this CU
} }

View File

@ -20,8 +20,8 @@ type Library struct {
Safe bool Safe bool
Units []*CompilationUnit Units []*CompilationUnit
Textp2 []LoaderSym // text syms defined in this library Textp []LoaderSym // text syms defined in this library
DupTextSyms2 []LoaderSym // dupok text syms defined in this library DupTextSyms []LoaderSym // dupok text syms defined in this library
} }
func (l Library) String() string { func (l Library) String() string {

View File

@ -55,6 +55,6 @@ type Section struct {
Elfsect interface{} // an *ld.ElfShdr Elfsect interface{} // an *ld.ElfShdr
Reloff uint64 Reloff uint64
Rellen uint64 Rellen uint64
Sym2 LoaderSym // symbol for the section, if any Sym LoaderSym // symbol for the section, if any
Index uint16 // each section has a unique index, used internally Index uint16 // each section has a unique index, used internally
} }

View File

@ -39,7 +39,7 @@ const (
// funcValueOffset is the offset between the PC_F value of a function and the index of the function in WebAssembly // funcValueOffset is the offset between the PC_F value of a function and the index of the function in WebAssembly
const funcValueOffset = 0x1000 // TODO(neelance): make function addresses play nice with heap addresses const funcValueOffset = 0x1000 // TODO(neelance): make function addresses play nice with heap addresses
func gentext2(ctxt *ld.Link, ldr *loader.Loader) { func gentext(ctxt *ld.Link, ldr *loader.Loader) {
} }
type wasmFunc struct { type wasmFunc struct {
@ -136,7 +136,7 @@ func asmb2(ctxt *ld.Link, ldr *loader.Loader) {
}, },
} }
hostImportMap := make(map[loader.Sym]int64) hostImportMap := make(map[loader.Sym]int64)
for _, fn := range ctxt.Textp2 { for _, fn := range ctxt.Textp {
relocs := ldr.Relocs(fn) relocs := ldr.Relocs(fn)
for ri := 0; ri < relocs.Count(); ri++ { for ri := 0; ri < relocs.Count(); ri++ {
r := relocs.At2(ri) r := relocs.At2(ri)
@ -152,8 +152,8 @@ func asmb2(ctxt *ld.Link, ldr *loader.Loader) {
// collect functions with WebAssembly body // collect functions with WebAssembly body
var buildid []byte var buildid []byte
fns := make([]*wasmFunc, len(ctxt.Textp2)) fns := make([]*wasmFunc, len(ctxt.Textp))
for i, fn := range ctxt.Textp2 { for i, fn := range ctxt.Textp {
wfn := new(bytes.Buffer) wfn := new(bytes.Buffer)
if ldr.SymName(fn) == "go.buildid" { if ldr.SymName(fn) == "go.buildid" {
writeUleb128(wfn, 0) // number of sets of locals writeUleb128(wfn, 0) // number of sets of locals

View File

@ -19,7 +19,7 @@ func Init() (*sys.Arch, ld.Arch) {
AssignAddress: assignAddress, AssignAddress: assignAddress,
Asmb: asmb, Asmb: asmb,
Asmb2: asmb2, Asmb2: asmb2,
Gentext2: gentext2, Gentext: gentext,
} }
return sys.ArchWasm, theArch return sys.ArchWasm, theArch

View File

@ -41,7 +41,7 @@ import (
"sync" "sync"
) )
func gentext2(ctxt *ld.Link, ldr *loader.Loader) { func gentext(ctxt *ld.Link, ldr *loader.Loader) {
if ctxt.DynlinkingGo() { if ctxt.DynlinkingGo() {
// We need get_pc_thunk. // We need get_pc_thunk.
} else { } else {
@ -58,7 +58,7 @@ func gentext2(ctxt *ld.Link, ldr *loader.Loader) {
} }
// Generate little thunks that load the PC of the next instruction into a register. // Generate little thunks that load the PC of the next instruction into a register.
thunks := make([]loader.Sym, 0, 7+len(ctxt.Textp2)) thunks := make([]loader.Sym, 0, 7+len(ctxt.Textp))
for _, r := range [...]struct { for _, r := range [...]struct {
name string name string
num uint8 num uint8
@ -88,7 +88,7 @@ func gentext2(ctxt *ld.Link, ldr *loader.Loader) {
thunks = append(thunks, thunkfunc.Sym()) thunks = append(thunks, thunkfunc.Sym())
} }
ctxt.Textp2 = append(thunks, ctxt.Textp2...) // keep Textp2 in dependency order ctxt.Textp = append(thunks, ctxt.Textp...) // keep Textp in dependency order
initfunc, addmoduledata := ld.PrepareAddmoduledata(ctxt) initfunc, addmoduledata := ld.PrepareAddmoduledata(ctxt)
if initfunc == nil { if initfunc == nil {
@ -116,7 +116,7 @@ func gentext2(ctxt *ld.Link, ldr *loader.Loader) {
initfunc.AddSymRef(ctxt.Arch, ldr.Lookup("__x86.get_pc_thunk.cx", 0), 0, objabi.R_CALL, 4) initfunc.AddSymRef(ctxt.Arch, ldr.Lookup("__x86.get_pc_thunk.cx", 0), 0, objabi.R_CALL, 4)
o(0x8d, 0x81) o(0x8d, 0x81)
initfunc.AddPCRelPlus(ctxt.Arch, ctxt.Moduledata2, 6) initfunc.AddPCRelPlus(ctxt.Arch, ctxt.Moduledata, 6)
o(0x8d, 0x99) o(0x8d, 0x99)
gotsym := ldr.LookupOrCreateSym("_GLOBAL_OFFSET_TABLE_", 0) gotsym := ldr.LookupOrCreateSym("_GLOBAL_OFFSET_TABLE_", 0)
@ -163,8 +163,8 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade
su.SetRelocType(rIdx, objabi.R_PCREL) su.SetRelocType(rIdx, objabi.R_PCREL)
su.SetRelocAdd(rIdx, r.Add()+4) su.SetRelocAdd(rIdx, r.Add()+4)
if targType == sym.SDYNIMPORT { if targType == sym.SDYNIMPORT {
addpltsym2(target, ldr, syms, targ) addpltsym(target, ldr, syms, targ)
su.SetRelocSym(rIdx, syms.PLT2) su.SetRelocSym(rIdx, syms.PLT)
su.SetRelocAdd(rIdx, r.Add()+int64(ldr.SymPlt(targ))) su.SetRelocAdd(rIdx, r.Add()+int64(ldr.SymPlt(targ)))
} }
@ -202,7 +202,7 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade
return false return false
} }
addgotsym2(target, ldr, syms, targ) addgotsym(target, ldr, syms, targ)
su.SetRelocType(rIdx, objabi.R_CONST) // write r->add during relocsym su.SetRelocType(rIdx, objabi.R_CONST) // write r->add during relocsym
su.SetRelocSym(rIdx, 0) su.SetRelocSym(rIdx, 0)
su.SetRelocAdd(rIdx, r.Add()+int64(ldr.SymGot(targ))) su.SetRelocAdd(rIdx, r.Add()+int64(ldr.SymGot(targ)))
@ -216,7 +216,7 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade
case objabi.ElfRelocOffset + objabi.RelocType(elf.R_386_GOTPC): case objabi.ElfRelocOffset + objabi.RelocType(elf.R_386_GOTPC):
su := ldr.MakeSymbolUpdater(s) su := ldr.MakeSymbolUpdater(s)
su.SetRelocType(rIdx, objabi.R_PCREL) su.SetRelocType(rIdx, objabi.R_PCREL)
su.SetRelocSym(rIdx, syms.GOT2) su.SetRelocSym(rIdx, syms.GOT)
su.SetRelocAdd(rIdx, r.Add()+4) su.SetRelocAdd(rIdx, r.Add()+4)
return true return true
@ -239,8 +239,8 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade
case objabi.MachoRelocOffset + ld.MACHO_GENERIC_RELOC_VANILLA*2 + 1: case objabi.MachoRelocOffset + ld.MACHO_GENERIC_RELOC_VANILLA*2 + 1:
su := ldr.MakeSymbolUpdater(s) su := ldr.MakeSymbolUpdater(s)
if targType == sym.SDYNIMPORT { if targType == sym.SDYNIMPORT {
addpltsym2(target, ldr, syms, targ) addpltsym(target, ldr, syms, targ)
su.SetRelocSym(rIdx, syms.PLT2) su.SetRelocSym(rIdx, syms.PLT)
su.SetRelocAdd(rIdx, int64(ldr.SymPlt(targ))) su.SetRelocAdd(rIdx, int64(ldr.SymPlt(targ)))
su.SetRelocType(rIdx, objabi.R_PCREL) su.SetRelocType(rIdx, objabi.R_PCREL)
return true return true
@ -267,8 +267,8 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade
return true return true
} }
addgotsym2(target, ldr, syms, targ) addgotsym(target, ldr, syms, targ)
su.SetRelocSym(rIdx, syms.GOT2) su.SetRelocSym(rIdx, syms.GOT)
su.SetRelocAdd(rIdx, r.Add()+int64(ldr.SymGot(targ))) su.SetRelocAdd(rIdx, r.Add()+int64(ldr.SymGot(targ)))
su.SetRelocType(rIdx, objabi.R_PCREL) su.SetRelocType(rIdx, objabi.R_PCREL)
return true return true
@ -290,9 +290,9 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade
// External linker will do this relocation. // External linker will do this relocation.
return true return true
} }
addpltsym2(target, ldr, syms, targ) addpltsym(target, ldr, syms, targ)
su := ldr.MakeSymbolUpdater(s) su := ldr.MakeSymbolUpdater(s)
su.SetRelocSym(rIdx, syms.PLT2) su.SetRelocSym(rIdx, syms.PLT)
su.SetRelocAdd(rIdx, int64(ldr.SymPlt(targ))) su.SetRelocAdd(rIdx, int64(ldr.SymPlt(targ)))
return true return true
@ -301,8 +301,8 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade
break break
} }
if target.IsElf() { if target.IsElf() {
ld.Adddynsym2(ldr, target, syms, targ) ld.Adddynsym(ldr, target, syms, targ)
rel := ldr.MakeSymbolUpdater(syms.Rel2) rel := ldr.MakeSymbolUpdater(syms.Rel)
rel.AddAddrPlus(target.Arch, s, int64(r.Off())) rel.AddAddrPlus(target.Arch, s, int64(r.Off()))
rel.AddUint32(target.Arch, ld.ELF32_R_INFO(uint32(ldr.SymDynid(targ)), uint32(elf.R_386_32))) rel.AddUint32(target.Arch, ld.ELF32_R_INFO(uint32(ldr.SymDynid(targ)), uint32(elf.R_386_32)))
su := ldr.MakeSymbolUpdater(s) su := ldr.MakeSymbolUpdater(s)
@ -322,15 +322,15 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade
// just in case the C code assigns to the variable, // just in case the C code assigns to the variable,
// and of course it only works for single pointers, // and of course it only works for single pointers,
// but we only need to support cgo and that's all it needs. // but we only need to support cgo and that's all it needs.
ld.Adddynsym2(ldr, target, syms, targ) ld.Adddynsym(ldr, target, syms, targ)
got := ldr.MakeSymbolUpdater(syms.GOT2) got := ldr.MakeSymbolUpdater(syms.GOT)
su := ldr.MakeSymbolUpdater(s) su := ldr.MakeSymbolUpdater(s)
su.SetType(got.Type()) su.SetType(got.Type())
got.PrependSub(s) got.PrependSub(s)
su.SetValue(got.Size()) su.SetValue(got.Size())
got.AddUint32(target.Arch, 0) got.AddUint32(target.Arch, 0)
leg := ldr.MakeSymbolUpdater(syms.LinkEditGOT2) leg := ldr.MakeSymbolUpdater(syms.LinkEditGOT)
leg.AddUint32(target.Arch, uint32(ldr.SymDynid(targ))) leg.AddUint32(target.Arch, uint32(ldr.SymDynid(targ)))
su.SetRelocType(rIdx, objabi.ElfRelocOffset) // ignore during relocsym su.SetRelocType(rIdx, objabi.ElfRelocOffset) // ignore during relocsym
return true return true
@ -340,10 +340,10 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade
return false return false
} }
func elfreloc2(ctxt *ld.Link, ldr *loader.Loader, s loader.Sym, r loader.ExtRelocView, sectoff int64) bool { func elfreloc1(ctxt *ld.Link, ldr *loader.Loader, s loader.Sym, r loader.ExtRelocView, sectoff int64) bool {
ctxt.Out.Write32(uint32(sectoff)) ctxt.Out.Write32(uint32(sectoff))
elfsym := ld.ElfSymForReloc2(ctxt, r.Xsym) elfsym := ld.ElfSymForReloc(ctxt, r.Xsym)
siz := r.Siz() siz := r.Siz()
switch r.Type() { switch r.Type() {
default: default:
@ -471,17 +471,17 @@ func elfsetupplt(ctxt *ld.Link, plt, got *loader.SymbolBuilder, dynamic loader.S
} }
} }
func addpltsym2(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loader.Sym) { func addpltsym(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loader.Sym) {
if ldr.SymPlt(s) >= 0 { if ldr.SymPlt(s) >= 0 {
return return
} }
ld.Adddynsym2(ldr, target, syms, s) ld.Adddynsym(ldr, target, syms, s)
if target.IsElf() { if target.IsElf() {
plt := ldr.MakeSymbolUpdater(syms.PLT2) plt := ldr.MakeSymbolUpdater(syms.PLT)
got := ldr.MakeSymbolUpdater(syms.GOTPLT2) got := ldr.MakeSymbolUpdater(syms.GOTPLT)
rel := ldr.MakeSymbolUpdater(syms.RelPLT2) rel := ldr.MakeSymbolUpdater(syms.RelPLT)
if plt.Size() == 0 { if plt.Size() == 0 {
panic("plt is not set up") panic("plt is not set up")
} }
@ -515,12 +515,12 @@ func addpltsym2(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s load
} else if target.IsDarwin() { } else if target.IsDarwin() {
// Same laziness as in 6l. // Same laziness as in 6l.
plt := ldr.MakeSymbolUpdater(syms.PLT2) plt := ldr.MakeSymbolUpdater(syms.PLT)
addgotsym2(target, ldr, syms, s) addgotsym(target, ldr, syms, s)
sDynid := ldr.SymDynid(s) sDynid := ldr.SymDynid(s)
lep := ldr.MakeSymbolUpdater(syms.LinkEditPLT2) lep := ldr.MakeSymbolUpdater(syms.LinkEditPLT)
lep.AddUint32(target.Arch, uint32(sDynid)) lep.AddUint32(target.Arch, uint32(sDynid))
// jmpq *got+size(IP) // jmpq *got+size(IP)
@ -528,28 +528,28 @@ func addpltsym2(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s load
plt.AddUint8(0xff) plt.AddUint8(0xff)
plt.AddUint8(0x25) plt.AddUint8(0x25)
plt.AddAddrPlus(target.Arch, syms.GOT2, int64(ldr.SymGot(s))) plt.AddAddrPlus(target.Arch, syms.GOT, int64(ldr.SymGot(s)))
} else { } else {
ldr.Errorf(s, "addpltsym: unsupported binary format") ldr.Errorf(s, "addpltsym: unsupported binary format")
} }
} }
func addgotsym2(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loader.Sym) { func addgotsym(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loader.Sym) {
if ldr.SymGot(s) >= 0 { if ldr.SymGot(s) >= 0 {
return return
} }
ld.Adddynsym2(ldr, target, syms, s) ld.Adddynsym(ldr, target, syms, s)
got := ldr.MakeSymbolUpdater(syms.GOT2) got := ldr.MakeSymbolUpdater(syms.GOT)
ldr.SetGot(s, int32(got.Size())) ldr.SetGot(s, int32(got.Size()))
got.AddUint32(target.Arch, 0) got.AddUint32(target.Arch, 0)
if target.IsElf() { if target.IsElf() {
rel := ldr.MakeSymbolUpdater(syms.Rel2) rel := ldr.MakeSymbolUpdater(syms.Rel)
rel.AddAddrPlus(target.Arch, got.Sym(), int64(ldr.SymGot(s))) rel.AddAddrPlus(target.Arch, got.Sym(), int64(ldr.SymGot(s)))
rel.AddUint32(target.Arch, ld.ELF32_R_INFO(uint32(ldr.SymDynid(s)), uint32(elf.R_386_GLOB_DAT))) rel.AddUint32(target.Arch, ld.ELF32_R_INFO(uint32(ldr.SymDynid(s)), uint32(elf.R_386_GLOB_DAT)))
} else if target.IsDarwin() { } else if target.IsDarwin() {
leg := ldr.MakeSymbolUpdater(syms.LinkEditGOT2) leg := ldr.MakeSymbolUpdater(syms.LinkEditGOT)
leg.AddUint32(target.Arch, uint32(ldr.SymDynid(s))) leg.AddUint32(target.Arch, uint32(ldr.SymDynid(s)))
} else { } else {
ldr.Errorf(s, "addgotsym: unsupported binary format") ldr.Errorf(s, "addgotsym: unsupported binary format")
@ -653,10 +653,10 @@ func asmb2(ctxt *ld.Link, _ *loader.Loader) {
ctxt.Out.Write32b(uint32(ld.Segtext.Filelen)) /* sizes */ ctxt.Out.Write32b(uint32(ld.Segtext.Filelen)) /* sizes */
ctxt.Out.Write32b(uint32(ld.Segdata.Filelen)) ctxt.Out.Write32b(uint32(ld.Segdata.Filelen))
ctxt.Out.Write32b(uint32(ld.Segdata.Length - ld.Segdata.Filelen)) ctxt.Out.Write32b(uint32(ld.Segdata.Length - ld.Segdata.Filelen))
ctxt.Out.Write32b(uint32(ld.Symsize)) /* nsyms */ ctxt.Out.Write32b(uint32(ld.Symsize)) /* nsyms */
ctxt.Out.Write32b(uint32(ld.Entryvalue2(ctxt))) /* va of entry */ ctxt.Out.Write32b(uint32(ld.Entryvalue(ctxt))) /* va of entry */
ctxt.Out.Write32b(uint32(ld.Spsize)) /* sp offsets */ ctxt.Out.Write32b(uint32(ld.Spsize)) /* sp offsets */
ctxt.Out.Write32b(uint32(ld.Lcsize)) /* line offsets */ ctxt.Out.Write32b(uint32(ld.Lcsize)) /* line offsets */
case objabi.Hdarwin: case objabi.Hdarwin:
ld.Asmbmacho(ctxt) ld.Asmbmacho(ctxt)

View File

@ -52,9 +52,9 @@ func Init() (*sys.Arch, ld.Arch) {
Archrelocvariant: archrelocvariant, Archrelocvariant: archrelocvariant,
Asmb: asmb, Asmb: asmb,
Asmb2: asmb2, Asmb2: asmb2,
Elfreloc2: elfreloc2, Elfreloc1: elfreloc1,
Elfsetupplt: elfsetupplt, Elfsetupplt: elfsetupplt,
Gentext2: gentext2, Gentext: gentext,
Machoreloc1: machoreloc1, Machoreloc1: machoreloc1,
PEreloc1: pereloc1, PEreloc1: pereloc1,