[dev.link] cmd/link: remove non-streaming external relocation code

Now we support streaming external relocations everywhere.

Change-Id: I8d107c8239fe979bd5410e6a7f3fe471ac3e8b35
Reviewed-on: https://go-review.googlesource.com/c/go/+/244764
Run-TryBot: Cherry Zhang <cherryyz@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Jeremy Faller <jeremy@golang.org>
This commit is contained in:
Cherry Zhang 2020-07-24 01:33:15 -04:00
parent 4c544ddaea
commit 4b3cfcee58
15 changed files with 59 additions and 236 deletions

View file

@ -550,7 +550,7 @@ func pereloc1(arch *sys.Arch, out *ld.OutBuf, ldr *loader.Loader, s loader.Sym,
return true
}
func archreloc(*ld.Target, *loader.Loader, *ld.ArchSyms, loader.Reloc2, *loader.ExtReloc, loader.Sym, int64) (int64, int, bool) {
func archreloc(*ld.Target, *loader.Loader, *ld.ArchSyms, loader.Reloc2, loader.Sym, int64) (int64, int, bool) {
return -1, 0, false
}

View file

@ -528,7 +528,7 @@ func gentrampdyn(arch *sys.Arch, tramp *loader.SymbolBuilder, target loader.Sym,
tramp.AddReloc(r)
}
func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loader.Reloc2, rr *loader.ExtReloc, s loader.Sym, val int64) (o int64, nExtReloc int, ok bool) {
func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loader.Reloc2, s loader.Sym, val int64) (o int64, nExtReloc int, ok bool) {
rs := r.Sym()
rs = ldr.ResolveABIAlias(rs)
if target.IsExternal() {

View file

@ -441,7 +441,7 @@ func machoreloc1(arch *sys.Arch, out *ld.OutBuf, ldr *loader.Loader, s loader.Sy
return true
}
func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loader.Reloc2, rr *loader.ExtReloc, s loader.Sym, val int64) (int64, int, bool) {
func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loader.Reloc2, s loader.Sym, val int64) (int64, int, bool) {
const noExtReloc = 0
const isOk = true

View file

@ -18,10 +18,6 @@ import (
// - writing out the architecture specific pieces.
// This function handles the first part.
func asmb(ctxt *Link) {
if ctxt.IsExternal() && !ctxt.StreamExtRelocs() {
ctxt.loader.InitExtRelocs()
}
// TODO(jfaller): delete me.
if thearch.Asmb != nil {
thearch.Asmb(ctxt, ctxt.loader)

View file

@ -158,17 +158,7 @@ func (st *relocSymState) relocsym(s loader.Sym, P []byte) {
}
target := st.target
syms := st.syms
var extRelocs []loader.ExtReloc
if target.IsExternal() && !target.StreamExtRelocs() {
// preallocate a slice conservatively assuming that all
// relocs will require an external reloc
extRelocs = st.preallocExtRelocSlice(relocs.Count())
}
// Extra external host relocations (e.g. ELF relocations).
// This is the difference between number of host relocations
// and number of Go relocations, as one Go relocation may turn
// into multiple host relocations.
extraExtReloc := 0
nExtReloc := 0 // number of external relocations
for ri := 0; ri < relocs.Count(); ri++ {
r := relocs.At2(ri)
off := r.Off()
@ -226,12 +216,6 @@ func (st *relocSymState) relocsym(s loader.Sym, P []byte) {
st.err.Errorf(s, "unreachable sym in relocation: %s", ldr.SymName(rs))
}
var rr loader.ExtReloc
needExtReloc := false // will set to true below in case it is needed
if target.IsExternal() {
rr.Idx = ri
}
var rv sym.RelocVariant
if target.IsPPC64() || target.IsS390X() {
rv = ldr.RelocVariant(s, ri)
@ -263,30 +247,10 @@ func (st *relocSymState) relocsym(s loader.Sym, P []byte) {
case 8:
o = int64(target.Arch.ByteOrder.Uint64(P[off:]))
}
var rp *loader.ExtReloc
if target.IsExternal() && !target.StreamExtRelocs() {
// Don't pass &rr directly to Archreloc, which will escape rr
// even if this case is not taken. Instead, as Archreloc will
// likely return true, we speculatively add rr to extRelocs
// and use that space to pass to Archreloc.
extRelocs = append(extRelocs, rr)
rp = &extRelocs[len(extRelocs)-1]
}
out, nExtReloc, ok := thearch.Archreloc(target, ldr, syms, r, rp, s, o)
out, n, ok := thearch.Archreloc(target, ldr, syms, r, s, o)
if target.IsExternal() {
if target.StreamExtRelocs() {
extraExtReloc += nExtReloc
} else {
if nExtReloc == 0 {
// No external relocation needed. Speculation failed. Undo the append.
extRelocs = extRelocs[:len(extRelocs)-1]
} else {
// Account for the difference between host relocations and Go relocations.
extraExtReloc += nExtReloc - 1
}
}
nExtReloc += n
}
needExtReloc = false // already appended
if ok {
o = out
} else {
@ -294,12 +258,7 @@ func (st *relocSymState) relocsym(s loader.Sym, P []byte) {
}
case objabi.R_TLS_LE:
if target.IsExternal() && target.IsElf() {
needExtReloc = true
rr.Xsym = rs
if rr.Xsym == 0 {
rr.Xsym = syms.Tlsg
}
rr.Xadd = r.Add()
nExtReloc++
o = 0
if !target.IsAMD64() {
o = r.Add()
@ -325,18 +284,13 @@ func (st *relocSymState) relocsym(s loader.Sym, P []byte) {
}
case objabi.R_TLS_IE:
if target.IsExternal() && target.IsElf() {
needExtReloc = true
rr.Xsym = rs
if rr.Xsym == 0 {
rr.Xsym = syms.Tlsg
}
rr.Xadd = r.Add()
nExtReloc++
o = 0
if !target.IsAMD64() {
o = r.Add()
}
if target.Is386() {
extraExtReloc++ // need two ELF relocations on 386, see ../x86/asm.go:elfreloc1
nExtReloc++ // need two ELF relocations on 386, see ../x86/asm.go:elfreloc1
}
break
}
@ -353,19 +307,18 @@ func (st *relocSymState) relocsym(s loader.Sym, P []byte) {
}
case objabi.R_ADDR:
if target.IsExternal() {
needExtReloc = true
nExtReloc++
// set up addend for eventual relocation via outer symbol.
rs := rs
rs, off := FoldSubSymbolOffset(ldr, rs)
rr.Xadd = r.Add() + off
xadd := r.Add() + off
rst := ldr.SymType(rs)
if rst != sym.SHOSTOBJ && rst != sym.SDYNIMPORT && rst != sym.SUNDEFEXT && ldr.SymSect(rs) == nil {
st.err.Errorf(s, "missing section for relocation target %s", ldr.SymName(rs))
}
rr.Xsym = rs
o = rr.Xadd
o = xadd
if target.IsElf() {
if target.IsAMD64() {
o = 0
@ -377,7 +330,7 @@ func (st *relocSymState) relocsym(s loader.Sym, P []byte) {
} else if target.IsWindows() {
// nothing to do
} else if target.IsAIX() {
o = ldr.SymValue(rs) + rr.Xadd
o = ldr.SymValue(rs) + xadd
} else {
st.err.Errorf(s, "unhandled pcrel relocation to %s on %v", ldr.SymName(rs), target.HeadType)
}
@ -417,21 +370,18 @@ func (st *relocSymState) relocsym(s loader.Sym, P []byte) {
}
if target.IsExternal() {
needExtReloc = true
// On most platforms, the external linker needs to adjust DWARF references
// as it combines DWARF sections. However, on Darwin, dsymutil does the
// DWARF linking, and it understands how to follow section offsets.
// Leaving in the relocation records confuses it (see
// https://golang.org/issue/22068) so drop them for Darwin.
if target.IsDarwin() {
needExtReloc = false
if !target.IsDarwin() {
nExtReloc++
}
rr.Xsym = loader.Sym(ldr.SymSect(rs).Sym)
rr.Xadd = r.Add() + ldr.SymValue(rs) - int64(ldr.SymSect(rs).Vaddr)
xadd := r.Add() + ldr.SymValue(rs) - int64(ldr.SymSect(rs).Vaddr)
o = rr.Xadd
o = xadd
if target.IsElf() && target.IsAMD64() {
o = 0
}
@ -460,46 +410,34 @@ func (st *relocSymState) relocsym(s loader.Sym, P []byte) {
// r.Sym() can be 0 when CALL $(constant) is transformed from absolute PC to relative PC call.
case objabi.R_GOTPCREL:
if target.IsDynlinkingGo() && target.IsDarwin() && rs != 0 {
needExtReloc = true
rr.Xadd = r.Add()
rr.Xadd -= int64(siz) // relative to address after the relocated chunk
rr.Xsym = rs
o = rr.Xadd
o += int64(siz)
nExtReloc++
o = r.Add()
break
}
if target.Is386() && target.IsExternal() && target.IsELF {
extraExtReloc++ // need two ELF relocations on 386, see ../x86/asm.go:elfreloc1
nExtReloc++ // need two ELF relocations on 386, see ../x86/asm.go:elfreloc1
}
fallthrough
case objabi.R_CALL, objabi.R_PCREL:
if target.IsExternal() && rs != 0 && rst == sym.SUNDEFEXT {
// pass through to the external linker.
needExtReloc = true
rr.Xadd = 0
if target.IsElf() {
rr.Xadd -= int64(siz)
}
rr.Xsym = rs
nExtReloc++
o = 0
break
}
if target.IsExternal() && rs != 0 && (ldr.SymSect(rs) != ldr.SymSect(s) || rt == objabi.R_GOTPCREL) {
needExtReloc = true
nExtReloc++
// set up addend for eventual relocation via outer symbol.
rs := rs
rs, off := FoldSubSymbolOffset(ldr, rs)
rr.Xadd = r.Add() + off
rr.Xadd -= int64(siz) // relative to address after the relocated chunk
xadd := r.Add() + off - int64(siz) // relative to address after the relocated chunk
rst := ldr.SymType(rs)
if rst != sym.SHOSTOBJ && rst != sym.SDYNIMPORT && ldr.SymSect(rs) == nil {
st.err.Errorf(s, "missing section for relocation target %s", ldr.SymName(rs))
}
rr.Xsym = rs
o = rr.Xadd
o = xadd
if target.IsElf() {
if target.IsAMD64() {
o = 0
@ -547,10 +485,8 @@ func (st *relocSymState) relocsym(s loader.Sym, P []byte) {
if !target.IsExternal() {
st.err.Errorf(s, "find XCOFF R_REF with internal linking")
}
needExtReloc = true
rr.Xsym = rs
rr.Xadd = r.Add()
goto addExtReloc
nExtReloc++
continue
case objabi.R_DWARFFILEREF:
// We don't renumber files in dwarf.go:writelines anymore.
@ -593,26 +529,11 @@ func (st *relocSymState) relocsym(s loader.Sym, P []byte) {
case 8:
target.Arch.ByteOrder.PutUint64(P[off:], uint64(o))
}
addExtReloc:
if needExtReloc {
if target.StreamExtRelocs() {
extraExtReloc++
} else {
extRelocs = append(extRelocs, rr)
}
}
}
if target.IsExternal() && target.StreamExtRelocs() {
// On AMD64 ELF, we'll stream out the external relocations in elfrelocsect
if target.IsExternal() {
// We'll stream out the external relocations in asmb2 (e.g. elfrelocsect)
// and we only need the count here.
// TODO: just count, but not compute the external relocations. For now it
// is still needed on other platforms, and this keeps the code simple.
atomic.AddUint32(&ldr.SymSect(s).Relcount, uint32(extraExtReloc))
} else if len(extRelocs) != 0 {
st.finalizeExtRelocSlice(extRelocs)
ldr.SetExtRelocs(s, extRelocs)
atomic.AddUint32(&ldr.SymSect(s).Relcount, uint32(len(extRelocs)+extraExtReloc))
atomic.AddUint32(&ldr.SymSect(s).Relcount, uint32(nExtReloc))
}
}
@ -661,10 +582,6 @@ func extreloc(ctxt *Link, ldr *loader.Loader, s loader.Sym, r loader.Reloc2, ri
rs := ldr.ResolveABIAlias(r.Sym())
rs, off := FoldSubSymbolOffset(ldr, rs)
rr.Xadd = r.Add() + off
rst := ldr.SymType(rs)
if rst != sym.SHOSTOBJ && rst != sym.SDYNIMPORT && rst != sym.SUNDEFEXT && ldr.SymSect(rs) == nil {
ldr.Errorf(s, "missing section for relocation target %s", ldr.SymName(rs))
}
rr.Xsym = rs
case objabi.R_DWARFSECREF:
@ -704,10 +621,6 @@ func extreloc(ctxt *Link, ldr *loader.Loader, s loader.Sym, r loader.Reloc2, ri
rs, off := FoldSubSymbolOffset(ldr, rs)
rr.Xadd = r.Add() + off
rr.Xadd -= int64(siz) // relative to address after the relocated chunk
rst := ldr.SymType(rs)
if rst != sym.SHOSTOBJ && rst != sym.SDYNIMPORT && ldr.SymSect(rs) == nil {
ldr.Errorf(s, "missing section for relocation target %s", ldr.SymName(rs))
}
rr.Xsym = rs
break
}
@ -726,8 +639,6 @@ func extreloc(ctxt *Link, ldr *loader.Loader, s loader.Sym, r loader.Reloc2, ri
return rr, true
}
const extRelocSlabSize = 2048
// relocSymState hold state information needed when making a series of
// successive calls to relocsym(). The items here are invariant
// (meaning that they are set up once initially and then don't change
@ -740,34 +651,6 @@ type relocSymState struct {
ldr *loader.Loader
err *ErrorReporter
syms *ArchSyms
batch []loader.ExtReloc
}
// preallocExtRelocs returns a subslice from an internally allocated
// slab owned by the state object. Client requests a slice of size
// 'sz', however it may be that fewer relocs are needed; the
// assumption is that the final size is set in a [required] subsequent
// call to 'finalizeExtRelocSlice'.
func (st *relocSymState) preallocExtRelocSlice(sz int) []loader.ExtReloc {
if len(st.batch) < sz {
slabSize := extRelocSlabSize
if sz > extRelocSlabSize {
slabSize = sz
}
st.batch = make([]loader.ExtReloc, slabSize)
}
rval := st.batch[:sz:sz]
return rval[:0]
}
// finalizeExtRelocSlice takes a slice returned from preallocExtRelocSlice,
// from which it determines how many of the pre-allocated relocs were
// actually needed; it then carves that number off the batch slice.
func (st *relocSymState) finalizeExtRelocSlice(finalsl []loader.ExtReloc) {
if &st.batch[0] != &finalsl[0] {
panic("preallocExtRelocSlice size invariant violation")
}
st.batch = st.batch[len(finalsl):]
}
// makeRelocSymState creates a relocSymState container object to

View file

@ -1372,50 +1372,29 @@ func elfrelocsect(ctxt *Link, out *OutBuf, sect *sym.Section, syms []loader.Sym)
break
}
if ctxt.StreamExtRelocs() {
// Compute external relocations on the go, and pass to Elfreloc1
// to stream out.
relocs := ldr.Relocs(s)
for ri := 0; ri < relocs.Count(); ri++ {
r := relocs.At2(ri)
rr, ok := extreloc(ctxt, ldr, s, r, ri)
if !ok {
continue
}
if rr.Xsym == 0 {
ldr.Errorf(s, "missing xsym in relocation")
continue
}
esr := ElfSymForReloc(ctxt, rr.Xsym)
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(rr.Xsym), ldr.SymType(r.Sym()), ldr.SymType(r.Sym()).String())
}
if !ldr.AttrReachable(rr.Xsym) {
ldr.Errorf(s, "unreachable reloc %d (%s) target %v", r.Type(), sym.RelocName(ctxt.Arch, r.Type()), ldr.SymName(rr.Xsym))
}
rv := loader.ExtRelocView{Reloc2: r, ExtReloc: rr}
if !thearch.Elfreloc1(ctxt, out, ldr, s, rv, 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()))
}
// Compute external relocations on the go, and pass to Elfreloc1
// to stream out.
relocs := ldr.Relocs(s)
for ri := 0; ri < relocs.Count(); ri++ {
r := relocs.At2(ri)
rr, ok := extreloc(ctxt, ldr, s, r, ri)
if !ok {
continue
}
} else {
relocs := ldr.ExtRelocs(s)
for ri := 0; ri < relocs.Count(); ri++ {
r := relocs.At(ri)
if r.Xsym == 0 {
ldr.Errorf(s, "missing xsym in relocation")
continue
}
esr := ElfSymForReloc(ctxt, r.Xsym)
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())
}
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))
}
if !thearch.Elfreloc1(ctxt, out, 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()))
}
if rr.Xsym == 0 {
ldr.Errorf(s, "missing xsym in relocation")
continue
}
esr := ElfSymForReloc(ctxt, rr.Xsym)
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(rr.Xsym), ldr.SymType(r.Sym()), ldr.SymType(r.Sym()).String())
}
if !ldr.AttrReachable(rr.Xsym) {
ldr.Errorf(s, "unreachable reloc %d (%s) target %v", r.Type(), sym.RelocName(ctxt.Arch, r.Type()), ldr.SymName(rr.Xsym))
}
rv := loader.ExtRelocView{Reloc2: r, ExtReloc: rr}
if !thearch.Elfreloc1(ctxt, out, ldr, s, rv, 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()))
}
}
}

View file

@ -212,8 +212,8 @@ type Arch struct {
// ELF/Mach-O/etc. relocations, not Go relocations, this must match Elfreloc1,
// etc.), and a boolean indicating success/failure (a failing value indicates
// a fatal error).
Archreloc func(*Target, *loader.Loader, *ArchSyms, loader.Reloc2, *loader.ExtReloc,
loader.Sym, int64) (relocatedOffset int64, nExtReloc int, ok bool)
Archreloc func(*Target, *loader.Loader, *ArchSyms, loader.Reloc2, loader.Sym,
int64) (relocatedOffset int64, nExtReloc int, ok bool)
// Archrelocvariant is a second arch-specific hook used for
// relocation processing; it handles relocations where r.Type is
// insufficient to describe the relocation (r.Variant !=

View file

@ -181,8 +181,3 @@ func (t *Target) mustSetHeadType() {
func (t *Target) IsBigEndian() bool {
return t.Arch.ByteOrder == binary.BigEndian
}
// Temporary helper.
func (t *Target) StreamExtRelocs() bool {
return true
}

View file

@ -238,8 +238,6 @@ type Loader struct {
align []uint8 // symbol 2^N alignment, indexed by global index
extRelocs [][]ExtReloc // symbol's external relocations
itablink map[Sym]struct{} // itablink[j] defined if j is go.itablink.*
deferReturnTramp map[Sym]bool // whether the symbol is a trampoline of a deferreturn call
@ -1241,16 +1239,6 @@ func (l *Loader) FreeData(i Sym) {
}
}
// SetExtRelocs sets the external relocations of the i-th symbol. i is global index.
func (l *Loader) SetExtRelocs(i Sym, relocs []ExtReloc) {
l.extRelocs[i] = relocs
}
// InitExtRelocs initialize the slice used to store external relocations.
func (l *Loader) InitExtRelocs() {
l.extRelocs = make([][]ExtReloc, l.NSym())
}
// SymAlign returns the alignment for a symbol.
func (l *Loader) SymAlign(i Sym) int32 {
if int(i) >= len(l.align) {
@ -1878,24 +1866,6 @@ func (l *Loader) relocs(r *oReader, li uint32) Relocs {
}
}
// ExtRelocs returns the external relocations of the i-th symbol.
func (l *Loader) ExtRelocs(i Sym) ExtRelocs {
return ExtRelocs{l.Relocs(i), l.extRelocs[i]}
}
// ExtRelocs represents the set of external relocations of a symbol.
type ExtRelocs struct {
rs Relocs
es []ExtReloc
}
func (ers ExtRelocs) Count() int { return len(ers.es) }
func (ers ExtRelocs) At(j int) ExtRelocView {
i := ers.es[j].Idx
return ExtRelocView{ers.rs.At2(i), ers.es[j]}
}
// RelocByOff implements sort.Interface for sorting relocations by offset.
type RelocByOff []Reloc

View file

@ -90,7 +90,7 @@ func applyrel(arch *sys.Arch, ldr *loader.Loader, rt objabi.RelocType, off int32
}
}
func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loader.Reloc2, rr *loader.ExtReloc, s loader.Sym, val int64) (o int64, nExtReloc int, ok bool) {
func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loader.Reloc2, s loader.Sym, val int64) (o int64, nExtReloc int, ok bool) {
rs := r.Sym()
rs = ldr.ResolveABIAlias(rs)
if target.IsExternal() {

View file

@ -94,7 +94,7 @@ func machoreloc1(*sys.Arch, *ld.OutBuf, *loader.Loader, loader.Sym, loader.ExtRe
return false
}
func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loader.Reloc2, rr *loader.ExtReloc, s loader.Sym, val int64) (o int64, nExtReloc int, ok bool) {
func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loader.Reloc2, s loader.Sym, val int64) (o int64, nExtReloc int, ok bool) {
if target.IsExternal() {
switch r.Type() {
default:

View file

@ -797,7 +797,7 @@ func gentramp(ctxt *ld.Link, ldr *loader.Loader, tramp *loader.SymbolBuilder, ta
tramp.SetData(P)
}
func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loader.Reloc2, rr *loader.ExtReloc, s loader.Sym, val int64) (relocatedOffset int64, nExtReloc int, ok bool) {
func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loader.Reloc2, s loader.Sym, val int64) (relocatedOffset int64, nExtReloc int, ok bool) {
rs := ldr.ResolveABIAlias(r.Sym())
if target.IsExternal() {
// On AIX, relocations (except TLS ones) must be also done to the

View file

@ -32,7 +32,7 @@ func machoreloc1(*sys.Arch, *ld.OutBuf, *loader.Loader, loader.Sym, loader.ExtRe
return false
}
func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loader.Reloc2, rr *loader.ExtReloc, s loader.Sym, val int64) (o int64, nExtReloc int, ok bool) {
func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loader.Reloc2, s loader.Sym, val int64) (o int64, nExtReloc int, ok bool) {
rs := r.Sym()
rs = ldr.ResolveABIAlias(rs)
switch r.Type() {

View file

@ -367,7 +367,7 @@ func machoreloc1(*sys.Arch, *ld.OutBuf, *loader.Loader, loader.Sym, loader.ExtRe
return false
}
func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loader.Reloc2, rr *loader.ExtReloc, s loader.Sym, val int64) (o int64, nExtReloc int, ok bool) {
func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loader.Reloc2, s loader.Sym, val int64) (o int64, nExtReloc int, ok bool) {
return val, 0, false
}

View file

@ -411,7 +411,7 @@ func pereloc1(arch *sys.Arch, out *ld.OutBuf, ldr *loader.Loader, s loader.Sym,
return true
}
func archreloc(*ld.Target, *loader.Loader, *ld.ArchSyms, loader.Reloc2, *loader.ExtReloc, loader.Sym, int64) (int64, int, bool) {
func archreloc(*ld.Target, *loader.Loader, *ld.ArchSyms, loader.Reloc2, loader.Sym, int64) (int64, int, bool) {
return -1, 0, false
}