}
}
-func adddynrel(target *ld.Target, syms *ld.ArchSyms, s *sym.Symbol, r *sym.Reloc) bool {
+func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s *sym.Symbol, r *sym.Reloc) bool {
targ := r.Sym
switch r.Type {
return int32((uint32(a))&0xff000000 | 0x00ffffff&uint32(a+b))
}
-func adddynrel(target *ld.Target, syms *ld.ArchSyms, s *sym.Symbol, r *sym.Reloc) bool {
+func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s *sym.Symbol, r *sym.Reloc) bool {
targ := r.Sym
switch r.Type {
initarray_entry.AddAddr(ctxt.Arch, initfunc)
}
-func adddynrel(target *ld.Target, syms *ld.ArchSyms, s *sym.Symbol, r *sym.Reloc) bool {
+func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s *sym.Symbol, r *sym.Reloc) bool {
targ := r.Sym
switch r.Type {
// to avoid introducing unnecessary allocations in the main loop.
// TODO: This function is called in parallel. When the Loader wavefront
// reaches here, calls into the loader need to be parallel as well.
-func relocsym(target *Target, err *ErrorReporter, lookup LookupFn, syms *ArchSyms, s *sym.Symbol) {
+func relocsym(target *Target, ldr *loader.Loader, err *ErrorReporter, lookup LookupFn, syms *ArchSyms, s *sym.Symbol) {
if len(s.R) == 0 {
return
}
// symbol which isn't in .data. However, as .text has the
// same address once loaded, this is possible.
if s.Sect.Seg == &Segdata {
- Xcoffadddynrel(target, s, r)
+ Xcoffadddynrel(target, ldr, s, r)
}
}
func (ctxt *Link) reloc() {
var wg sync.WaitGroup
target := &ctxt.Target
+ ldr := ctxt.loader
reporter := &ctxt.ErrorReporter
lookup := ctxt.Syms.ROLookup
syms := &ctxt.ArchSyms
wg.Add(3)
go func() {
for _, s := range ctxt.Textp {
- relocsym(target, reporter, lookup, syms, s)
+ relocsym(target, ldr, reporter, lookup, syms, s)
}
wg.Done()
}()
go func() {
for _, s := range ctxt.datap {
- relocsym(target, reporter, lookup, syms, s)
+ relocsym(target, ldr, reporter, lookup, syms, s)
}
wg.Done()
}()
go func() {
for _, s := range dwarfp {
- relocsym(target, reporter, lookup, syms, s)
+ relocsym(target, ldr, reporter, lookup, syms, s)
}
wg.Done()
}()
func dynrelocsym(ctxt *Link, s *sym.Symbol) {
target := &ctxt.Target
+ ldr := ctxt.loader
syms := &ctxt.ArchSyms
for ri := range s.R {
r := &s.R[ri]
// It's expected that some relocations will be done
// later by relocsym (R_TLS_LE, R_ADDROFF), so
// don't worry if Adddynrel returns false.
- thearch.Adddynrel(target, syms, s, r)
+ thearch.Adddynrel(target, ldr, syms, s, r)
continue
}
if r.Sym != nil && !r.Sym.Attr.Reachable() {
Errorf(s, "dynamic relocation to unreachable symbol %s", r.Sym.Name)
}
- if !thearch.Adddynrel(target, syms, s, r) {
+ if !thearch.Adddynrel(target, ldr, syms, s, r) {
Errorf(s, "unsupported dynamic relocation for symbol %s (type=%d (%s) stype=%d (%s))", r.Sym.Name, r.Type, sym.RelocName(ctxt.Arch, r.Type), r.Sym.Type, r.Sym.Type)
}
}
log.Fatalf("NewWriterLevel failed: %s", err)
}
target := &ctxt.Target
+ ldr := ctxt.loader
reporter := &ctxt.ErrorReporter
lookup := ctxt.Syms.ROLookup
archSyms := &ctxt.ArchSyms
// TODO: This function call needs to be parallelized when the loader wavefront gets here.
s.Attr.Set(sym.AttrReadOnly, false)
}
- relocsym(target, reporter, lookup, archSyms, s)
+ relocsym(target, ldr, reporter, lookup, archSyms, s)
if _, err := z.Write(s.P); err != nil {
log.Fatalf("compression failed: %s", err)
}
Openbsddynld string
Dragonflydynld string
Solarisdynld string
- Adddynrel func(*Target, *ArchSyms, *sym.Symbol, *sym.Reloc) bool
+ Adddynrel func(*Target, *loader.Loader, *ArchSyms, *sym.Symbol, *sym.Reloc) bool
Archinit func(*Link)
// Archreloc is an arch-specific hook that assists in
// relocation processing (invoked by 'relocsym'); it handles
dynLibraries map[string]int // Dynamic libraries in .loader section. The integer represents its import file number (- 1)
loaderSymbols []*xcoffLoaderSymbol // symbols inside .loader symbol table
loaderReloc []*xcoffLoaderReloc // Reloc that must be made inside loader
-
- ldr *loader.Loader // XXX keep a reference here for now, as it is needed in Xcoffadddynrel. will clean up in the next CL.
}
// Var used by XCOFF Generation algorithms
// Xcoffadddynrel adds a dynamic relocation in a XCOFF file.
// This relocation will be made by the loader.
-func Xcoffadddynrel(target *Target, s *sym.Symbol, r *sym.Reloc) bool {
+func Xcoffadddynrel(target *Target, ldr *loader.Loader, s *sym.Symbol, r *sym.Reloc) bool {
if target.IsExternal() {
return true
}
if s.Type == sym.SXCOFFTOC && r.Sym.Type == sym.SDYNIMPORT {
// Imported symbol relocation
for i, dynsym := range xfile.loaderSymbols {
- if xfile.ldr.Syms[dynsym.sym].Name == r.Sym.Name {
+ if ldr.Syms[dynsym.sym].Name == r.Sym.Name {
xldr.symndx = int32(i + 3) // +3 because of 3 section symbols
break
}
xfile.genDynSym(ctxt)
- xfile.ldr = ldr // XXX
-
for s := loader.Sym(1); s < loader.Sym(ldr.NSym()); s++ {
if strings.HasPrefix(ldr.SymName(s), "TOC.") {
sb := ldr.MakeSymbolUpdater(s)
return
}
-func adddynrel(target *ld.Target, syms *ld.ArchSyms, s *sym.Symbol, r *sym.Reloc) bool {
+func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s *sym.Symbol, r *sym.Reloc) bool {
log.Fatalf("adddynrel not implemented")
return false
}
func gentext(ctxt *ld.Link) {}
-func adddynrel(target *ld.Target, syms *ld.ArchSyms, s *sym.Symbol, r *sym.Reloc) bool {
+func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s *sym.Symbol, r *sym.Reloc) bool {
log.Fatalf("adddynrel not implemented")
return false
}
stub.AddUint32(ctxt.Arch, 0x4e800420) // bctr
}
-func adddynrel(target *ld.Target, syms *ld.ArchSyms, s *sym.Symbol, r *sym.Reloc) bool {
+func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s *sym.Symbol, r *sym.Reloc) bool {
if target.IsElf() {
return addelfdynrel(target, syms, s, r)
} else if target.IsAIX() {
- return ld.Xcoffadddynrel(target, s, r)
+ return ld.Xcoffadddynrel(target, ldr, s, r)
}
return false
}
log.Fatalf("adddynrela not implemented")
}
-func adddynrel(target *ld.Target, syms *ld.ArchSyms, s *sym.Symbol, r *sym.Reloc) bool {
+func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s *sym.Symbol, r *sym.Reloc) bool {
log.Fatalf("adddynrel not implemented")
return false
}
initarray_entry.AddAddr(ctxt.Arch, initfunc)
}
-func adddynrel(target *ld.Target, syms *ld.ArchSyms, s *sym.Symbol, r *sym.Reloc) bool {
+func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s *sym.Symbol, r *sym.Reloc) bool {
targ := r.Sym
r.InitExt()
initarray_entry.AddAddr(ctxt.Arch, initfunc)
}
-func adddynrel(target *ld.Target, syms *ld.ArchSyms, s *sym.Symbol, r *sym.Reloc) bool {
+func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s *sym.Symbol, r *sym.Reloc) bool {
targ := r.Sym
switch r.Type {