]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/link/internal: remove global Ctxt variable
authorMichael Matloob <matloob@golang.org>
Sun, 21 Aug 2016 17:52:23 +0000 (13:52 -0400)
committerMichael Matloob <matloob@golang.org>
Sun, 21 Aug 2016 18:18:39 +0000 (18:18 +0000)
This change threads the *ld.Link Ctxt variable through
code in arch-specific packages. This removes all remaining
uses of Ctxt, so remove the global variable too.

This CL continues the work in golang.org/cl/27408

Updates #16818

Change-Id: I5f4536847a1825fd0b944824e8ae4e122ec0fb78
Reviewed-on: https://go-review.googlesource.com/27459
Run-TryBot: Michael Matloob <matloob@golang.org>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>

20 files changed:
src/cmd/link/internal/amd64/asm.go
src/cmd/link/internal/amd64/obj.go
src/cmd/link/internal/arm/asm.go
src/cmd/link/internal/arm/obj.go
src/cmd/link/internal/arm64/asm.go
src/cmd/link/internal/arm64/obj.go
src/cmd/link/internal/ld/data.go
src/cmd/link/internal/ld/elf.go
src/cmd/link/internal/ld/lib.go
src/cmd/link/internal/ld/macho.go
src/cmd/link/internal/ld/pe.go
src/cmd/link/internal/ld/pobj.go
src/cmd/link/internal/mips64/asm.go
src/cmd/link/internal/mips64/obj.go
src/cmd/link/internal/ppc64/asm.go
src/cmd/link/internal/ppc64/obj.go
src/cmd/link/internal/s390x/asm.go
src/cmd/link/internal/s390x/obj.go
src/cmd/link/internal/x86/asm.go
src/cmd/link/internal/x86/obj.go

index 39ce45780428fd45164f7f927052df6e682fed86..0c6bbfb177aaeeeda446180498f538dda0f36363 100644 (file)
@@ -55,63 +55,63 @@ func Addcall(ctxt *ld.Link, s *ld.Symbol, t *ld.Symbol) int64 {
        return i + int64(r.Siz)
 }
 
-func gentext() {
+func gentext(ctxt *ld.Link) {
        if !ld.DynlinkingGo() {
                return
        }
-       addmoduledata := ld.Linklookup(ld.Ctxt, "runtime.addmoduledata", 0)
+       addmoduledata := ld.Linklookup(ctxt, "runtime.addmoduledata", 0)
        if addmoduledata.Type == obj.STEXT {
                // we're linking a module containing the runtime -> no need for
                // an init function
                return
        }
        addmoduledata.Attr |= ld.AttrReachable
-       initfunc := ld.Linklookup(ld.Ctxt, "go.link.addmoduledata", 0)
+       initfunc := ld.Linklookup(ctxt, "go.link.addmoduledata", 0)
        initfunc.Type = obj.STEXT
        initfunc.Attr |= ld.AttrLocal
        initfunc.Attr |= ld.AttrReachable
        o := func(op ...uint8) {
                for _, op1 := range op {
-                       ld.Adduint8(ld.Ctxt, initfunc, op1)
+                       ld.Adduint8(ctxt, initfunc, op1)
                }
        }
        // 0000000000000000 <local.dso_init>:
        //    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
        o(0x48, 0x8d, 0x3d)
-       ld.Addpcrelplus(ld.Ctxt, initfunc, ld.Ctxt.Moduledata, 0)
+       ld.Addpcrelplus(ctxt, initfunc, ctxt.Moduledata, 0)
        //    7:        e8 00 00 00 00          callq  c <local.dso_init+0xc>
        //                      8: R_X86_64_PLT32       runtime.addmoduledata-0x4
        o(0xe8)
-       Addcall(ld.Ctxt, initfunc, addmoduledata)
+       Addcall(ctxt, initfunc, addmoduledata)
        //    c:        c3                      retq
        o(0xc3)
-       ld.Ctxt.Textp = append(ld.Ctxt.Textp, initfunc)
-       initarray_entry := ld.Linklookup(ld.Ctxt, "go.link.addmoduledatainit", 0)
+       ctxt.Textp = append(ctxt.Textp, initfunc)
+       initarray_entry := ld.Linklookup(ctxt, "go.link.addmoduledatainit", 0)
        initarray_entry.Attr |= ld.AttrReachable
        initarray_entry.Attr |= ld.AttrLocal
        initarray_entry.Type = obj.SINITARR
-       ld.Addaddr(ld.Ctxt, initarray_entry, initfunc)
+       ld.Addaddr(ctxt, initarray_entry, initfunc)
 }
 
-func adddynrel(s *ld.Symbol, r *ld.Reloc) {
+func adddynrel(ctxt *ld.Link, s *ld.Symbol, r *ld.Reloc) {
        targ := r.Sym
-       ld.Ctxt.Cursym = s
+       ctxt.Cursym = s
 
        switch r.Type {
        default:
                if r.Type >= 256 {
-                       ld.Ctxt.Diag("unexpected relocation type %d", r.Type)
+                       ctxt.Diag("unexpected relocation type %d", r.Type)
                        return
                }
 
                // Handle relocations found in ELF object files.
        case 256 + ld.R_X86_64_PC32:
                if targ.Type == obj.SDYNIMPORT {
-                       ld.Ctxt.Diag("unexpected R_X86_64_PC32 relocation for dynamic symbol %s", targ.Name)
+                       ctxt.Diag("unexpected R_X86_64_PC32 relocation for dynamic symbol %s", targ.Name)
                }
                if targ.Type == 0 || targ.Type == obj.SXREF {
-                       ld.Ctxt.Diag("unknown symbol %s in pcrel", targ.Name)
+                       ctxt.Diag("unknown symbol %s in pcrel", targ.Name)
                }
                r.Type = obj.R_PCREL
                r.Add += 4
@@ -121,8 +121,8 @@ func adddynrel(s *ld.Symbol, r *ld.Reloc) {
                r.Type = obj.R_PCREL
                r.Add += 4
                if targ.Type == obj.SDYNIMPORT {
-                       addpltsym(targ)
-                       r.Sym = ld.Linklookup(ld.Ctxt, ".plt", 0)
+                       addpltsym(ctxt, targ)
+                       r.Sym = ld.Linklookup(ctxt, ".plt", 0)
                        r.Add += int64(targ.Plt)
                }
 
@@ -143,17 +143,17 @@ func adddynrel(s *ld.Symbol, r *ld.Reloc) {
 
                // fall back to using GOT and hope for the best (CMOV*)
                // TODO: just needs relocation, no need to put in .dynsym
-               addgotsym(targ)
+               addgotsym(ctxt, targ)
 
                r.Type = obj.R_PCREL
-               r.Sym = ld.Linklookup(ld.Ctxt, ".got", 0)
+               r.Sym = ld.Linklookup(ctxt, ".got", 0)
                r.Add += 4
                r.Add += int64(targ.Got)
                return
 
        case 256 + ld.R_X86_64_64:
                if targ.Type == obj.SDYNIMPORT {
-                       ld.Ctxt.Diag("unexpected R_X86_64_64 relocation for dynamic symbol %s", targ.Name)
+                       ctxt.Diag("unexpected R_X86_64_64 relocation for dynamic symbol %s", targ.Name)
                }
                r.Type = obj.R_ADDR
                return
@@ -166,14 +166,14 @@ func adddynrel(s *ld.Symbol, r *ld.Reloc) {
                r.Type = obj.R_ADDR
 
                if targ.Type == obj.SDYNIMPORT {
-                       ld.Ctxt.Diag("unexpected reloc for dynamic symbol %s", targ.Name)
+                       ctxt.Diag("unexpected reloc for dynamic symbol %s", targ.Name)
                }
                return
 
        case 512 + ld.MACHO_X86_64_RELOC_BRANCH*2 + 1:
                if targ.Type == obj.SDYNIMPORT {
-                       addpltsym(targ)
-                       r.Sym = ld.Linklookup(ld.Ctxt, ".plt", 0)
+                       addpltsym(ctxt, targ)
+                       r.Sym = ld.Linklookup(ctxt, ".plt", 0)
                        r.Add = int64(targ.Plt)
                        r.Type = obj.R_PCREL
                        return
@@ -189,7 +189,7 @@ func adddynrel(s *ld.Symbol, r *ld.Reloc) {
                r.Type = obj.R_PCREL
 
                if targ.Type == obj.SDYNIMPORT {
-                       ld.Ctxt.Diag("unexpected pc-relative reloc for dynamic symbol %s", targ.Name)
+                       ctxt.Diag("unexpected pc-relative reloc for dynamic symbol %s", targ.Name)
                }
                return
 
@@ -198,7 +198,7 @@ func adddynrel(s *ld.Symbol, r *ld.Reloc) {
                        // have symbol
                        // turn MOVQ of GOT entry into LEAQ of symbol itself
                        if r.Off < 2 || s.P[r.Off-2] != 0x8b {
-                               ld.Ctxt.Diag("unexpected GOT_LOAD reloc for non-dynamic symbol %s", targ.Name)
+                               ctxt.Diag("unexpected GOT_LOAD reloc for non-dynamic symbol %s", targ.Name)
                                return
                        }
 
@@ -211,11 +211,11 @@ func adddynrel(s *ld.Symbol, r *ld.Reloc) {
                // fall through
        case 512 + ld.MACHO_X86_64_RELOC_GOT*2 + 1:
                if targ.Type != obj.SDYNIMPORT {
-                       ld.Ctxt.Diag("unexpected GOT reloc for non-dynamic symbol %s", targ.Name)
+                       ctxt.Diag("unexpected GOT reloc for non-dynamic symbol %s", targ.Name)
                }
-               addgotsym(targ)
+               addgotsym(ctxt, targ)
                r.Type = obj.R_PCREL
-               r.Sym = ld.Linklookup(ld.Ctxt, ".got", 0)
+               r.Sym = ld.Linklookup(ctxt, ".got", 0)
                r.Add += int64(targ.Got)
                return
        }
@@ -233,8 +233,8 @@ func adddynrel(s *ld.Symbol, r *ld.Reloc) {
                        return
                } else {
                        // for both ELF and Mach-O
-                       addpltsym(targ)
-                       r.Sym = ld.Linklookup(ld.Ctxt, ".plt", 0)
+                       addpltsym(ctxt, targ)
+                       r.Sym = ld.Linklookup(ctxt, ".plt", 0)
                        r.Add = int64(targ.Plt)
                        return
                }
@@ -242,17 +242,17 @@ func adddynrel(s *ld.Symbol, r *ld.Reloc) {
        case obj.R_ADDR:
                if s.Type == obj.STEXT && ld.Iself {
                        if ld.HEADTYPE == obj.Hsolaris {
-                               addpltsym(targ)
-                               r.Sym = ld.Linklookup(ld.Ctxt, ".plt", 0)
+                               addpltsym(ctxt, targ)
+                               r.Sym = ld.Linklookup(ctxt, ".plt", 0)
                                r.Add += int64(targ.Plt)
                                return
                        }
                        // The code is asking for the address of an external
                        // function. We provide it with the address of the
                        // correspondent GOT symbol.
-                       addgotsym(targ)
+                       addgotsym(ctxt, targ)
 
-                       r.Sym = ld.Linklookup(ld.Ctxt, ".got", 0)
+                       r.Sym = ld.Linklookup(ctxt, ".got", 0)
                        r.Add += int64(targ.Got)
                        return
                }
@@ -261,15 +261,15 @@ func adddynrel(s *ld.Symbol, r *ld.Reloc) {
                        break
                }
                if ld.Iself {
-                       ld.Adddynsym(ld.Ctxt, targ)
-                       rela := ld.Linklookup(ld.Ctxt, ".rela", 0)
-                       ld.Addaddrplus(ld.Ctxt, rela, s, int64(r.Off))
+                       ld.Adddynsym(ctxt, targ)
+                       rela := ld.Linklookup(ctxt, ".rela", 0)
+                       ld.Addaddrplus(ctxt, rela, s, int64(r.Off))
                        if r.Siz == 8 {
-                               ld.Adduint64(ld.Ctxt, rela, ld.ELF64_R_INFO(uint32(targ.Dynid), ld.R_X86_64_64))
+                               ld.Adduint64(ctxt, rela, ld.ELF64_R_INFO(uint32(targ.Dynid), ld.R_X86_64_64))
                        } else {
-                               ld.Adduint64(ld.Ctxt, rela, ld.ELF64_R_INFO(uint32(targ.Dynid), ld.R_X86_64_32))
+                               ld.Adduint64(ctxt, rela, ld.ELF64_R_INFO(uint32(targ.Dynid), ld.R_X86_64_32))
                        }
-                       ld.Adduint64(ld.Ctxt, rela, uint64(r.Add))
+                       ld.Adduint64(ctxt, rela, uint64(r.Add))
                        r.Type = 256 // ignore during relocsym
                        return
                }
@@ -285,16 +285,16 @@ func adddynrel(s *ld.Symbol, r *ld.Reloc) {
                        // just in case the C code assigns to the variable,
                        // and of course it only works for single pointers,
                        // but we only need to support cgo and that's all it needs.
-                       ld.Adddynsym(ld.Ctxt, targ)
+                       ld.Adddynsym(ctxt, targ)
 
-                       got := ld.Linklookup(ld.Ctxt, ".got", 0)
+                       got := ld.Linklookup(ctxt, ".got", 0)
                        s.Type = got.Type | obj.SSUB
                        s.Outer = got
                        s.Sub = got.Sub
                        got.Sub = s
                        s.Value = got.Size
-                       ld.Adduint64(ld.Ctxt, got, 0)
-                       ld.Adduint32(ld.Ctxt, ld.Linklookup(ld.Ctxt, ".linkedit.got", 0), uint32(targ.Dynid))
+                       ld.Adduint64(ctxt, got, 0)
+                       ld.Adduint32(ctxt, ld.Linklookup(ctxt, ".linkedit.got", 0), uint32(targ.Dynid))
                        r.Type = 256 // ignore during relocsym
                        return
                }
@@ -305,11 +305,11 @@ func adddynrel(s *ld.Symbol, r *ld.Reloc) {
                }
        }
 
-       ld.Ctxt.Cursym = s
-       ld.Ctxt.Diag("unsupported relocation for dynamic symbol %s (type=%d stype=%d)", targ.Name, r.Type, targ.Type)
+       ctxt.Cursym = s
+       ctxt.Diag("unsupported relocation for dynamic symbol %s (type=%d stype=%d)", targ.Name, r.Type, targ.Type)
 }
 
-func elfreloc1(r *ld.Reloc, sectoff int64) int {
+func elfreloc1(ctxt *ld.Link, r *ld.Reloc, sectoff int64) int {
        ld.Thearch.Vput(uint64(sectoff))
 
        elfsym := r.Xsym.ElfsymForReloc()
@@ -378,14 +378,14 @@ func elfreloc1(r *ld.Reloc, sectoff int64) int {
        return 0
 }
 
-func machoreloc1(r *ld.Reloc, sectoff int64) int {
+func machoreloc1(ctxt *ld.Link, r *ld.Reloc, sectoff int64) int {
        var v uint32
 
        rs := r.Xsym
 
        if rs.Type == obj.SHOSTOBJ || r.Type == obj.R_PCREL {
                if rs.Dynid < 0 {
-                       ld.Ctxt.Diag("reloc %d to non-macho symbol %s type=%d", r.Type, rs.Name, rs.Type)
+                       ctxt.Diag("reloc %d to non-macho symbol %s type=%d", r.Type, rs.Name, rs.Type)
                        return -1
                }
 
@@ -394,7 +394,7 @@ func machoreloc1(r *ld.Reloc, sectoff int64) int {
        } else {
                v = uint32(rs.Sect.Extnum)
                if v == 0 {
-                       ld.Ctxt.Diag("reloc %d to symbol %s in non-macho section %s type=%d", r.Type, rs.Name, rs.Sect.Name, rs.Type)
+                       ctxt.Diag("reloc %d to symbol %s in non-macho section %s type=%d", r.Type, rs.Name, rs.Sect.Name, rs.Type)
                        return -1
                }
        }
@@ -438,13 +438,13 @@ func machoreloc1(r *ld.Reloc, sectoff int64) int {
        return 0
 }
 
-func pereloc1(r *ld.Reloc, sectoff int64) bool {
+func pereloc1(ctxt *ld.Link, r *ld.Reloc, sectoff int64) bool {
        var v uint32
 
        rs := r.Xsym
 
        if rs.Dynid < 0 {
-               ld.Ctxt.Diag("reloc %d to non-coff symbol %s type=%d", r.Type, rs.Name, rs.Type)
+               ctxt.Diag("reloc %d to non-coff symbol %s type=%d", r.Type, rs.Name, rs.Type)
                return false
        }
 
@@ -472,81 +472,81 @@ func pereloc1(r *ld.Reloc, sectoff int64) bool {
        return true
 }
 
-func archreloc(r *ld.Reloc, s *ld.Symbol, val *int64) int {
+func archreloc(ctxt *ld.Link, r *ld.Reloc, s *ld.Symbol, val *int64) int {
        return -1
 }
 
-func archrelocvariant(r *ld.Reloc, s *ld.Symbol, t int64) int64 {
+func archrelocvariant(ctxt *ld.Link, r *ld.Reloc, s *ld.Symbol, t int64) int64 {
        log.Fatalf("unexpected relocation variant")
        return t
 }
 
-func elfsetupplt() {
-       plt := ld.Linklookup(ld.Ctxt, ".plt", 0)
-       got := ld.Linklookup(ld.Ctxt, ".got.plt", 0)
+func elfsetupplt(ctxt *ld.Link) {
+       plt := ld.Linklookup(ctxt, ".plt", 0)
+       got := ld.Linklookup(ctxt, ".got.plt", 0)
        if plt.Size == 0 {
                // pushq got+8(IP)
-               ld.Adduint8(ld.Ctxt, plt, 0xff)
+               ld.Adduint8(ctxt, plt, 0xff)
 
-               ld.Adduint8(ld.Ctxt, plt, 0x35)
-               ld.Addpcrelplus(ld.Ctxt, plt, got, 8)
+               ld.Adduint8(ctxt, plt, 0x35)
+               ld.Addpcrelplus(ctxt, plt, got, 8)
 
                // jmpq got+16(IP)
-               ld.Adduint8(ld.Ctxt, plt, 0xff)
+               ld.Adduint8(ctxt, plt, 0xff)
 
-               ld.Adduint8(ld.Ctxt, plt, 0x25)
-               ld.Addpcrelplus(ld.Ctxt, plt, got, 16)
+               ld.Adduint8(ctxt, plt, 0x25)
+               ld.Addpcrelplus(ctxt, plt, got, 16)
 
                // nopl 0(AX)
-               ld.Adduint32(ld.Ctxt, plt, 0x00401f0f)
+               ld.Adduint32(ctxt, plt, 0x00401f0f)
 
                // assume got->size == 0 too
-               ld.Addaddrplus(ld.Ctxt, got, ld.Linklookup(ld.Ctxt, ".dynamic", 0), 0)
+               ld.Addaddrplus(ctxt, got, ld.Linklookup(ctxt, ".dynamic", 0), 0)
 
-               ld.Adduint64(ld.Ctxt, got, 0)
-               ld.Adduint64(ld.Ctxt, got, 0)
+               ld.Adduint64(ctxt, got, 0)
+               ld.Adduint64(ctxt, got, 0)
        }
 }
 
-func addpltsym(s *ld.Symbol) {
+func addpltsym(ctxt *ld.Link, s *ld.Symbol) {
        if s.Plt >= 0 {
                return
        }
 
-       ld.Adddynsym(ld.Ctxt, s)
+       ld.Adddynsym(ctxt, s)
 
        if ld.Iself {
-               plt := ld.Linklookup(ld.Ctxt, ".plt", 0)
-               got := ld.Linklookup(ld.Ctxt, ".got.plt", 0)
-               rela := ld.Linklookup(ld.Ctxt, ".rela.plt", 0)
+               plt := ld.Linklookup(ctxt, ".plt", 0)
+               got := ld.Linklookup(ctxt, ".got.plt", 0)
+               rela := ld.Linklookup(ctxt, ".rela.plt", 0)
                if plt.Size == 0 {
-                       elfsetupplt()
+                       elfsetupplt(ctxt)
                }
 
                // jmpq *got+size(IP)
-               ld.Adduint8(ld.Ctxt, plt, 0xff)
+               ld.Adduint8(ctxt, plt, 0xff)
 
-               ld.Adduint8(ld.Ctxt, plt, 0x25)
-               ld.Addpcrelplus(ld.Ctxt, plt, got, got.Size)
+               ld.Adduint8(ctxt, plt, 0x25)
+               ld.Addpcrelplus(ctxt, plt, got, got.Size)
 
                // add to got: pointer to current pos in plt
-               ld.Addaddrplus(ld.Ctxt, got, plt, plt.Size)
+               ld.Addaddrplus(ctxt, got, plt, plt.Size)
 
                // pushq $x
-               ld.Adduint8(ld.Ctxt, plt, 0x68)
+               ld.Adduint8(ctxt, plt, 0x68)
 
-               ld.Adduint32(ld.Ctxt, plt, uint32((got.Size-24-8)/8))
+               ld.Adduint32(ctxt, plt, uint32((got.Size-24-8)/8))
 
                // jmpq .plt
-               ld.Adduint8(ld.Ctxt, plt, 0xe9)
+               ld.Adduint8(ctxt, plt, 0xe9)
 
-               ld.Adduint32(ld.Ctxt, plt, uint32(-(plt.Size + 4)))
+               ld.Adduint32(ctxt, plt, uint32(-(plt.Size + 4)))
 
                // rela
-               ld.Addaddrplus(ld.Ctxt, rela, got, got.Size-8)
+               ld.Addaddrplus(ctxt, rela, got, got.Size-8)
 
-               ld.Adduint64(ld.Ctxt, rela, ld.ELF64_R_INFO(uint32(s.Dynid), ld.R_X86_64_JMP_SLOT))
-               ld.Adduint64(ld.Ctxt, rela, 0)
+               ld.Adduint64(ctxt, rela, ld.ELF64_R_INFO(uint32(s.Dynid), ld.R_X86_64_JMP_SLOT))
+               ld.Adduint64(ctxt, rela, 0)
 
                s.Plt = int32(plt.Size - 16)
        } else if ld.HEADTYPE == obj.Hdarwin {
@@ -560,41 +560,41 @@ func addpltsym(s *ld.Symbol) {
                // http://networkpx.blogspot.com/2009/09/about-lcdyldinfoonly-command.html
                // has details about what we're avoiding.
 
-               addgotsym(s)
-               plt := ld.Linklookup(ld.Ctxt, ".plt", 0)
+               addgotsym(ctxt, s)
+               plt := ld.Linklookup(ctxt, ".plt", 0)
 
-               ld.Adduint32(ld.Ctxt, ld.Linklookup(ld.Ctxt, ".linkedit.plt", 0), uint32(s.Dynid))
+               ld.Adduint32(ctxt, ld.Linklookup(ctxt, ".linkedit.plt", 0), uint32(s.Dynid))
 
                // jmpq *got+size(IP)
                s.Plt = int32(plt.Size)
 
-               ld.Adduint8(ld.Ctxt, plt, 0xff)
-               ld.Adduint8(ld.Ctxt, plt, 0x25)
-               ld.Addpcrelplus(ld.Ctxt, plt, ld.Linklookup(ld.Ctxt, ".got", 0), int64(s.Got))
+               ld.Adduint8(ctxt, plt, 0xff)
+               ld.Adduint8(ctxt, plt, 0x25)
+               ld.Addpcrelplus(ctxt, plt, ld.Linklookup(ctxt, ".got", 0), int64(s.Got))
        } else {
-               ld.Ctxt.Diag("addpltsym: unsupported binary format")
+               ctxt.Diag("addpltsym: unsupported binary format")
        }
 }
 
-func addgotsym(s *ld.Symbol) {
+func addgotsym(ctxt *ld.Link, s *ld.Symbol) {
        if s.Got >= 0 {
                return
        }
 
-       ld.Adddynsym(ld.Ctxt, s)
-       got := ld.Linklookup(ld.Ctxt, ".got", 0)
+       ld.Adddynsym(ctxt, s)
+       got := ld.Linklookup(ctxt, ".got", 0)
        s.Got = int32(got.Size)
-       ld.Adduint64(ld.Ctxt, got, 0)
+       ld.Adduint64(ctxt, got, 0)
 
        if ld.Iself {
-               rela := ld.Linklookup(ld.Ctxt, ".rela", 0)
-               ld.Addaddrplus(ld.Ctxt, rela, got, int64(s.Got))
-               ld.Adduint64(ld.Ctxt, rela, ld.ELF64_R_INFO(uint32(s.Dynid), ld.R_X86_64_GLOB_DAT))
-               ld.Adduint64(ld.Ctxt, rela, 0)
+               rela := ld.Linklookup(ctxt, ".rela", 0)
+               ld.Addaddrplus(ctxt, rela, got, int64(s.Got))
+               ld.Adduint64(ctxt, rela, ld.ELF64_R_INFO(uint32(s.Dynid), ld.R_X86_64_GLOB_DAT))
+               ld.Adduint64(ctxt, rela, 0)
        } else if ld.HEADTYPE == obj.Hdarwin {
-               ld.Adduint32(ld.Ctxt, ld.Linklookup(ld.Ctxt, ".linkedit.got", 0), uint32(s.Dynid))
+               ld.Adduint32(ctxt, ld.Linklookup(ctxt, ".linkedit.got", 0), uint32(s.Dynid))
        } else {
-               ld.Ctxt.Diag("addgotsym: unsupported binary format")
+               ctxt.Diag("addgotsym: unsupported binary format")
        }
 }
 
@@ -650,7 +650,7 @@ func asmb(ctxt *ld.Link) {
 
        switch ld.HEADTYPE {
        default:
-               ld.Ctxt.Diag("unknown header type %d", ld.HEADTYPE)
+               ctxt.Diag("unknown header type %d", ld.HEADTYPE)
                fallthrough
 
        case obj.Hplan9:
@@ -727,7 +727,7 @@ func asmb(ctxt *ld.Link) {
                        ld.Asmplan9sym(ctxt)
                        ld.Cflush()
 
-                       sym := ld.Linklookup(ld.Ctxt, "pclntab", 0)
+                       sym := ld.Linklookup(ctxt, "pclntab", 0)
                        if sym != nil {
                                ld.Lcsize = int32(len(sym.P))
                                for i := 0; int32(i) < ld.Lcsize; i++ {
index c41d2bec9c448baeb11c82d88885958d0e11e12b..c572cdc498b2c19ca750c215044959a443e5659c 100644 (file)
@@ -82,9 +82,7 @@ func linkarchinit() {
        ld.Thearch.Solarisdynld = "/lib/amd64/ld.so.1"
 }
 
-func archinit() {
-       ctxt := ld.Ctxt
-
+func archinit(ctxt *ld.Link) {
        // getgoextlinkenabled is based on GO_EXTLINK_ENABLED when
        // Go was built; see ../../make.bash.
        if ld.Linkmode == ld.LinkAuto && obj.Getgoextlinkenabled() == "0" {
@@ -153,7 +151,7 @@ func archinit() {
                obj.Hopenbsd,   /* openbsd */
                obj.Hdragonfly, /* dragonfly */
                obj.Hsolaris:   /* solaris */
-               ld.Elfinit(ld.Ctxt)
+               ld.Elfinit(ctxt)
 
                ld.HEADR = ld.ELFRESERVE
                if ld.INITTEXT == -1 {
@@ -167,7 +165,7 @@ func archinit() {
                }
 
        case obj.Hnacl:
-               ld.Elfinit(ld.Ctxt)
+               ld.Elfinit(ctxt)
                ld.Debug['w']++ // disable dwarf, which gets confused and is useless anyway
                ld.HEADR = 0x10000
                ld.Funcalign = 32
index 7e58f81d4f0844b3feb09e9e7ba49896d2bff279..289f517a0401792718830f18c09095e4f7a1557a 100644 (file)
@@ -58,23 +58,23 @@ import (
 //    c:        00000004        .word   0x00000004
 //                      c: R_ARM_GOT_PREL       local.moduledata
 
-func gentext() {
+func gentext(ctxt *ld.Link) {
        if !ld.DynlinkingGo() {
                return
        }
-       addmoduledata := ld.Linklookup(ld.Ctxt, "runtime.addmoduledata", 0)
+       addmoduledata := ld.Linklookup(ctxt, "runtime.addmoduledata", 0)
        if addmoduledata.Type == obj.STEXT {
                // we're linking a module containing the runtime -> no need for
                // an init function
                return
        }
        addmoduledata.Attr |= ld.AttrReachable
-       initfunc := ld.Linklookup(ld.Ctxt, "go.link.addmoduledata", 0)
+       initfunc := ld.Linklookup(ctxt, "go.link.addmoduledata", 0)
        initfunc.Type = obj.STEXT
        initfunc.Attr |= ld.AttrLocal
        initfunc.Attr |= ld.AttrReachable
        o := func(op uint32) {
-               ld.Adduint32(ld.Ctxt, initfunc, op)
+               ld.Adduint32(ctxt, initfunc, op)
        }
        o(0xe59f0004)
        o(0xe08f0000)
@@ -83,7 +83,7 @@ func gentext() {
        rel := ld.Addrel(initfunc)
        rel.Off = 8
        rel.Siz = 4
-       rel.Sym = ld.Linklookup(ld.Ctxt, "runtime.addmoduledata", 0)
+       rel.Sym = ld.Linklookup(ctxt, "runtime.addmoduledata", 0)
        rel.Type = obj.R_CALLARM
        rel.Add = 0xeafffffe // vomit
 
@@ -91,16 +91,16 @@ func gentext() {
        rel = ld.Addrel(initfunc)
        rel.Off = 12
        rel.Siz = 4
-       rel.Sym = ld.Ctxt.Moduledata
+       rel.Sym = ctxt.Moduledata
        rel.Type = obj.R_PCREL
        rel.Add = 4
 
-       ld.Ctxt.Textp = append(ld.Ctxt.Textp, initfunc)
-       initarray_entry := ld.Linklookup(ld.Ctxt, "go.link.addmoduledatainit", 0)
+       ctxt.Textp = append(ctxt.Textp, initfunc)
+       initarray_entry := ld.Linklookup(ctxt, "go.link.addmoduledatainit", 0)
        initarray_entry.Attr |= ld.AttrReachable
        initarray_entry.Attr |= ld.AttrLocal
        initarray_entry.Type = obj.SINITARR
-       ld.Addaddr(ld.Ctxt, initarray_entry, initfunc)
+       ld.Addaddr(ctxt, initarray_entry, initfunc)
 }
 
 // Preserve highest 8 bits of a, and do addition to lower 24-bit
@@ -109,14 +109,14 @@ func braddoff(a int32, b int32) int32 {
        return int32((uint32(a))&0xff000000 | 0x00ffffff&uint32(a+b))
 }
 
-func adddynrel(s *ld.Symbol, r *ld.Reloc) {
+func adddynrel(ctxt *ld.Link, s *ld.Symbol, r *ld.Reloc) {
        targ := r.Sym
-       ld.Ctxt.Cursym = s
+       ctxt.Cursym = s
 
        switch r.Type {
        default:
                if r.Type >= 256 {
-                       ld.Ctxt.Diag("unexpected relocation type %d", r.Type)
+                       ctxt.Diag("unexpected relocation type %d", r.Type)
                        return
                }
 
@@ -125,8 +125,8 @@ func adddynrel(s *ld.Symbol, r *ld.Reloc) {
                r.Type = obj.R_CALLARM
 
                if targ.Type == obj.SDYNIMPORT {
-                       addpltsym(ld.Ctxt, targ)
-                       r.Sym = ld.Linklookup(ld.Ctxt, ".plt", 0)
+                       addpltsym(ctxt, targ)
+                       r.Sym = ld.Linklookup(ctxt, ".plt", 0)
                        r.Add = int64(braddoff(int32(r.Add), targ.Plt/4))
                }
 
@@ -138,9 +138,9 @@ func adddynrel(s *ld.Symbol, r *ld.Reloc) {
 
        case 256 + ld.R_ARM_GOT32: // R_ARM_GOT_BREL
                if targ.Type != obj.SDYNIMPORT {
-                       addgotsyminternal(ld.Ctxt, targ)
+                       addgotsyminternal(ctxt, targ)
                } else {
-                       addgotsym(ld.Ctxt, targ)
+                       addgotsym(ctxt, targ)
                }
 
                r.Type = obj.R_CONST // write r->add during relocsym
@@ -150,13 +150,13 @@ func adddynrel(s *ld.Symbol, r *ld.Reloc) {
 
        case 256 + ld.R_ARM_GOT_PREL: // GOT(nil) + A - nil
                if targ.Type != obj.SDYNIMPORT {
-                       addgotsyminternal(ld.Ctxt, targ)
+                       addgotsyminternal(ctxt, targ)
                } else {
-                       addgotsym(ld.Ctxt, targ)
+                       addgotsym(ctxt, targ)
                }
 
                r.Type = obj.R_PCREL
-               r.Sym = ld.Linklookup(ld.Ctxt, ".got", 0)
+               r.Sym = ld.Linklookup(ctxt, ".got", 0)
                r.Add += int64(targ.Got) + 4
                return
 
@@ -168,15 +168,15 @@ func adddynrel(s *ld.Symbol, r *ld.Reloc) {
        case 256 + ld.R_ARM_GOTPC: // R_ARM_BASE_PREL
                r.Type = obj.R_PCREL
 
-               r.Sym = ld.Linklookup(ld.Ctxt, ".got", 0)
+               r.Sym = ld.Linklookup(ctxt, ".got", 0)
                r.Add += 4
                return
 
        case 256 + ld.R_ARM_CALL:
                r.Type = obj.R_CALLARM
                if targ.Type == obj.SDYNIMPORT {
-                       addpltsym(ld.Ctxt, targ)
-                       r.Sym = ld.Linklookup(ld.Ctxt, ".plt", 0)
+                       addpltsym(ctxt, targ)
+                       r.Sym = ld.Linklookup(ctxt, ".plt", 0)
                        r.Add = int64(braddoff(int32(r.Add), targ.Plt/4))
                }
 
@@ -190,7 +190,7 @@ func adddynrel(s *ld.Symbol, r *ld.Reloc) {
 
        case 256 + ld.R_ARM_ABS32:
                if targ.Type == obj.SDYNIMPORT {
-                       ld.Ctxt.Diag("unexpected R_ARM_ABS32 relocation for dynamic symbol %s", targ.Name)
+                       ctxt.Diag("unexpected R_ARM_ABS32 relocation for dynamic symbol %s", targ.Name)
                }
                r.Type = obj.R_ADDR
                return
@@ -209,8 +209,8 @@ func adddynrel(s *ld.Symbol, r *ld.Reloc) {
                256 + ld.R_ARM_JUMP24:
                r.Type = obj.R_CALLARM
                if targ.Type == obj.SDYNIMPORT {
-                       addpltsym(ld.Ctxt, targ)
-                       r.Sym = ld.Linklookup(ld.Ctxt, ".plt", 0)
+                       addpltsym(ctxt, targ)
+                       r.Sym = ld.Linklookup(ctxt, ".plt", 0)
                        r.Add = int64(braddoff(int32(r.Add), targ.Plt/4))
                }
 
@@ -224,8 +224,8 @@ func adddynrel(s *ld.Symbol, r *ld.Reloc) {
 
        switch r.Type {
        case obj.R_CALLARM:
-               addpltsym(ld.Ctxt, targ)
-               r.Sym = ld.Linklookup(ld.Ctxt, ".plt", 0)
+               addpltsym(ctxt, targ)
+               r.Sym = ld.Linklookup(ctxt, ".plt", 0)
                r.Add = int64(targ.Plt)
                return
 
@@ -234,21 +234,21 @@ func adddynrel(s *ld.Symbol, r *ld.Reloc) {
                        break
                }
                if ld.Iself {
-                       ld.Adddynsym(ld.Ctxt, targ)
-                       rel := ld.Linklookup(ld.Ctxt, ".rel", 0)
-                       ld.Addaddrplus(ld.Ctxt, rel, s, int64(r.Off))
-                       ld.Adduint32(ld.Ctxt, rel, ld.ELF32_R_INFO(uint32(targ.Dynid), ld.R_ARM_GLOB_DAT)) // we need a nil + A dynamic reloc
-                       r.Type = obj.R_CONST                                                               // write r->add during relocsym
+                       ld.Adddynsym(ctxt, targ)
+                       rel := ld.Linklookup(ctxt, ".rel", 0)
+                       ld.Addaddrplus(ctxt, rel, s, int64(r.Off))
+                       ld.Adduint32(ctxt, rel, ld.ELF32_R_INFO(uint32(targ.Dynid), ld.R_ARM_GLOB_DAT)) // we need a nil + A dynamic reloc
+                       r.Type = obj.R_CONST                                                            // write r->add during relocsym
                        r.Sym = nil
                        return
                }
        }
 
-       ld.Ctxt.Cursym = s
-       ld.Ctxt.Diag("unsupported relocation for dynamic symbol %s (type=%d stype=%d)", targ.Name, r.Type, targ.Type)
+       ctxt.Cursym = s
+       ctxt.Diag("unsupported relocation for dynamic symbol %s (type=%d stype=%d)", targ.Name, r.Type, targ.Type)
 }
 
-func elfreloc1(r *ld.Reloc, sectoff int64) int {
+func elfreloc1(ctxt *ld.Link, r *ld.Reloc, sectoff int64) int {
        ld.Thearch.Lput(uint32(sectoff))
 
        elfsym := r.Xsym.ElfsymForReloc()
@@ -298,41 +298,41 @@ func elfreloc1(r *ld.Reloc, sectoff int64) int {
        return 0
 }
 
-func elfsetupplt() {
-       plt := ld.Linklookup(ld.Ctxt, ".plt", 0)
-       got := ld.Linklookup(ld.Ctxt, ".got.plt", 0)
+func elfsetupplt(ctxt *ld.Link) {
+       plt := ld.Linklookup(ctxt, ".plt", 0)
+       got := ld.Linklookup(ctxt, ".got.plt", 0)
        if plt.Size == 0 {
                // str lr, [sp, #-4]!
-               ld.Adduint32(ld.Ctxt, plt, 0xe52de004)
+               ld.Adduint32(ctxt, plt, 0xe52de004)
 
                // ldr lr, [pc, #4]
-               ld.Adduint32(ld.Ctxt, plt, 0xe59fe004)
+               ld.Adduint32(ctxt, plt, 0xe59fe004)
 
                // add lr, pc, lr
-               ld.Adduint32(ld.Ctxt, plt, 0xe08fe00e)
+               ld.Adduint32(ctxt, plt, 0xe08fe00e)
 
                // ldr pc, [lr, #8]!
-               ld.Adduint32(ld.Ctxt, plt, 0xe5bef008)
+               ld.Adduint32(ctxt, plt, 0xe5bef008)
 
                // .word &GLOBAL_OFFSET_TABLE[0] - .
-               ld.Addpcrelplus(ld.Ctxt, plt, got, 4)
+               ld.Addpcrelplus(ctxt, plt, got, 4)
 
                // the first .plt entry requires 3 .plt.got entries
-               ld.Adduint32(ld.Ctxt, got, 0)
+               ld.Adduint32(ctxt, got, 0)
 
-               ld.Adduint32(ld.Ctxt, got, 0)
-               ld.Adduint32(ld.Ctxt, got, 0)
+               ld.Adduint32(ctxt, got, 0)
+               ld.Adduint32(ctxt, got, 0)
        }
 }
 
-func machoreloc1(r *ld.Reloc, sectoff int64) int {
+func machoreloc1(ctxt *ld.Link, r *ld.Reloc, sectoff int64) int {
        var v uint32
 
        rs := r.Xsym
 
        if r.Type == obj.R_PCREL {
                if rs.Type == obj.SHOSTOBJ {
-                       ld.Ctxt.Diag("pc-relative relocation of external symbol is not supported")
+                       ctxt.Diag("pc-relative relocation of external symbol is not supported")
                        return -1
                }
                if r.Siz != 4 {
@@ -354,15 +354,15 @@ func machoreloc1(r *ld.Reloc, sectoff int64) int {
                o2 |= 2 << 28 // size = 4
 
                ld.Thearch.Lput(o1)
-               ld.Thearch.Lput(uint32(ld.Symaddr(ld.Ctxt, rs)))
+               ld.Thearch.Lput(uint32(ld.Symaddr(ctxt, rs)))
                ld.Thearch.Lput(o2)
-               ld.Thearch.Lput(uint32(ld.Ctxt.Cursym.Value + int64(r.Off)))
+               ld.Thearch.Lput(uint32(ctxt.Cursym.Value + int64(r.Off)))
                return 0
        }
 
        if rs.Type == obj.SHOSTOBJ || r.Type == obj.R_CALLARM {
                if rs.Dynid < 0 {
-                       ld.Ctxt.Diag("reloc %d to non-macho symbol %s type=%d", r.Type, rs.Name, rs.Type)
+                       ctxt.Diag("reloc %d to non-macho symbol %s type=%d", r.Type, rs.Name, rs.Type)
                        return -1
                }
 
@@ -371,7 +371,7 @@ func machoreloc1(r *ld.Reloc, sectoff int64) int {
        } else {
                v = uint32(rs.Sect.Extnum)
                if v == 0 {
-                       ld.Ctxt.Diag("reloc %d to symbol %s in non-macho section %s type=%d", r.Type, rs.Name, rs.Sect.Name, rs.Type)
+                       ctxt.Diag("reloc %d to symbol %s in non-macho section %s type=%d", r.Type, rs.Name, rs.Sect.Name, rs.Type)
                        return -1
                }
        }
@@ -410,8 +410,7 @@ func machoreloc1(r *ld.Reloc, sectoff int64) int {
        return 0
 }
 
-func archreloc(r *ld.Reloc, s *ld.Symbol, val *int64) int {
-       ctxt := ld.Ctxt
+func archreloc(ctxt *ld.Link, r *ld.Reloc, s *ld.Symbol, val *int64) int {
        if ld.Linkmode == ld.LinkExternal {
                switch r.Type {
                case obj.R_CALLARM:
@@ -431,7 +430,7 @@ func archreloc(r *ld.Reloc, s *ld.Symbol, val *int64) int {
                        }
 
                        if rs.Type != obj.SHOSTOBJ && rs.Type != obj.SDYNIMPORT && rs.Sect == nil {
-                               ld.Ctxt.Diag("missing section for %s", rs.Name)
+                               ctxt.Diag("missing section for %s", rs.Name)
                        }
                        r.Xsym = rs
 
@@ -457,25 +456,25 @@ func archreloc(r *ld.Reloc, s *ld.Symbol, val *int64) int {
                return 0
 
        case obj.R_GOTOFF:
-               *val = ld.Symaddr(ctxt, r.Sym) + r.Add - ld.Symaddr(ctxt, ld.Linklookup(ld.Ctxt, ".got", 0))
+               *val = ld.Symaddr(ctxt, r.Sym) + r.Add - ld.Symaddr(ctxt, ld.Linklookup(ctxt, ".got", 0))
                return 0
 
                // The following three arch specific relocations are only for generation of
        // Linux/ARM ELF's PLT entry (3 assembler instruction)
        case obj.R_PLT0: // add ip, pc, #0xXX00000
-               if ld.Symaddr(ctxt, ld.Linklookup(ld.Ctxt, ".got.plt", 0)) < ld.Symaddr(ctxt, ld.Linklookup(ld.Ctxt, ".plt", 0)) {
-                       ld.Ctxt.Diag(".got.plt should be placed after .plt section.")
+               if ld.Symaddr(ctxt, ld.Linklookup(ctxt, ".got.plt", 0)) < ld.Symaddr(ctxt, ld.Linklookup(ctxt, ".plt", 0)) {
+                       ctxt.Diag(".got.plt should be placed after .plt section.")
                }
-               *val = 0xe28fc600 + (0xff & (int64(uint32(ld.Symaddr(ctxt, r.Sym)-(ld.Symaddr(ctxt, ld.Linklookup(ld.Ctxt, ".plt", 0))+int64(r.Off))+r.Add)) >> 20))
+               *val = 0xe28fc600 + (0xff & (int64(uint32(ld.Symaddr(ctxt, r.Sym)-(ld.Symaddr(ctxt, ld.Linklookup(ctxt, ".plt", 0))+int64(r.Off))+r.Add)) >> 20))
                return 0
 
        case obj.R_PLT1: // add ip, ip, #0xYY000
-               *val = 0xe28cca00 + (0xff & (int64(uint32(ld.Symaddr(ctxt, r.Sym)-(ld.Symaddr(ctxt, ld.Linklookup(ld.Ctxt, ".plt", 0))+int64(r.Off))+r.Add+4)) >> 12))
+               *val = 0xe28cca00 + (0xff & (int64(uint32(ld.Symaddr(ctxt, r.Sym)-(ld.Symaddr(ctxt, ld.Linklookup(ctxt, ".plt", 0))+int64(r.Off))+r.Add+4)) >> 12))
 
                return 0
 
        case obj.R_PLT2: // ldr pc, [ip, #0xZZZ]!
-               *val = 0xe5bcf000 + (0xfff & int64(uint32(ld.Symaddr(ctxt, r.Sym)-(ld.Symaddr(ctxt, ld.Linklookup(ld.Ctxt, ".plt", 0))+int64(r.Off))+r.Add+8)))
+               *val = 0xe5bcf000 + (0xfff & int64(uint32(ld.Symaddr(ctxt, r.Sym)-(ld.Symaddr(ctxt, ld.Linklookup(ctxt, ".plt", 0))+int64(r.Off))+r.Add+8)))
 
                return 0
 
@@ -488,7 +487,7 @@ func archreloc(r *ld.Reloc, s *ld.Symbol, val *int64) int {
        return -1
 }
 
-func archrelocvariant(r *ld.Reloc, s *ld.Symbol, t int64) int64 {
+func archrelocvariant(ctxt *ld.Link, r *ld.Reloc, s *ld.Symbol, t int64) int64 {
        log.Fatalf("unexpected relocation variant")
        return t
 }
@@ -520,7 +519,7 @@ func addpltsym(ctxt *ld.Link, s *ld.Symbol) {
                got := ld.Linklookup(ctxt, ".got.plt", 0)
                rel := ld.Linklookup(ctxt, ".rel.plt", 0)
                if plt.Size == 0 {
-                       elfsetupplt()
+                       elfsetupplt(ctxt)
                }
 
                // .got entry
@@ -543,7 +542,7 @@ func addpltsym(ctxt *ld.Link, s *ld.Symbol) {
 
                ld.Adduint32(ctxt, rel, ld.ELF32_R_INFO(uint32(s.Dynid), ld.R_ARM_JUMP_SLOT))
        } else {
-               ld.Ctxt.Diag("addpltsym: unsupported binary format")
+               ctxt.Diag("addpltsym: unsupported binary format")
        }
 }
 
@@ -559,7 +558,7 @@ func addgotsyminternal(ctxt *ld.Link, s *ld.Symbol) {
 
        if ld.Iself {
        } else {
-               ld.Ctxt.Diag("addgotsyminternal: unsupported binary format")
+               ctxt.Diag("addgotsyminternal: unsupported binary format")
        }
 }
 
@@ -578,7 +577,7 @@ func addgotsym(ctxt *ld.Link, s *ld.Symbol) {
                ld.Addaddrplus(ctxt, rel, got, int64(s.Got))
                ld.Adduint32(ctxt, rel, ld.ELF32_R_INFO(uint32(s.Dynid), ld.R_ARM_GLOB_DAT))
        } else {
-               ld.Ctxt.Diag("addgotsym: unsupported binary format")
+               ctxt.Diag("addgotsym: unsupported binary format")
        }
 }
 
@@ -671,7 +670,7 @@ func asmb(ctxt *ld.Link) {
                        ld.Asmplan9sym(ctxt)
                        ld.Cflush()
 
-                       sym := ld.Linklookup(ld.Ctxt, "pclntab", 0)
+                       sym := ld.Linklookup(ctxt, "pclntab", 0)
                        if sym != nil {
                                ld.Lcsize = int32(len(sym.P))
                                for i := 0; int32(i) < ld.Lcsize; i++ {
@@ -688,7 +687,7 @@ func asmb(ctxt *ld.Link) {
                }
        }
 
-       ld.Ctxt.Cursym = nil
+       ctxt.Cursym = nil
        if ld.Debug['v'] != 0 {
                fmt.Fprintf(ld.Bso, "%5.2f header\n", obj.Cputime())
        }
index 3213231b9e260eccffe694c850c74e8ef6e41aa7..1dfd6147ae8e849c47173a446676dacdc6897804 100644 (file)
@@ -78,7 +78,7 @@ func linkarchinit() {
        ld.Thearch.Solarisdynld = "XXX"
 }
 
-func archinit() {
+func archinit(ctxt *ld.Link) {
        // getgoextlinkenabled is based on GO_EXTLINK_ENABLED when
        // Go was built; see ../../make.bash.
        if ld.Linkmode == ld.LinkAuto && obj.Getgoextlinkenabled() == "0" {
@@ -128,7 +128,7 @@ func archinit() {
                obj.Hopenbsd:
                ld.Debug['d'] = 0
                // with dynamic linking
-               ld.Elfinit(ld.Ctxt)
+               ld.Elfinit(ctxt)
                ld.HEADR = ld.ELFRESERVE
                if ld.INITTEXT == -1 {
                        ld.INITTEXT = 0x10000 + int64(ld.HEADR)
@@ -141,7 +141,7 @@ func archinit() {
                }
 
        case obj.Hnacl:
-               ld.Elfinit(ld.Ctxt)
+               ld.Elfinit(ctxt)
                ld.HEADR = 0x10000
                ld.Funcalign = 16
                if ld.INITTEXT == -1 {
index aff1c54c2b84594a0321f480a515d8c1402958a3..6b2835af3ca2ab1d354eb9eca59c4351117573d1 100644 (file)
@@ -38,23 +38,23 @@ import (
        "log"
 )
 
-func gentext() {
+func gentext(ctxt *ld.Link) {
        if !ld.DynlinkingGo() {
                return
        }
-       addmoduledata := ld.Linklookup(ld.Ctxt, "runtime.addmoduledata", 0)
+       addmoduledata := ld.Linklookup(ctxt, "runtime.addmoduledata", 0)
        if addmoduledata.Type == obj.STEXT {
                // we're linking a module containing the runtime -> no need for
                // an init function
                return
        }
        addmoduledata.Attr |= ld.AttrReachable
-       initfunc := ld.Linklookup(ld.Ctxt, "go.link.addmoduledata", 0)
+       initfunc := ld.Linklookup(ctxt, "go.link.addmoduledata", 0)
        initfunc.Type = obj.STEXT
        initfunc.Attr |= ld.AttrLocal
        initfunc.Attr |= ld.AttrReachable
        o := func(op uint32) {
-               ld.Adduint32(ld.Ctxt, initfunc, op)
+               ld.Adduint32(ctxt, initfunc, op)
        }
        // 0000000000000000 <local.dso_init>:
        // 0:   90000000        adrp    x0, 0 <runtime.firstmoduledata>
@@ -66,7 +66,7 @@ func gentext() {
        rel := ld.Addrel(initfunc)
        rel.Off = 0
        rel.Siz = 8
-       rel.Sym = ld.Ctxt.Moduledata
+       rel.Sym = ctxt.Moduledata
        rel.Type = obj.R_ADDRARM64
 
        // 8:   14000000        bl      0 <runtime.addmoduledata>
@@ -75,22 +75,22 @@ func gentext() {
        rel = ld.Addrel(initfunc)
        rel.Off = 8
        rel.Siz = 4
-       rel.Sym = ld.Linklookup(ld.Ctxt, "runtime.addmoduledata", 0)
+       rel.Sym = ld.Linklookup(ctxt, "runtime.addmoduledata", 0)
        rel.Type = obj.R_CALLARM64 // Really should be R_AARCH64_JUMP26 but doesn't seem to make any difference
 
-       ld.Ctxt.Textp = append(ld.Ctxt.Textp, initfunc)
-       initarray_entry := ld.Linklookup(ld.Ctxt, "go.link.addmoduledatainit", 0)
+       ctxt.Textp = append(ctxt.Textp, initfunc)
+       initarray_entry := ld.Linklookup(ctxt, "go.link.addmoduledatainit", 0)
        initarray_entry.Attr |= ld.AttrReachable
        initarray_entry.Attr |= ld.AttrLocal
        initarray_entry.Type = obj.SINITARR
-       ld.Addaddr(ld.Ctxt, initarray_entry, initfunc)
+       ld.Addaddr(ctxt, initarray_entry, initfunc)
 }
 
-func adddynrel(s *ld.Symbol, r *ld.Reloc) {
+func adddynrel(ctxt *ld.Link, s *ld.Symbol, r *ld.Reloc) {
        log.Fatalf("adddynrel not implemented")
 }
 
-func elfreloc1(r *ld.Reloc, sectoff int64) int {
+func elfreloc1(ctxt *ld.Link, r *ld.Reloc, sectoff int64) int {
        ld.Thearch.Vput(uint64(sectoff))
 
        elfsym := r.Xsym.ElfsymForReloc()
@@ -142,12 +142,12 @@ func elfreloc1(r *ld.Reloc, sectoff int64) int {
        return 0
 }
 
-func elfsetupplt() {
+func elfsetupplt(ctxt *ld.Link) {
        // TODO(aram)
        return
 }
 
-func machoreloc1(r *ld.Reloc, sectoff int64) int {
+func machoreloc1(ctxt *ld.Link, r *ld.Reloc, sectoff int64) int {
        var v uint32
 
        rs := r.Xsym
@@ -157,7 +157,7 @@ func machoreloc1(r *ld.Reloc, sectoff int64) int {
        // UNSIGNED relocation at all.
        if rs.Type == obj.SHOSTOBJ || r.Type == obj.R_CALLARM64 || r.Type == obj.R_ADDRARM64 || r.Type == obj.R_ADDR {
                if rs.Dynid < 0 {
-                       ld.Ctxt.Diag("reloc %d to non-macho symbol %s type=%d", r.Type, rs.Name, rs.Type)
+                       ctxt.Diag("reloc %d to non-macho symbol %s type=%d", r.Type, rs.Name, rs.Type)
                        return -1
                }
 
@@ -166,7 +166,7 @@ func machoreloc1(r *ld.Reloc, sectoff int64) int {
        } else {
                v = uint32(rs.Sect.Extnum)
                if v == 0 {
-                       ld.Ctxt.Diag("reloc %d to symbol %s in non-macho section %s type=%d", r.Type, rs.Name, rs.Sect.Name, rs.Type)
+                       ctxt.Diag("reloc %d to symbol %s in non-macho section %s type=%d", r.Type, rs.Name, rs.Sect.Name, rs.Type)
                        return -1
                }
        }
@@ -180,7 +180,7 @@ func machoreloc1(r *ld.Reloc, sectoff int64) int {
 
        case obj.R_CALLARM64:
                if r.Xadd != 0 {
-                       ld.Ctxt.Diag("ld64 doesn't allow BR26 reloc with non-zero addend: %s+%d", rs.Name, r.Xadd)
+                       ctxt.Diag("ld64 doesn't allow BR26 reloc with non-zero addend: %s+%d", rs.Name, r.Xadd)
                }
 
                v |= 1 << 24 // pc-relative bit
@@ -226,8 +226,7 @@ func machoreloc1(r *ld.Reloc, sectoff int64) int {
        return 0
 }
 
-func archreloc(r *ld.Reloc, s *ld.Symbol, val *int64) int {
-       ctxt := ld.Ctxt
+func archreloc(ctxt *ld.Link, r *ld.Reloc, s *ld.Symbol, val *int64) int {
        if ld.Linkmode == ld.LinkExternal {
                switch r.Type {
                default:
@@ -235,7 +234,7 @@ func archreloc(r *ld.Reloc, s *ld.Symbol, val *int64) int {
 
                case obj.R_ARM64_GOTPCREL:
                        var o1, o2 uint32
-                       if ld.Ctxt.Arch.ByteOrder == binary.BigEndian {
+                       if ctxt.Arch.ByteOrder == binary.BigEndian {
                                o1 = uint32(*val >> 32)
                                o2 = uint32(*val)
                        } else {
@@ -252,12 +251,12 @@ func archreloc(r *ld.Reloc, s *ld.Symbol, val *int64) int {
                        // add + R_ADDRARM64.
                        if !(r.Sym.Version != 0 || (r.Sym.Type&obj.SHIDDEN != 0) || r.Sym.Attr.Local()) && r.Sym.Type == obj.STEXT && ld.DynlinkingGo() {
                                if o2&0xffc00000 != 0xf9400000 {
-                                       ld.Ctxt.Diag("R_ARM64_GOTPCREL against unexpected instruction %x", o2)
+                                       ctxt.Diag("R_ARM64_GOTPCREL against unexpected instruction %x", o2)
                                }
                                o2 = 0x91000000 | (o2 & 0x000003ff)
                                r.Type = obj.R_ADDRARM64
                        }
-                       if ld.Ctxt.Arch.ByteOrder == binary.BigEndian {
+                       if ctxt.Arch.ByteOrder == binary.BigEndian {
                                *val = int64(o1)<<32 | int64(o2)
                        } else {
                                *val = int64(o2)<<32 | int64(o1)
@@ -276,7 +275,7 @@ func archreloc(r *ld.Reloc, s *ld.Symbol, val *int64) int {
                        }
 
                        if rs.Type != obj.SHOSTOBJ && rs.Type != obj.SDYNIMPORT && rs.Sect == nil {
-                               ld.Ctxt.Diag("missing section for %s", rs.Name)
+                               ctxt.Diag("missing section for %s", rs.Name)
                        }
                        r.Xsym = rs
 
@@ -288,7 +287,7 @@ func archreloc(r *ld.Reloc, s *ld.Symbol, val *int64) int {
                        if false && ld.HEADTYPE == obj.Hdarwin {
                                var o0, o1 uint32
 
-                               if ld.Ctxt.Arch.ByteOrder == binary.BigEndian {
+                               if ctxt.Arch.ByteOrder == binary.BigEndian {
                                        o0 = uint32(*val >> 32)
                                        o1 = uint32(*val)
                                } else {
@@ -305,7 +304,7 @@ func archreloc(r *ld.Reloc, s *ld.Symbol, val *int64) int {
                                r.Xadd = 0
 
                                // when laid out, the instruction order must always be o1, o2.
-                               if ld.Ctxt.Arch.ByteOrder == binary.BigEndian {
+                               if ctxt.Arch.ByteOrder == binary.BigEndian {
                                        *val = int64(o0)<<32 | int64(o1)
                                } else {
                                        *val = int64(o1)<<32 | int64(o0)
@@ -330,18 +329,18 @@ func archreloc(r *ld.Reloc, s *ld.Symbol, val *int64) int {
                return 0
 
        case obj.R_GOTOFF:
-               *val = ld.Symaddr(ctxt, r.Sym) + r.Add - ld.Symaddr(ctxt, ld.Linklookup(ld.Ctxt, ".got", 0))
+               *val = ld.Symaddr(ctxt, r.Sym) + r.Add - ld.Symaddr(ctxt, ld.Linklookup(ctxt, ".got", 0))
                return 0
 
        case obj.R_ADDRARM64:
                t := ld.Symaddr(ctxt, r.Sym) + r.Add - ((s.Value + int64(r.Off)) &^ 0xfff)
                if t >= 1<<32 || t < -1<<32 {
-                       ld.Ctxt.Diag("program too large, address relocation distance = %d", t)
+                       ctxt.Diag("program too large, address relocation distance = %d", t)
                }
 
                var o0, o1 uint32
 
-               if ld.Ctxt.Arch.ByteOrder == binary.BigEndian {
+               if ctxt.Arch.ByteOrder == binary.BigEndian {
                        o0 = uint32(*val >> 32)
                        o1 = uint32(*val)
                } else {
@@ -353,7 +352,7 @@ func archreloc(r *ld.Reloc, s *ld.Symbol, val *int64) int {
                o1 |= uint32(t&0xfff) << 10
 
                // when laid out, the instruction order must always be o1, o2.
-               if ld.Ctxt.Arch.ByteOrder == binary.BigEndian {
+               if ctxt.Arch.ByteOrder == binary.BigEndian {
                        *val = int64(o0)<<32 | int64(o1)
                } else {
                        *val = int64(o1)<<32 | int64(o0)
@@ -363,13 +362,13 @@ func archreloc(r *ld.Reloc, s *ld.Symbol, val *int64) int {
        case obj.R_ARM64_TLS_LE:
                r.Done = 0
                if ld.HEADTYPE != obj.Hlinux {
-                       ld.Ctxt.Diag("TLS reloc on unsupported OS %s", ld.Headstr(int(ld.HEADTYPE)))
+                       ctxt.Diag("TLS reloc on unsupported OS %s", ld.Headstr(int(ld.HEADTYPE)))
                }
                // The TCB is two pointers. This is not documented anywhere, but is
                // de facto part of the ABI.
                v := r.Sym.Value + int64(2*ld.SysArch.PtrSize)
                if v < 0 || v >= 32678 {
-                       ld.Ctxt.Diag("TLS offset out of range %d", v)
+                       ctxt.Diag("TLS offset out of range %d", v)
                }
                *val |= v << 5
                return 0
@@ -377,7 +376,7 @@ func archreloc(r *ld.Reloc, s *ld.Symbol, val *int64) int {
        case obj.R_CALLARM64:
                t := (ld.Symaddr(ctxt, r.Sym) + r.Add) - (s.Value + int64(r.Off))
                if t >= 1<<27 || t < -1<<27 {
-                       ld.Ctxt.Diag("program too large, call relocation distance = %d", t)
+                       ctxt.Diag("program too large, call relocation distance = %d", t)
                }
                *val |= (t >> 2) & 0x03ffffff
                return 0
@@ -386,7 +385,7 @@ func archreloc(r *ld.Reloc, s *ld.Symbol, val *int64) int {
        return -1
 }
 
-func archrelocvariant(r *ld.Reloc, s *ld.Symbol, t int64) int64 {
+func archrelocvariant(ctxt *ld.Link, r *ld.Reloc, s *ld.Symbol, t int64) int64 {
        log.Fatalf("unexpected relocation variant")
        return -1
 }
@@ -480,7 +479,7 @@ func asmb(ctxt *ld.Link) {
                        ld.Asmplan9sym(ctxt)
                        ld.Cflush()
 
-                       sym := ld.Linklookup(ld.Ctxt, "pclntab", 0)
+                       sym := ld.Linklookup(ctxt, "pclntab", 0)
                        if sym != nil {
                                ld.Lcsize = int32(len(sym.P))
                                for i := 0; int32(i) < ld.Lcsize; i++ {
@@ -497,7 +496,7 @@ func asmb(ctxt *ld.Link) {
                }
        }
 
-       ld.Ctxt.Cursym = nil
+       ctxt.Cursym = nil
        if ld.Debug['v'] != 0 {
                fmt.Fprintf(ld.Bso, "%5.2f header\n", obj.Cputime())
        }
index 136d1d4c7a2c7c9ebc24e5917e5abef192af1a3f..7a10895d88f4cafbfb9ad72c62ab10105558fe70 100644 (file)
@@ -79,7 +79,7 @@ func linkarchinit() {
        ld.Thearch.Solarisdynld = "XXX"
 }
 
-func archinit() {
+func archinit(ctxt *ld.Link) {
        // getgoextlinkenabled is based on GO_EXTLINK_ENABLED when
        // Go was built; see ../../make.bash.
        if ld.Linkmode == ld.LinkAuto && obj.Getgoextlinkenabled() == "0" {
@@ -125,7 +125,7 @@ func archinit() {
                }
 
        case obj.Hlinux: /* arm64 elf */
-               ld.Elfinit(ld.Ctxt)
+               ld.Elfinit(ctxt)
                ld.HEADR = ld.ELFRESERVE
                if ld.INITTEXT == -1 {
                        ld.INITTEXT = 0x10000 + int64(ld.HEADR)
@@ -152,7 +152,7 @@ func archinit() {
                }
 
        case obj.Hnacl:
-               ld.Elfinit(ld.Ctxt)
+               ld.Elfinit(ctxt)
                ld.HEADR = 0x10000
                ld.Funcalign = 16
                if ld.INITTEXT == -1 {
index 848ba619342c1690ecb045ee57721fcf92b971eb..e1cf7dadb77e521d963a7ebb9268f41e0495ec23 100644 (file)
@@ -399,7 +399,7 @@ func relocsym(ctxt *Link, s *Symbol) {
                        case 8:
                                o = int64(ctxt.Arch.ByteOrder.Uint64(s.P[off:]))
                        }
-                       if Thearch.Archreloc(r, s, &o) < 0 {
+                       if Thearch.Archreloc(ctxt, r, s, &o) < 0 {
                                ctxt.Diag("unknown reloc %d", r.Type)
                        }
 
@@ -604,7 +604,7 @@ func relocsym(ctxt *Link, s *Symbol) {
                }
 
                if r.Variant != RV_NONE {
-                       o = Thearch.Archrelocvariant(r, s, o)
+                       o = Thearch.Archrelocvariant(ctxt, r, s, o)
                }
 
                if false {
@@ -717,7 +717,7 @@ func dynrelocsym(ctxt *Link, s *Symbol) {
                        if r.Sym != nil && !r.Sym.Attr.Reachable() {
                                ctxt.Diag("internal inconsistency: dynamic symbol %s is not reachable.", r.Sym.Name)
                        }
-                       Thearch.Adddynrel(s, r)
+                       Thearch.Adddynrel(ctxt, s, r)
                }
        }
 }
index 9de1a2f53230f0d1304ab21a9b1529b3555ca6fb..7862396eae3ff101ca5d6bef0a33efa607a88f59 100644 (file)
@@ -1762,7 +1762,7 @@ func elfrelocsect(ctxt *Link, sect *Section, syms []*Symbol) {
                        if r.Xsym.ElfsymForReloc() == 0 {
                                ctxt.Diag("reloc %d to non-elf symbol %s (outer=%s) %d", r.Type, r.Sym.Name, r.Xsym.Name, r.Sym.Type)
                        }
-                       if Thearch.Elfreloc1(r, int64(uint64(sym.Value+int64(r.Off))-sect.Vaddr)) < 0 {
+                       if Thearch.Elfreloc1(ctxt, r, int64(uint64(sym.Value+int64(r.Off))-sect.Vaddr)) < 0 {
                                ctxt.Diag("unsupported obj reloc %d/%d to %s", r.Type, r.Siz, r.Sym.Name)
                        }
                }
@@ -1990,7 +1990,7 @@ func (ctxt *Link) doelf() {
                        s.Type = obj.SELFRXSECT
                }
 
-               Thearch.Elfsetupplt()
+               Thearch.Elfsetupplt(ctxt)
 
                s = Linklookup(ctxt, elfRelType+".plt", 0)
                s.Attr |= AttrReachable
index d43312b989d3e10ead2c6df1ce58407c948f064d..ada90dee0ae0d4f8bcb14c3a8f85a8df6fc01711 100644 (file)
@@ -95,16 +95,16 @@ type Arch struct {
        Openbsddynld     string
        Dragonflydynld   string
        Solarisdynld     string
-       Adddynrel        func(*Symbol, *Reloc)
-       Archinit         func()
-       Archreloc        func(*Reloc, *Symbol, *int64) int
-       Archrelocvariant func(*Reloc, *Symbol, int64) int64
+       Adddynrel        func(*Link, *Symbol, *Reloc)
+       Archinit         func(*Link)
+       Archreloc        func(*Link, *Reloc, *Symbol, *int64) int
+       Archrelocvariant func(*Link, *Reloc, *Symbol, int64) int64
        Asmb             func(*Link)
-       Elfreloc1        func(*Reloc, int64) int
-       Elfsetupplt      func()
-       Gentext          func()
-       Machoreloc1      func(*Reloc, int64) int
-       PEreloc1         func(*Reloc, int64) bool
+       Elfreloc1        func(*Link, *Reloc, int64) int
+       Elfsetupplt      func(*Link)
+       Gentext          func(*Link)
+       Machoreloc1      func(*Link, *Reloc, int64) int
+       PEreloc1         func(*Link, *Reloc, int64) bool
        Wput             func(uint16)
        Lput             func(uint32)
        Vput             func(uint64)
@@ -209,8 +209,7 @@ var (
        extldflags         string
        extar              string
        libgccfile         string
-       debug_s            int   // backup old value of debug['s']
-       Ctxt               *Link // Global pointer to ctxt used by arch-specific packages
+       debug_s            int // backup old value of debug['s']
        HEADR              int32
        HEADTYPE           int32
        INITRND            int32
index af6bca6a07660d95f31318c53c9b11ac252ba429..724b9482fbf20783fe3ceee2c81e96459b83ea5d 100644 (file)
@@ -841,7 +841,7 @@ func machorelocsect(ctxt *Link, sect *Section, syms []*Symbol) {
                        if r.Done != 0 {
                                continue
                        }
-                       if Thearch.Machoreloc1(r, int64(uint64(sym.Value+int64(r.Off))-sect.Vaddr)) < 0 {
+                       if Thearch.Machoreloc1(ctxt, r, int64(uint64(sym.Value+int64(r.Off))-sect.Vaddr)) < 0 {
                                ctxt.Diag("unsupported obj reloc %d/%d to %s", r.Type, r.Siz, r.Sym.Name)
                        }
                }
index e4bd3ec65eb2b6df4fef80413a3dc6aa64581b9c..2a32a17faf9b3cc2608010505f4ed632c0f83a93 100644 (file)
@@ -806,7 +806,7 @@ func perelocsect(ctxt *Link, sect *Section, syms []*Symbol) int {
                        if r.Xsym.Dynid < 0 {
                                ctxt.Diag("reloc %d to non-coff symbol %s (outer=%s) %d", r.Type, r.Sym.Name, r.Xsym.Name, r.Sym.Type)
                        }
-                       if !Thearch.PEreloc1(r, int64(uint64(sym.Value+int64(r.Off))-PEBASE)) {
+                       if !Thearch.PEreloc1(ctxt, r, int64(uint64(sym.Value+int64(r.Off))-PEBASE)) {
                                ctxt.Diag("unsupported obj reloc %d/%d to %s", r.Type, r.Siz, r.Sym.Name)
                        }
 
index 7ca6ccf8c818756e6826035945e612bdbf8ee2a4..a5b87722d2cdfe5651b712039ca633135e4b1525 100644 (file)
@@ -49,7 +49,6 @@ func Ldmain() {
        Bso = bufio.NewWriter(os.Stdout)
 
        ctxt := linknew(SysArch)
-       Ctxt = ctxt // Export Ctxt because it's currently used by the arch-specific packages
        ctxt.Bso = Bso
 
        Debug = [128]int{}
@@ -158,7 +157,7 @@ func Ldmain() {
                headstring = Headstr(int(HEADTYPE))
        }
 
-       Thearch.Archinit()
+       Thearch.Archinit(ctxt)
 
        if Linkshared && !Iself {
                Exitf("-linkshared can only be used on elf systems")
@@ -202,7 +201,7 @@ func Ldmain() {
                ctxt.dope()
        }
        ctxt.addexport()
-       Thearch.Gentext() // trampolines, call stubs, etc.
+       Thearch.Gentext(ctxt) // trampolines, call stubs, etc.
        ctxt.textbuildid()
        ctxt.textaddress()
        ctxt.pclntab()
index c1e52ee0982532e54033c11bd701973d7aac0a70..cb64dc0d8f7c39bc80482eb0aa480aec696dad8d 100644 (file)
@@ -38,13 +38,13 @@ import (
        "log"
 )
 
-func gentext() {}
+func gentext(ctxt *ld.Link) {}
 
-func adddynrel(s *ld.Symbol, r *ld.Reloc) {
+func adddynrel(ctxt *ld.Link, s *ld.Symbol, r *ld.Reloc) {
        log.Fatalf("adddynrel not implemented")
 }
 
-func elfreloc1(r *ld.Reloc, sectoff int64) int {
+func elfreloc1(ctxt *ld.Link, r *ld.Reloc, sectoff int64) int {
        // mips64 ELF relocation (endian neutral)
        //              offset  uint64
        //              sym             uint32
@@ -93,16 +93,15 @@ func elfreloc1(r *ld.Reloc, sectoff int64) int {
        return 0
 }
 
-func elfsetupplt() {
+func elfsetupplt(ctxt *ld.Link) {
        return
 }
 
-func machoreloc1(r *ld.Reloc, sectoff int64) int {
+func machoreloc1(ctxt *ld.Link, r *ld.Reloc, sectoff int64) int {
        return -1
 }
 
-func archreloc(r *ld.Reloc, s *ld.Symbol, val *int64) int {
-       ctxt := ld.Ctxt
+func archreloc(ctxt *ld.Link, r *ld.Reloc, s *ld.Symbol, val *int64) int {
        if ld.Linkmode == ld.LinkExternal {
                switch r.Type {
                default:
@@ -121,7 +120,7 @@ func archreloc(r *ld.Reloc, s *ld.Symbol, val *int64) int {
                        }
 
                        if rs.Type != obj.SHOSTOBJ && rs.Type != obj.SDYNIMPORT && rs.Sect == nil {
-                               ld.Ctxt.Diag("missing section for %s", rs.Name)
+                               ctxt.Diag("missing section for %s", rs.Name)
                        }
                        r.Xsym = rs
 
@@ -143,7 +142,7 @@ func archreloc(r *ld.Reloc, s *ld.Symbol, val *int64) int {
                return 0
 
        case obj.R_GOTOFF:
-               *val = ld.Symaddr(ctxt, r.Sym) + r.Add - ld.Symaddr(ctxt, ld.Linklookup(ld.Ctxt, ".got", 0))
+               *val = ld.Symaddr(ctxt, r.Sym) + r.Add - ld.Symaddr(ctxt, ld.Linklookup(ctxt, ".got", 0))
                return 0
 
        case obj.R_ADDRMIPS,
@@ -161,7 +160,7 @@ func archreloc(r *ld.Reloc, s *ld.Symbol, val *int64) int {
                // thread pointer is at 0x7000 offset from the start of TLS data area
                t := ld.Symaddr(ctxt, r.Sym) + r.Add - 0x7000
                if t < -32768 || t >= 32678 {
-                       ld.Ctxt.Diag("TLS offset out of range %d", t)
+                       ctxt.Diag("TLS offset out of range %d", t)
                }
                o1 := ld.SysArch.ByteOrder.Uint32(s.P[r.Off:])
                *val = int64(o1&0xffff0000 | uint32(t)&0xffff)
@@ -179,7 +178,7 @@ func archreloc(r *ld.Reloc, s *ld.Symbol, val *int64) int {
        return -1
 }
 
-func archrelocvariant(r *ld.Reloc, s *ld.Symbol, t int64) int64 {
+func archrelocvariant(ctxt *ld.Link, r *ld.Reloc, s *ld.Symbol, t int64) int64 {
        return -1
 }
 
@@ -264,7 +263,7 @@ func asmb(ctxt *ld.Link) {
                        ld.Asmplan9sym(ctxt)
                        ld.Cflush()
 
-                       sym := ld.Linklookup(ld.Ctxt, "pclntab", 0)
+                       sym := ld.Linklookup(ctxt, "pclntab", 0)
                        if sym != nil {
                                ld.Lcsize = int32(len(sym.P))
                                for i := 0; int32(i) < ld.Lcsize; i++ {
@@ -276,7 +275,7 @@ func asmb(ctxt *ld.Link) {
                }
        }
 
-       ld.Ctxt.Cursym = nil
+       ctxt.Cursym = nil
        if ld.Debug['v'] != 0 {
                fmt.Fprintf(ld.Bso, "%5.2f header\n", obj.Cputime())
        }
index ab439ef3f809c7187a9a0c437b4cd21ff557fd03..3d8f8f1c128233596ec0803645647a036f235fbc 100644 (file)
@@ -92,7 +92,7 @@ func linkarchinit() {
        ld.Thearch.Solarisdynld = "XXX"
 }
 
-func archinit() {
+func archinit(ctxt *ld.Link) {
        // getgoextlinkenabled is based on GO_EXTLINK_ENABLED when
        // Go was built; see ../../make.bash.
        if ld.Linkmode == ld.LinkAuto && obj.Getgoextlinkenabled() == "0" {
@@ -130,7 +130,7 @@ func archinit() {
                }
 
        case obj.Hlinux: /* mips64 elf */
-               ld.Elfinit(ld.Ctxt)
+               ld.Elfinit(ctxt)
                ld.HEADR = ld.ELFRESERVE
                if ld.INITTEXT == -1 {
                        ld.INITTEXT = 0x10000 + int64(ld.HEADR)
@@ -143,7 +143,7 @@ func archinit() {
                }
 
        case obj.Hnacl:
-               ld.Elfinit(ld.Ctxt)
+               ld.Elfinit(ctxt)
                ld.HEADR = 0x10000
                ld.Funcalign = 16
                if ld.INITTEXT == -1 {
index f973bdfe999311c8ff4b118840d75869704446db..6237155a52de1645935f14b3159a09091e92bbb9 100644 (file)
@@ -38,7 +38,7 @@ import (
        "log"
 )
 
-func genplt() {
+func genplt(ctxt *ld.Link) {
        // The ppc64 ABI PLT has similar concepts to other
        // architectures, but is laid out quite differently. When we
        // see an R_PPC64_REL24 relocation to a dynamic symbol
@@ -87,7 +87,7 @@ func genplt() {
        //
        // This assumes "case 1" from the ABI, where the caller needs
        // us to save and restore the TOC pointer.
-       for _, s := range ld.Ctxt.Textp {
+       for _, s := range ctxt.Textp {
                for i := range s.R {
                        r := &s.R[i]
                        if r.Type != 256+ld.R_PPC64_REL24 || r.Sym.Type != obj.SDYNIMPORT {
@@ -96,20 +96,20 @@ func genplt() {
 
                        // Reserve PLT entry and generate symbol
                        // resolver
-                       addpltsym(ld.Ctxt, r.Sym)
+                       addpltsym(ctxt, r.Sym)
 
                        // Generate call stub
                        n := fmt.Sprintf("%s.%s", s.Name, r.Sym.Name)
 
-                       stub := ld.Linklookup(ld.Ctxt, n, 0)
+                       stub := ld.Linklookup(ctxt, n, 0)
                        if s.Attr.Reachable() {
                                stub.Attr |= ld.AttrReachable
                        }
                        if stub.Size == 0 {
                                // Need outer to resolve .TOC.
                                stub.Outer = s
-                               ld.Ctxt.Textp = append(ld.Ctxt.Textp, stub)
-                               gencallstub(1, stub, r.Sym)
+                               ctxt.Textp = append(ctxt.Textp, stub)
+                               gencallstub(ctxt, 1, stub, r.Sym)
                        }
 
                        // Update the relocation to use the call stub
@@ -118,29 +118,29 @@ func genplt() {
                        // Restore TOC after bl. The compiler put a
                        // nop here for us to overwrite.
                        const o1 = 0xe8410018 // ld r2,24(r1)
-                       ld.Ctxt.Arch.ByteOrder.PutUint32(s.P[r.Off+4:], o1)
+                       ctxt.Arch.ByteOrder.PutUint32(s.P[r.Off+4:], o1)
                }
        }
 }
 
-func genaddmoduledata() {
-       addmoduledata := ld.Linkrlookup(ld.Ctxt, "runtime.addmoduledata", 0)
+func genaddmoduledata(ctxt *ld.Link) {
+       addmoduledata := ld.Linkrlookup(ctxt, "runtime.addmoduledata", 0)
        if addmoduledata.Type == obj.STEXT {
                return
        }
        addmoduledata.Attr |= ld.AttrReachable
-       initfunc := ld.Linklookup(ld.Ctxt, "go.link.addmoduledata", 0)
+       initfunc := ld.Linklookup(ctxt, "go.link.addmoduledata", 0)
        initfunc.Type = obj.STEXT
        initfunc.Attr |= ld.AttrLocal
        initfunc.Attr |= ld.AttrReachable
        o := func(op uint32) {
-               ld.Adduint32(ld.Ctxt, initfunc, op)
+               ld.Adduint32(ctxt, initfunc, op)
        }
        // addis r2, r12, .TOC.-func@ha
        rel := ld.Addrel(initfunc)
        rel.Off = int32(initfunc.Size)
        rel.Siz = 8
-       rel.Sym = ld.Linklookup(ld.Ctxt, ".TOC.", 0)
+       rel.Sym = ld.Linklookup(ctxt, ".TOC.", 0)
        rel.Type = obj.R_ADDRPOWER_PCREL
        o(0x3c4c0000)
        // addi r2, r2, .TOC.-func@l
@@ -153,7 +153,7 @@ func genaddmoduledata() {
        rel = ld.Addrel(initfunc)
        rel.Off = int32(initfunc.Size)
        rel.Siz = 8
-       rel.Sym = ld.Linklookup(ld.Ctxt, "local.moduledata", 0)
+       rel.Sym = ld.Linklookup(ctxt, "local.moduledata", 0)
        rel.Type = obj.R_ADDRPOWER_GOT
        o(0x3c620000)
        // ld r3, local.moduledata@got@l(r3)
@@ -176,39 +176,39 @@ func genaddmoduledata() {
        // blr
        o(0x4e800020)
 
-       ld.Ctxt.Textp = append(ld.Ctxt.Textp, initfunc)
-       initarray_entry := ld.Linklookup(ld.Ctxt, "go.link.addmoduledatainit", 0)
+       ctxt.Textp = append(ctxt.Textp, initfunc)
+       initarray_entry := ld.Linklookup(ctxt, "go.link.addmoduledatainit", 0)
        initarray_entry.Attr |= ld.AttrReachable
        initarray_entry.Attr |= ld.AttrLocal
        initarray_entry.Type = obj.SINITARR
-       ld.Addaddr(ld.Ctxt, initarray_entry, initfunc)
+       ld.Addaddr(ctxt, initarray_entry, initfunc)
 }
 
-func gentext() {
+func gentext(ctxt *ld.Link) {
        if ld.DynlinkingGo() {
-               genaddmoduledata()
+               genaddmoduledata(ctxt)
        }
 
        if ld.Linkmode == ld.LinkInternal {
-               genplt()
+               genplt(ctxt)
        }
 }
 
 // Construct a call stub in stub that calls symbol targ via its PLT
 // entry.
-func gencallstub(abicase int, stub *ld.Symbol, targ *ld.Symbol) {
+func gencallstub(ctxt *ld.Link, abicase int, stub *ld.Symbol, targ *ld.Symbol) {
        if abicase != 1 {
                // If we see R_PPC64_TOCSAVE or R_PPC64_REL24_NOTOC
                // relocations, we'll need to implement cases 2 and 3.
                log.Fatalf("gencallstub only implements case 1 calls")
        }
 
-       plt := ld.Linklookup(ld.Ctxt, ".plt", 0)
+       plt := ld.Linklookup(ctxt, ".plt", 0)
 
        stub.Type = obj.STEXT
 
        // Save TOC pointer in TOC save slot
-       ld.Adduint32(ld.Ctxt, stub, 0xf8410018) // std r2,24(r1)
+       ld.Adduint32(ctxt, stub, 0xf8410018) // std r2,24(r1)
 
        // Load the function pointer from the PLT.
        r := ld.Addrel(stub)
@@ -217,37 +217,37 @@ func gencallstub(abicase int, stub *ld.Symbol, targ *ld.Symbol) {
        r.Sym = plt
        r.Add = int64(targ.Plt)
        r.Siz = 2
-       if ld.Ctxt.Arch.ByteOrder == binary.BigEndian {
+       if ctxt.Arch.ByteOrder == binary.BigEndian {
                r.Off += int32(r.Siz)
        }
        r.Type = obj.R_POWER_TOC
        r.Variant = ld.RV_POWER_HA
-       ld.Adduint32(ld.Ctxt, stub, 0x3d820000) // addis r12,r2,targ@plt@toc@ha
+       ld.Adduint32(ctxt, stub, 0x3d820000) // addis r12,r2,targ@plt@toc@ha
        r = ld.Addrel(stub)
        r.Off = int32(stub.Size)
        r.Sym = plt
        r.Add = int64(targ.Plt)
        r.Siz = 2
-       if ld.Ctxt.Arch.ByteOrder == binary.BigEndian {
+       if ctxt.Arch.ByteOrder == binary.BigEndian {
                r.Off += int32(r.Siz)
        }
        r.Type = obj.R_POWER_TOC
        r.Variant = ld.RV_POWER_LO
-       ld.Adduint32(ld.Ctxt, stub, 0xe98c0000) // ld r12,targ@plt@toc@l(r12)
+       ld.Adduint32(ctxt, stub, 0xe98c0000) // ld r12,targ@plt@toc@l(r12)
 
        // Jump to the loaded pointer
-       ld.Adduint32(ld.Ctxt, stub, 0x7d8903a6) // mtctr r12
-       ld.Adduint32(ld.Ctxt, stub, 0x4e800420) // bctr
+       ld.Adduint32(ctxt, stub, 0x7d8903a6) // mtctr r12
+       ld.Adduint32(ctxt, stub, 0x4e800420) // bctr
 }
 
-func adddynrel(s *ld.Symbol, r *ld.Reloc) {
+func adddynrel(ctxt *ld.Link, s *ld.Symbol, r *ld.Reloc) {
        targ := r.Sym
-       ld.Ctxt.Cursym = s
+       ctxt.Cursym = s
 
        switch r.Type {
        default:
                if r.Type >= 256 {
-                       ld.Ctxt.Diag("unexpected relocation type %d", r.Type)
+                       ctxt.Diag("unexpected relocation type %d", r.Type)
                        return
                }
 
@@ -264,7 +264,7 @@ func adddynrel(s *ld.Symbol, r *ld.Reloc) {
 
                if targ.Type == obj.SDYNIMPORT {
                        // Should have been handled in elfsetupplt
-                       ld.Ctxt.Diag("unexpected R_PPC64_REL24 for dyn import")
+                       ctxt.Diag("unexpected R_PPC64_REL24 for dyn import")
                }
 
                return
@@ -274,7 +274,7 @@ func adddynrel(s *ld.Symbol, r *ld.Reloc) {
                r.Add += 4
 
                if targ.Type == obj.SDYNIMPORT {
-                       ld.Ctxt.Diag("unexpected R_PPC_REL32 for dyn import")
+                       ctxt.Diag("unexpected R_PPC_REL32 for dyn import")
                }
 
                return
@@ -283,12 +283,12 @@ func adddynrel(s *ld.Symbol, r *ld.Reloc) {
                r.Type = obj.R_ADDR
                if targ.Type == obj.SDYNIMPORT {
                        // These happen in .toc sections
-                       ld.Adddynsym(ld.Ctxt, targ)
+                       ld.Adddynsym(ctxt, targ)
 
-                       rela := ld.Linklookup(ld.Ctxt, ".rela", 0)
-                       ld.Addaddrplus(ld.Ctxt, rela, s, int64(r.Off))
-                       ld.Adduint64(ld.Ctxt, rela, ld.ELF64_R_INFO(uint32(targ.Dynid), ld.R_PPC64_ADDR64))
-                       ld.Adduint64(ld.Ctxt, rela, uint64(r.Add))
+                       rela := ld.Linklookup(ctxt, ".rela", 0)
+                       ld.Addaddrplus(ctxt, rela, s, int64(r.Off))
+                       ld.Adduint64(ctxt, rela, ld.ELF64_R_INFO(uint32(targ.Dynid), ld.R_PPC64_ADDR64))
+                       ld.Adduint64(ctxt, rela, uint64(r.Add))
                        r.Type = 256 // ignore during relocsym
                }
 
@@ -350,10 +350,10 @@ func adddynrel(s *ld.Symbol, r *ld.Reloc) {
 
        // TODO(austin): Translate our relocations to ELF
 
-       ld.Ctxt.Diag("unsupported relocation for dynamic symbol %s (type=%d stype=%d)", targ.Name, r.Type, targ.Type)
+       ctxt.Diag("unsupported relocation for dynamic symbol %s (type=%d stype=%d)", targ.Name, r.Type, targ.Type)
 }
 
-func elfreloc1(r *ld.Reloc, sectoff int64) int {
+func elfreloc1(ctxt *ld.Link, r *ld.Reloc, sectoff int64) int {
        ld.Thearch.Vput(uint64(sectoff))
 
        elfsym := r.Xsym.ElfsymForReloc()
@@ -432,8 +432,8 @@ func elfreloc1(r *ld.Reloc, sectoff int64) int {
        return 0
 }
 
-func elfsetupplt() {
-       plt := ld.Linklookup(ld.Ctxt, ".plt", 0)
+func elfsetupplt(ctxt *ld.Link) {
+       plt := ld.Linklookup(ctxt, ".plt", 0)
        if plt.Size == 0 {
                // The dynamic linker stores the address of the
                // dynamic resolver and the DSO identifier in the two
@@ -443,32 +443,31 @@ func elfsetupplt() {
        }
 }
 
-func machoreloc1(r *ld.Reloc, sectoff int64) int {
+func machoreloc1(ctxt *ld.Link, r *ld.Reloc, sectoff int64) int {
        return -1
 }
 
 // Return the value of .TOC. for symbol s
-func symtoc(s *ld.Symbol) int64 {
+func symtoc(ctxt *ld.Link, s *ld.Symbol) int64 {
        var toc *ld.Symbol
 
        if s.Outer != nil {
-               toc = ld.Linkrlookup(ld.Ctxt, ".TOC.", int(s.Outer.Version))
+               toc = ld.Linkrlookup(ctxt, ".TOC.", int(s.Outer.Version))
        } else {
-               toc = ld.Linkrlookup(ld.Ctxt, ".TOC.", int(s.Version))
+               toc = ld.Linkrlookup(ctxt, ".TOC.", int(s.Version))
        }
 
        if toc == nil {
-               ld.Ctxt.Diag("TOC-relative relocation in object without .TOC.")
+               ctxt.Diag("TOC-relative relocation in object without .TOC.")
                return 0
        }
 
        return toc.Value
 }
 
-func archrelocaddr(r *ld.Reloc, s *ld.Symbol, val *int64) int {
-       ctxt := ld.Ctxt
+func archrelocaddr(ctxt *ld.Link, r *ld.Reloc, s *ld.Symbol, val *int64) int {
        var o1, o2 uint32
-       if ld.Ctxt.Arch.ByteOrder == binary.BigEndian {
+       if ctxt.Arch.ByteOrder == binary.BigEndian {
                o1 = uint32(*val >> 32)
                o2 = uint32(*val)
        } else {
@@ -485,7 +484,7 @@ func archrelocaddr(r *ld.Reloc, s *ld.Symbol, val *int64) int {
 
        t := ld.Symaddr(ctxt, r.Sym) + r.Add
        if t < 0 || t >= 1<<31 {
-               ld.Ctxt.Diag("relocation for %s is too big (>=2G): %d", s.Name, ld.Symaddr(ctxt, r.Sym))
+               ctxt.Diag("relocation for %s is too big (>=2G): %d", s.Name, ld.Symaddr(ctxt, r.Sym))
        }
        if t&0x8000 != 0 {
                t += 0x10000
@@ -499,7 +498,7 @@ func archrelocaddr(r *ld.Reloc, s *ld.Symbol, val *int64) int {
        case obj.R_ADDRPOWER_DS:
                o1 |= (uint32(t) >> 16) & 0xffff
                if t&3 != 0 {
-                       ld.Ctxt.Diag("bad DS reloc for %s: %d", s.Name, ld.Symaddr(ctxt, r.Sym))
+                       ctxt.Diag("bad DS reloc for %s: %d", s.Name, ld.Symaddr(ctxt, r.Sym))
                }
                o2 |= uint32(t) & 0xfffc
 
@@ -507,7 +506,7 @@ func archrelocaddr(r *ld.Reloc, s *ld.Symbol, val *int64) int {
                return -1
        }
 
-       if ld.Ctxt.Arch.ByteOrder == binary.BigEndian {
+       if ctxt.Arch.ByteOrder == binary.BigEndian {
                *val = int64(o1)<<32 | int64(o2)
        } else {
                *val = int64(o2)<<32 | int64(o1)
@@ -515,8 +514,7 @@ func archrelocaddr(r *ld.Reloc, s *ld.Symbol, val *int64) int {
        return 0
 }
 
-func archreloc(r *ld.Reloc, s *ld.Symbol, val *int64) int {
-       ctxt := ld.Ctxt
+func archreloc(ctxt *ld.Link, r *ld.Reloc, s *ld.Symbol, val *int64) int {
        if ld.Linkmode == ld.LinkExternal {
                switch r.Type {
                default:
@@ -546,7 +544,7 @@ func archreloc(r *ld.Reloc, s *ld.Symbol, val *int64) int {
                        }
 
                        if rs.Type != obj.SHOSTOBJ && rs.Type != obj.SDYNIMPORT && rs.Sect == nil {
-                               ld.Ctxt.Diag("missing section for %s", rs.Name)
+                               ctxt.Diag("missing section for %s", rs.Name)
                        }
                        r.Xsym = rs
 
@@ -566,30 +564,30 @@ func archreloc(r *ld.Reloc, s *ld.Symbol, val *int64) int {
                return 0
 
        case obj.R_GOTOFF:
-               *val = ld.Symaddr(ctxt, r.Sym) + r.Add - ld.Symaddr(ctxt, ld.Linklookup(ld.Ctxt, ".got", 0))
+               *val = ld.Symaddr(ctxt, r.Sym) + r.Add - ld.Symaddr(ctxt, ld.Linklookup(ctxt, ".got", 0))
                return 0
 
        case obj.R_ADDRPOWER, obj.R_ADDRPOWER_DS:
-               return archrelocaddr(r, s, val)
+               return archrelocaddr(ctxt, r, s, val)
 
        case obj.R_CALLPOWER:
                // Bits 6 through 29 = (S + A - P) >> 2
 
                t := ld.Symaddr(ctxt, r.Sym) + r.Add - (s.Value + int64(r.Off))
                if t&3 != 0 {
-                       ld.Ctxt.Diag("relocation for %s+%d is not aligned: %d", r.Sym.Name, r.Off, t)
+                       ctxt.Diag("relocation for %s+%d is not aligned: %d", r.Sym.Name, r.Off, t)
                }
                if int64(int32(t<<6)>>6) != t {
                        // TODO(austin) This can happen if text > 32M.
                        // Add a call trampoline to .text in that case.
-                       ld.Ctxt.Diag("relocation for %s+%d is too big: %d", r.Sym.Name, r.Off, t)
+                       ctxt.Diag("relocation for %s+%d is too big: %d", r.Sym.Name, r.Off, t)
                }
 
                *val |= int64(uint32(t) &^ 0xfc000003)
                return 0
 
        case obj.R_POWER_TOC: // S + A - .TOC.
-               *val = ld.Symaddr(ctxt, r.Sym) + r.Add - symtoc(s)
+               *val = ld.Symaddr(ctxt, r.Sym) + r.Add - symtoc(ctxt, s)
 
                return 0
 
@@ -600,7 +598,7 @@ func archreloc(r *ld.Reloc, s *ld.Symbol, val *int64) int {
                // Specification".
                v := r.Sym.Value - 0x7000
                if int64(int16(v)) != v {
-                       ld.Ctxt.Diag("TLS offset out of range %d", v)
+                       ctxt.Diag("TLS offset out of range %d", v)
                }
                *val = (*val &^ 0xffff) | (v & 0xffff)
                return 0
@@ -609,10 +607,10 @@ func archreloc(r *ld.Reloc, s *ld.Symbol, val *int64) int {
        return -1
 }
 
-func archrelocvariant(r *ld.Reloc, s *ld.Symbol, t int64) int64 {
+func archrelocvariant(ctxt *ld.Link, r *ld.Reloc, s *ld.Symbol, t int64) int64 {
        switch r.Variant & ld.RV_TYPE_MASK {
        default:
-               ld.Ctxt.Diag("unexpected relocation variant %d", r.Variant)
+               ctxt.Diag("unexpected relocation variant %d", r.Variant)
                fallthrough
 
        case ld.RV_NONE:
@@ -623,7 +621,7 @@ func archrelocvariant(r *ld.Reloc, s *ld.Symbol, t int64) int64 {
                        // Whether to check for signed or unsigned
                        // overflow depends on the instruction
                        var o1 uint32
-                       if ld.Ctxt.Arch.ByteOrder == binary.BigEndian {
+                       if ctxt.Arch.ByteOrder == binary.BigEndian {
                                o1 = ld.Be32(s.P[r.Off-2:])
                        } else {
                                o1 = ld.Le32(s.P[r.Off:])
@@ -657,7 +655,7 @@ func archrelocvariant(r *ld.Reloc, s *ld.Symbol, t int64) int64 {
                        // Whether to check for signed or unsigned
                        // overflow depends on the instruction
                        var o1 uint32
-                       if ld.Ctxt.Arch.ByteOrder == binary.BigEndian {
+                       if ctxt.Arch.ByteOrder == binary.BigEndian {
                                o1 = ld.Be32(s.P[r.Off-2:])
                        } else {
                                o1 = ld.Le32(s.P[r.Off:])
@@ -681,13 +679,13 @@ func archrelocvariant(r *ld.Reloc, s *ld.Symbol, t int64) int64 {
 
        case ld.RV_POWER_DS:
                var o1 uint32
-               if ld.Ctxt.Arch.ByteOrder == binary.BigEndian {
+               if ctxt.Arch.ByteOrder == binary.BigEndian {
                        o1 = uint32(ld.Be16(s.P[r.Off:]))
                } else {
                        o1 = uint32(ld.Le16(s.P[r.Off:]))
                }
                if t&3 != 0 {
-                       ld.Ctxt.Diag("relocation for %s+%d is not aligned: %d", r.Sym.Name, r.Off, t)
+                       ctxt.Diag("relocation for %s+%d is not aligned: %d", r.Sym.Name, r.Off, t)
                }
                if (r.Variant&ld.RV_CHECK_OVERFLOW != 0) && int64(int16(t)) != t {
                        goto overflow
@@ -696,7 +694,7 @@ func archrelocvariant(r *ld.Reloc, s *ld.Symbol, t int64) int64 {
        }
 
 overflow:
-       ld.Ctxt.Diag("relocation for %s+%d is too big: %d", r.Sym.Name, r.Off, t)
+       ctxt.Diag("relocation for %s+%d is too big: %d", r.Sym.Name, r.Off, t)
        return t
 }
 
@@ -711,11 +709,11 @@ func addpltsym(ctxt *ld.Link, s *ld.Symbol) {
                plt := ld.Linklookup(ctxt, ".plt", 0)
                rela := ld.Linklookup(ctxt, ".rela.plt", 0)
                if plt.Size == 0 {
-                       elfsetupplt()
+                       elfsetupplt(ctxt)
                }
 
                // Create the glink resolver if necessary
-               glink := ensureglinkresolver()
+               glink := ensureglinkresolver(ctxt)
 
                // Write symbol resolver stub (just a branch to the
                // glink resolver stub)
@@ -741,13 +739,13 @@ func addpltsym(ctxt *ld.Link, s *ld.Symbol) {
                ld.Adduint64(ctxt, rela, ld.ELF64_R_INFO(uint32(s.Dynid), ld.R_PPC64_JMP_SLOT))
                ld.Adduint64(ctxt, rela, 0)
        } else {
-               ld.Ctxt.Diag("addpltsym: unsupported binary format")
+               ctxt.Diag("addpltsym: unsupported binary format")
        }
 }
 
 // Generate the glink resolver stub if necessary and return the .glink section
-func ensureglinkresolver() *ld.Symbol {
-       glink := ld.Linklookup(ld.Ctxt, ".glink", 0)
+func ensureglinkresolver(ctxt *ld.Link) *ld.Symbol {
+       glink := ld.Linklookup(ctxt, ".glink", 0)
        if glink.Size != 0 {
                return glink
        }
@@ -759,48 +757,48 @@ func ensureglinkresolver() *ld.Symbol {
        //
        // This stub is PIC, so first get the PC of label 1 into r11.
        // Other things will be relative to this.
-       ld.Adduint32(ld.Ctxt, glink, 0x7c0802a6) // mflr r0
-       ld.Adduint32(ld.Ctxt, glink, 0x429f0005) // bcl 20,31,1f
-       ld.Adduint32(ld.Ctxt, glink, 0x7d6802a6) // 1: mflr r11
-       ld.Adduint32(ld.Ctxt, glink, 0x7c0803a6) // mtlf r0
+       ld.Adduint32(ctxt, glink, 0x7c0802a6) // mflr r0
+       ld.Adduint32(ctxt, glink, 0x429f0005) // bcl 20,31,1f
+       ld.Adduint32(ctxt, glink, 0x7d6802a6) // 1: mflr r11
+       ld.Adduint32(ctxt, glink, 0x7c0803a6) // mtlf r0
 
        // Compute the .plt array index from the entry point address.
        // Because this is PIC, everything is relative to label 1b (in
        // r11):
        //   r0 = ((r12 - r11) - (res_0 - r11)) / 4 = (r12 - res_0) / 4
-       ld.Adduint32(ld.Ctxt, glink, 0x3800ffd0) // li r0,-(res_0-1b)=-48
-       ld.Adduint32(ld.Ctxt, glink, 0x7c006214) // add r0,r0,r12
-       ld.Adduint32(ld.Ctxt, glink, 0x7c0b0050) // sub r0,r0,r11
-       ld.Adduint32(ld.Ctxt, glink, 0x7800f082) // srdi r0,r0,2
+       ld.Adduint32(ctxt, glink, 0x3800ffd0) // li r0,-(res_0-1b)=-48
+       ld.Adduint32(ctxt, glink, 0x7c006214) // add r0,r0,r12
+       ld.Adduint32(ctxt, glink, 0x7c0b0050) // sub r0,r0,r11
+       ld.Adduint32(ctxt, glink, 0x7800f082) // srdi r0,r0,2
 
        // r11 = address of the first byte of the PLT
        r := ld.Addrel(glink)
 
        r.Off = int32(glink.Size)
-       r.Sym = ld.Linklookup(ld.Ctxt, ".plt", 0)
+       r.Sym = ld.Linklookup(ctxt, ".plt", 0)
        r.Siz = 8
        r.Type = obj.R_ADDRPOWER
 
-       ld.Adduint32(ld.Ctxt, glink, 0x3d600000) // addis r11,0,.plt@ha
-       ld.Adduint32(ld.Ctxt, glink, 0x396b0000) // addi r11,r11,.plt@l
+       ld.Adduint32(ctxt, glink, 0x3d600000) // addis r11,0,.plt@ha
+       ld.Adduint32(ctxt, glink, 0x396b0000) // addi r11,r11,.plt@l
 
        // Load r12 = dynamic resolver address and r11 = DSO
        // identifier from the first two doublewords of the PLT.
-       ld.Adduint32(ld.Ctxt, glink, 0xe98b0000) // ld r12,0(r11)
-       ld.Adduint32(ld.Ctxt, glink, 0xe96b0008) // ld r11,8(r11)
+       ld.Adduint32(ctxt, glink, 0xe98b0000) // ld r12,0(r11)
+       ld.Adduint32(ctxt, glink, 0xe96b0008) // ld r11,8(r11)
 
        // Jump to the dynamic resolver
-       ld.Adduint32(ld.Ctxt, glink, 0x7d8903a6) // mtctr r12
-       ld.Adduint32(ld.Ctxt, glink, 0x4e800420) // bctr
+       ld.Adduint32(ctxt, glink, 0x7d8903a6) // mtctr r12
+       ld.Adduint32(ctxt, glink, 0x4e800420) // bctr
 
        // The symbol resolvers must immediately follow.
        //   res_0:
 
        // Add DT_PPC64_GLINK .dynamic entry, which points to 32 bytes
        // before the first symbol resolver stub.
-       s := ld.Linklookup(ld.Ctxt, ".dynamic", 0)
+       s := ld.Linklookup(ctxt, ".dynamic", 0)
 
-       ld.Elfwritedynentsymplus(ld.Ctxt, s, ld.DT_PPC64_GLINK, glink, glink.Size-32)
+       ld.Elfwritedynentsymplus(ctxt, s, ld.DT_PPC64_GLINK, glink, glink.Size-32)
 
        return glink
 }
@@ -886,7 +884,7 @@ func asmb(ctxt *ld.Link) {
                        ld.Asmplan9sym(ctxt)
                        ld.Cflush()
 
-                       sym := ld.Linklookup(ld.Ctxt, "pclntab", 0)
+                       sym := ld.Linklookup(ctxt, "pclntab", 0)
                        if sym != nil {
                                ld.Lcsize = int32(len(sym.P))
                                for i := 0; int32(i) < ld.Lcsize; i++ {
@@ -898,7 +896,7 @@ func asmb(ctxt *ld.Link) {
                }
        }
 
-       ld.Ctxt.Cursym = nil
+       ctxt.Cursym = nil
        if ld.Debug['v'] != 0 {
                fmt.Fprintf(ld.Bso, "%5.2f header\n", obj.Cputime())
        }
index 608e9f65aaa081dba6a934a73f8eff88e861bf58..c4e6ba58e35576c0d10fce9afee70b3c6eef837e 100644 (file)
@@ -93,7 +93,7 @@ func linkarchinit() {
        ld.Thearch.Solarisdynld = "XXX"
 }
 
-func archinit() {
+func archinit(ctxt *ld.Link) {
        // getgoextlinkenabled is based on GO_EXTLINK_ENABLED when
        // Go was built; see ../../make.bash.
        if ld.Linkmode == ld.LinkAuto && obj.Getgoextlinkenabled() == "0" {
@@ -110,7 +110,7 @@ func archinit() {
        }
 
        if ld.Linkmode == ld.LinkExternal {
-               toc := ld.Linklookup(ld.Ctxt, ".TOC.", 0)
+               toc := ld.Linklookup(ctxt, ".TOC.", 0)
                toc.Type = obj.SDYNIMPORT
        }
 
@@ -148,7 +148,7 @@ func archinit() {
                if ld.SysArch == sys.ArchPPC64 {
                        ld.Debug['d'] = 1 // TODO(austin): ELF ABI v1 not supported yet
                }
-               ld.Elfinit(ld.Ctxt)
+               ld.Elfinit(ctxt)
                ld.HEADR = ld.ELFRESERVE
                if ld.INITTEXT == -1 {
                        ld.INITTEXT = 0x10000 + int64(ld.HEADR)
@@ -161,7 +161,7 @@ func archinit() {
                }
 
        case obj.Hnacl:
-               ld.Elfinit(ld.Ctxt)
+               ld.Elfinit(ctxt)
                ld.HEADR = 0x10000
                ld.Funcalign = 16
                if ld.INITTEXT == -1 {
index cd65537e3cfc1c597b725c83d8b1dee35fdc1a0a..52bc3ec99c0c8311cf97436e53197159fe38e0ff 100644 (file)
@@ -47,72 +47,72 @@ import (
 //     undef
 //
 // The job of appending the moduledata is delegated to runtime.addmoduledata.
-func gentext() {
+func gentext(ctxt *ld.Link) {
        if !ld.DynlinkingGo() {
                return
        }
-       addmoduledata := ld.Linklookup(ld.Ctxt, "runtime.addmoduledata", 0)
+       addmoduledata := ld.Linklookup(ctxt, "runtime.addmoduledata", 0)
        if addmoduledata.Type == obj.STEXT {
                // we're linking a module containing the runtime -> no need for
                // an init function
                return
        }
        addmoduledata.Attr |= ld.AttrReachable
-       initfunc := ld.Linklookup(ld.Ctxt, "go.link.addmoduledata", 0)
+       initfunc := ld.Linklookup(ctxt, "go.link.addmoduledata", 0)
        initfunc.Type = obj.STEXT
        initfunc.Attr |= ld.AttrLocal
        initfunc.Attr |= ld.AttrReachable
 
        // larl %r2, <local.moduledata>
-       ld.Adduint8(ld.Ctxt, initfunc, 0xc0)
-       ld.Adduint8(ld.Ctxt, initfunc, 0x20)
+       ld.Adduint8(ctxt, initfunc, 0xc0)
+       ld.Adduint8(ctxt, initfunc, 0x20)
        lmd := ld.Addrel(initfunc)
        lmd.Off = int32(initfunc.Size)
        lmd.Siz = 4
-       lmd.Sym = ld.Ctxt.Moduledata
+       lmd.Sym = ctxt.Moduledata
        lmd.Type = obj.R_PCREL
        lmd.Variant = ld.RV_390_DBL
        lmd.Add = 2 + int64(lmd.Siz)
-       ld.Adduint32(ld.Ctxt, initfunc, 0)
+       ld.Adduint32(ctxt, initfunc, 0)
 
        // jg <runtime.addmoduledata[@plt]>
-       ld.Adduint8(ld.Ctxt, initfunc, 0xc0)
-       ld.Adduint8(ld.Ctxt, initfunc, 0xf4)
+       ld.Adduint8(ctxt, initfunc, 0xc0)
+       ld.Adduint8(ctxt, initfunc, 0xf4)
        rel := ld.Addrel(initfunc)
        rel.Off = int32(initfunc.Size)
        rel.Siz = 4
-       rel.Sym = ld.Linklookup(ld.Ctxt, "runtime.addmoduledata", 0)
+       rel.Sym = ld.Linklookup(ctxt, "runtime.addmoduledata", 0)
        rel.Type = obj.R_CALL
        rel.Variant = ld.RV_390_DBL
        rel.Add = 2 + int64(rel.Siz)
-       ld.Adduint32(ld.Ctxt, initfunc, 0)
+       ld.Adduint32(ctxt, initfunc, 0)
 
        // undef (for debugging)
-       ld.Adduint32(ld.Ctxt, initfunc, 0)
+       ld.Adduint32(ctxt, initfunc, 0)
 
-       ld.Ctxt.Textp = append(ld.Ctxt.Textp, initfunc)
-       initarray_entry := ld.Linklookup(ld.Ctxt, "go.link.addmoduledatainit", 0)
+       ctxt.Textp = append(ctxt.Textp, initfunc)
+       initarray_entry := ld.Linklookup(ctxt, "go.link.addmoduledatainit", 0)
        initarray_entry.Attr |= ld.AttrLocal
        initarray_entry.Attr |= ld.AttrReachable
        initarray_entry.Type = obj.SINITARR
-       ld.Addaddr(ld.Ctxt, initarray_entry, initfunc)
+       ld.Addaddr(ctxt, initarray_entry, initfunc)
 }
 
-func adddynrel(s *ld.Symbol, r *ld.Reloc) {
+func adddynrel(ctxt *ld.Link, s *ld.Symbol, r *ld.Reloc) {
        targ := r.Sym
-       ld.Ctxt.Cursym = s
+       ctxt.Cursym = s
 
        switch r.Type {
        default:
                if r.Type >= 256 {
-                       ld.Ctxt.Diag("unexpected relocation type %d", r.Type)
+                       ctxt.Diag("unexpected relocation type %d", r.Type)
                        return
                }
 
                // Handle relocations found in ELF object files.
        case 256 + ld.R_390_12,
                256 + ld.R_390_GOT12:
-               ld.Ctxt.Diag("s390x 12-bit relocations have not been implemented (relocation type %d)", r.Type-256)
+               ctxt.Diag("s390x 12-bit relocations have not been implemented (relocation type %d)", r.Type-256)
                return
 
        case 256 + ld.R_390_8,
@@ -120,7 +120,7 @@ func adddynrel(s *ld.Symbol, r *ld.Reloc) {
                256 + ld.R_390_32,
                256 + ld.R_390_64:
                if targ.Type == obj.SDYNIMPORT {
-                       ld.Ctxt.Diag("unexpected R_390_nn relocation for dynamic symbol %s", targ.Name)
+                       ctxt.Diag("unexpected R_390_nn relocation for dynamic symbol %s", targ.Name)
                }
                r.Type = obj.R_ADDR
                return
@@ -129,10 +129,10 @@ func adddynrel(s *ld.Symbol, r *ld.Reloc) {
                256 + ld.R_390_PC32,
                256 + ld.R_390_PC64:
                if targ.Type == obj.SDYNIMPORT {
-                       ld.Ctxt.Diag("unexpected R_390_PCnn relocation for dynamic symbol %s", targ.Name)
+                       ctxt.Diag("unexpected R_390_PCnn relocation for dynamic symbol %s", targ.Name)
                }
                if targ.Type == 0 || targ.Type == obj.SXREF {
-                       ld.Ctxt.Diag("unknown symbol %s in pcrel", targ.Name)
+                       ctxt.Diag("unknown symbol %s in pcrel", targ.Name)
                }
                r.Type = obj.R_PCREL
                r.Add += int64(r.Siz)
@@ -141,7 +141,7 @@ func adddynrel(s *ld.Symbol, r *ld.Reloc) {
        case 256 + ld.R_390_GOT16,
                256 + ld.R_390_GOT32,
                256 + ld.R_390_GOT64:
-               ld.Ctxt.Diag("unimplemented S390x relocation: %v", r.Type-256)
+               ctxt.Diag("unimplemented S390x relocation: %v", r.Type-256)
                return
 
        case 256 + ld.R_390_PLT16DBL,
@@ -150,8 +150,8 @@ func adddynrel(s *ld.Symbol, r *ld.Reloc) {
                r.Variant = ld.RV_390_DBL
                r.Add += int64(r.Siz)
                if targ.Type == obj.SDYNIMPORT {
-                       addpltsym(ld.Ctxt, targ)
-                       r.Sym = ld.Linklookup(ld.Ctxt, ".plt", 0)
+                       addpltsym(ctxt, targ)
+                       r.Sym = ld.Linklookup(ctxt, ".plt", 0)
                        r.Add += int64(targ.Plt)
                }
                return
@@ -161,34 +161,34 @@ func adddynrel(s *ld.Symbol, r *ld.Reloc) {
                r.Type = obj.R_PCREL
                r.Add += int64(r.Siz)
                if targ.Type == obj.SDYNIMPORT {
-                       addpltsym(ld.Ctxt, targ)
-                       r.Sym = ld.Linklookup(ld.Ctxt, ".plt", 0)
+                       addpltsym(ctxt, targ)
+                       r.Sym = ld.Linklookup(ctxt, ".plt", 0)
                        r.Add += int64(targ.Plt)
                }
                return
 
        case 256 + ld.R_390_COPY:
-               ld.Ctxt.Diag("unimplemented S390x relocation: %v", r.Type-256)
+               ctxt.Diag("unimplemented S390x relocation: %v", r.Type-256)
 
        case 256 + ld.R_390_GLOB_DAT:
-               ld.Ctxt.Diag("unimplemented S390x relocation: %v", r.Type-256)
+               ctxt.Diag("unimplemented S390x relocation: %v", r.Type-256)
 
        case 256 + ld.R_390_JMP_SLOT:
-               ld.Ctxt.Diag("unimplemented S390x relocation: %v", r.Type-256)
+               ctxt.Diag("unimplemented S390x relocation: %v", r.Type-256)
 
        case 256 + ld.R_390_RELATIVE:
-               ld.Ctxt.Diag("unimplemented S390x relocation: %v", r.Type-256)
+               ctxt.Diag("unimplemented S390x relocation: %v", r.Type-256)
 
        case 256 + ld.R_390_GOTOFF:
                if targ.Type == obj.SDYNIMPORT {
-                       ld.Ctxt.Diag("unexpected R_390_GOTOFF relocation for dynamic symbol %s", targ.Name)
+                       ctxt.Diag("unexpected R_390_GOTOFF relocation for dynamic symbol %s", targ.Name)
                }
                r.Type = obj.R_GOTOFF
                return
 
        case 256 + ld.R_390_GOTPC:
                r.Type = obj.R_PCREL
-               r.Sym = ld.Linklookup(ld.Ctxt, ".got", 0)
+               r.Sym = ld.Linklookup(ctxt, ".got", 0)
                r.Add += int64(r.Siz)
                return
 
@@ -198,23 +198,23 @@ func adddynrel(s *ld.Symbol, r *ld.Reloc) {
                r.Variant = ld.RV_390_DBL
                r.Add += int64(r.Siz)
                if targ.Type == obj.SDYNIMPORT {
-                       ld.Ctxt.Diag("unexpected R_390_PCnnDBL relocation for dynamic symbol %s", targ.Name)
+                       ctxt.Diag("unexpected R_390_PCnnDBL relocation for dynamic symbol %s", targ.Name)
                }
                return
 
        case 256 + ld.R_390_GOTPCDBL:
                r.Type = obj.R_PCREL
                r.Variant = ld.RV_390_DBL
-               r.Sym = ld.Linklookup(ld.Ctxt, ".got", 0)
+               r.Sym = ld.Linklookup(ctxt, ".got", 0)
                r.Add += int64(r.Siz)
                return
 
        case 256 + ld.R_390_GOTENT:
-               addgotsym(targ)
+               addgotsym(ctxt, targ)
 
                r.Type = obj.R_PCREL
                r.Variant = ld.RV_390_DBL
-               r.Sym = ld.Linklookup(ld.Ctxt, ".got", 0)
+               r.Sym = ld.Linklookup(ctxt, ".got", 0)
                r.Add += int64(targ.Got)
                r.Add += int64(r.Siz)
                return
@@ -224,10 +224,10 @@ func adddynrel(s *ld.Symbol, r *ld.Reloc) {
                return
        }
 
-       ld.Ctxt.Diag("unsupported relocation for dynamic symbol %s (type=%d stype=%d)", targ.Name, r.Type, targ.Type)
+       ctxt.Diag("unsupported relocation for dynamic symbol %s (type=%d stype=%d)", targ.Name, r.Type, targ.Type)
 }
 
-func elfreloc1(r *ld.Reloc, sectoff int64) int {
+func elfreloc1(ctxt *ld.Link, r *ld.Reloc, sectoff int64) int {
        ld.Thearch.Vput(uint64(sectoff))
 
        elfsym := r.Xsym.ElfsymForReloc()
@@ -326,62 +326,61 @@ func elfreloc1(r *ld.Reloc, sectoff int64) int {
        return 0
 }
 
-func elfsetupplt() {
-       plt := ld.Linklookup(ld.Ctxt, ".plt", 0)
-       got := ld.Linklookup(ld.Ctxt, ".got", 0)
+func elfsetupplt(ctxt *ld.Link) {
+       plt := ld.Linklookup(ctxt, ".plt", 0)
+       got := ld.Linklookup(ctxt, ".got", 0)
        if plt.Size == 0 {
                // stg     %r1,56(%r15)
-               ld.Adduint8(ld.Ctxt, plt, 0xe3)
-               ld.Adduint8(ld.Ctxt, plt, 0x10)
-               ld.Adduint8(ld.Ctxt, plt, 0xf0)
-               ld.Adduint8(ld.Ctxt, plt, 0x38)
-               ld.Adduint8(ld.Ctxt, plt, 0x00)
-               ld.Adduint8(ld.Ctxt, plt, 0x24)
+               ld.Adduint8(ctxt, plt, 0xe3)
+               ld.Adduint8(ctxt, plt, 0x10)
+               ld.Adduint8(ctxt, plt, 0xf0)
+               ld.Adduint8(ctxt, plt, 0x38)
+               ld.Adduint8(ctxt, plt, 0x00)
+               ld.Adduint8(ctxt, plt, 0x24)
                // larl    %r1,_GLOBAL_OFFSET_TABLE_
-               ld.Adduint8(ld.Ctxt, plt, 0xc0)
-               ld.Adduint8(ld.Ctxt, plt, 0x10)
-               ld.Addpcrelplus(ld.Ctxt, plt, got, 6)
+               ld.Adduint8(ctxt, plt, 0xc0)
+               ld.Adduint8(ctxt, plt, 0x10)
+               ld.Addpcrelplus(ctxt, plt, got, 6)
                // mvc     48(8,%r15),8(%r1)
-               ld.Adduint8(ld.Ctxt, plt, 0xd2)
-               ld.Adduint8(ld.Ctxt, plt, 0x07)
-               ld.Adduint8(ld.Ctxt, plt, 0xf0)
-               ld.Adduint8(ld.Ctxt, plt, 0x30)
-               ld.Adduint8(ld.Ctxt, plt, 0x10)
-               ld.Adduint8(ld.Ctxt, plt, 0x08)
+               ld.Adduint8(ctxt, plt, 0xd2)
+               ld.Adduint8(ctxt, plt, 0x07)
+               ld.Adduint8(ctxt, plt, 0xf0)
+               ld.Adduint8(ctxt, plt, 0x30)
+               ld.Adduint8(ctxt, plt, 0x10)
+               ld.Adduint8(ctxt, plt, 0x08)
                // lg      %r1,16(%r1)
-               ld.Adduint8(ld.Ctxt, plt, 0xe3)
-               ld.Adduint8(ld.Ctxt, plt, 0x10)
-               ld.Adduint8(ld.Ctxt, plt, 0x10)
-               ld.Adduint8(ld.Ctxt, plt, 0x10)
-               ld.Adduint8(ld.Ctxt, plt, 0x00)
-               ld.Adduint8(ld.Ctxt, plt, 0x04)
+               ld.Adduint8(ctxt, plt, 0xe3)
+               ld.Adduint8(ctxt, plt, 0x10)
+               ld.Adduint8(ctxt, plt, 0x10)
+               ld.Adduint8(ctxt, plt, 0x10)
+               ld.Adduint8(ctxt, plt, 0x00)
+               ld.Adduint8(ctxt, plt, 0x04)
                // br      %r1
-               ld.Adduint8(ld.Ctxt, plt, 0x07)
-               ld.Adduint8(ld.Ctxt, plt, 0xf1)
+               ld.Adduint8(ctxt, plt, 0x07)
+               ld.Adduint8(ctxt, plt, 0xf1)
                // nopr    %r0
-               ld.Adduint8(ld.Ctxt, plt, 0x07)
-               ld.Adduint8(ld.Ctxt, plt, 0x00)
+               ld.Adduint8(ctxt, plt, 0x07)
+               ld.Adduint8(ctxt, plt, 0x00)
                // nopr    %r0
-               ld.Adduint8(ld.Ctxt, plt, 0x07)
-               ld.Adduint8(ld.Ctxt, plt, 0x00)
+               ld.Adduint8(ctxt, plt, 0x07)
+               ld.Adduint8(ctxt, plt, 0x00)
                // nopr    %r0
-               ld.Adduint8(ld.Ctxt, plt, 0x07)
-               ld.Adduint8(ld.Ctxt, plt, 0x00)
+               ld.Adduint8(ctxt, plt, 0x07)
+               ld.Adduint8(ctxt, plt, 0x00)
 
                // assume got->size == 0 too
-               ld.Addaddrplus(ld.Ctxt, got, ld.Linklookup(ld.Ctxt, ".dynamic", 0), 0)
+               ld.Addaddrplus(ctxt, got, ld.Linklookup(ctxt, ".dynamic", 0), 0)
 
-               ld.Adduint64(ld.Ctxt, got, 0)
-               ld.Adduint64(ld.Ctxt, got, 0)
+               ld.Adduint64(ctxt, got, 0)
+               ld.Adduint64(ctxt, got, 0)
        }
 }
 
-func machoreloc1(r *ld.Reloc, sectoff int64) int {
+func machoreloc1(ctxt *ld.Link, r *ld.Reloc, sectoff int64) int {
        return -1
 }
 
-func archreloc(r *ld.Reloc, s *ld.Symbol, val *int64) int {
-       ctxt := ld.Ctxt
+func archreloc(ctxt *ld.Link, r *ld.Reloc, s *ld.Symbol, val *int64) int {
        if ld.Linkmode == ld.LinkExternal {
                return -1
        }
@@ -392,17 +391,17 @@ func archreloc(r *ld.Reloc, s *ld.Symbol, val *int64) int {
                return 0
 
        case obj.R_GOTOFF:
-               *val = ld.Symaddr(ctxt, r.Sym) + r.Add - ld.Symaddr(ctxt, ld.Linklookup(ld.Ctxt, ".got", 0))
+               *val = ld.Symaddr(ctxt, r.Sym) + r.Add - ld.Symaddr(ctxt, ld.Linklookup(ctxt, ".got", 0))
                return 0
        }
 
        return -1
 }
 
-func archrelocvariant(r *ld.Reloc, s *ld.Symbol, t int64) int64 {
+func archrelocvariant(ctxt *ld.Link, r *ld.Reloc, s *ld.Symbol, t int64) int64 {
        switch r.Variant & ld.RV_TYPE_MASK {
        default:
-               ld.Ctxt.Diag("unexpected relocation variant %d", r.Variant)
+               ctxt.Diag("unexpected relocation variant %d", r.Variant)
                return t
 
        case ld.RV_NONE:
@@ -410,7 +409,7 @@ func archrelocvariant(r *ld.Reloc, s *ld.Symbol, t int64) int64 {
 
        case ld.RV_390_DBL:
                if (t & 1) != 0 {
-                       ld.Ctxt.Diag("%s+%v is not 2-byte aligned", r.Sym.Name, r.Sym.Value)
+                       ctxt.Diag("%s+%v is not 2-byte aligned", r.Sym.Name, r.Sym.Value)
                }
                return t >> 1
        }
@@ -428,7 +427,7 @@ func addpltsym(ctxt *ld.Link, s *ld.Symbol) {
                got := ld.Linklookup(ctxt, ".got", 0)
                rela := ld.Linklookup(ctxt, ".rela.plt", 0)
                if plt.Size == 0 {
-                       elfsetupplt()
+                       elfsetupplt(ctxt)
                }
                // larl    %r1,_GLOBAL_OFFSET_TABLE_+index
 
@@ -475,27 +474,27 @@ func addpltsym(ctxt *ld.Link, s *ld.Symbol) {
                s.Plt = int32(plt.Size - 32)
 
        } else {
-               ld.Ctxt.Diag("addpltsym: unsupported binary format")
+               ctxt.Diag("addpltsym: unsupported binary format")
        }
 }
 
-func addgotsym(s *ld.Symbol) {
+func addgotsym(ctxt *ld.Link, s *ld.Symbol) {
        if s.Got >= 0 {
                return
        }
 
-       ld.Adddynsym(ld.Ctxt, s)
-       got := ld.Linklookup(ld.Ctxt, ".got", 0)
+       ld.Adddynsym(ctxt, s)
+       got := ld.Linklookup(ctxt, ".got", 0)
        s.Got = int32(got.Size)
-       ld.Adduint64(ld.Ctxt, got, 0)
+       ld.Adduint64(ctxt, got, 0)
 
        if ld.Iself {
-               rela := ld.Linklookup(ld.Ctxt, ".rela", 0)
-               ld.Addaddrplus(ld.Ctxt, rela, got, int64(s.Got))
-               ld.Adduint64(ld.Ctxt, rela, ld.ELF64_R_INFO(uint32(s.Dynid), ld.R_390_GLOB_DAT))
-               ld.Adduint64(ld.Ctxt, rela, 0)
+               rela := ld.Linklookup(ctxt, ".rela", 0)
+               ld.Addaddrplus(ctxt, rela, got, int64(s.Got))
+               ld.Adduint64(ctxt, rela, ld.ELF64_R_INFO(uint32(s.Dynid), ld.R_390_GLOB_DAT))
+               ld.Adduint64(ctxt, rela, 0)
        } else {
-               ld.Ctxt.Diag("addgotsym: unsupported binary format")
+               ctxt.Diag("addgotsym: unsupported binary format")
        }
 }
 
@@ -545,7 +544,7 @@ func asmb(ctxt *ld.Link) {
        symo := uint32(0)
        if ld.Debug['s'] == 0 {
                if !ld.Iself {
-                       ld.Ctxt.Diag("unsupported executable format")
+                       ctxt.Diag("unsupported executable format")
                }
                if ld.Debug['v'] != 0 {
                        fmt.Fprintf(ld.Bso, "%5.2f sym\n", obj.Cputime())
@@ -571,7 +570,7 @@ func asmb(ctxt *ld.Link) {
                }
        }
 
-       ld.Ctxt.Cursym = nil
+       ctxt.Cursym = nil
        if ld.Debug['v'] != 0 {
                fmt.Fprintf(ld.Bso, "%5.2f header\n", obj.Cputime())
        }
@@ -579,7 +578,7 @@ func asmb(ctxt *ld.Link) {
        ld.Cseek(0)
        switch ld.HEADTYPE {
        default:
-               ld.Ctxt.Diag("unsupported operating system")
+               ctxt.Diag("unsupported operating system")
        case obj.Hlinux:
                ld.Asmbelf(ctxt, int64(symo))
        }
index bf9bdbc5e1973a4c6f3f84caebf66ea311d74137..119e32beb42054f4e6959dbd3f8b3634f7d61fa2 100644 (file)
@@ -79,7 +79,7 @@ func linkarchinit() {
        ld.Thearch.Solarisdynld = "XXX"
 }
 
-func archinit() {
+func archinit(ctxt *ld.Link) {
        // getgoextlinkenabled is based on GO_EXTLINK_ENABLED when
        // Go was built; see ../../make.bash.
        if ld.Linkmode == ld.LinkAuto && obj.Getgoextlinkenabled() == "0" {
@@ -95,7 +95,7 @@ func archinit() {
                ld.Exitf("unknown -H option: %v", ld.HEADTYPE)
 
        case obj.Hlinux: // s390x ELF
-               ld.Elfinit(ld.Ctxt)
+               ld.Elfinit(ctxt)
                ld.HEADR = ld.ELFRESERVE
                if ld.INITTEXT == -1 {
                        ld.INITTEXT = 0x10000 + int64(ld.HEADR)
index 26c1650a0c059d89973b9cb7097c02cccac50517..a0722e5f0134a9e7724ffd7e19f33856817a3e75 100644 (file)
@@ -50,7 +50,7 @@ func addcall(ctxt *ld.Link, s *ld.Symbol, t *ld.Symbol) {
        r.Siz = 4
 }
 
-func gentext() {
+func gentext(ctxt *ld.Link) {
        if !ld.DynlinkingGo() && ld.Buildmode != ld.BuildmodePIE && ld.Buildmode != ld.BuildmodeCShared {
                return
        }
@@ -69,13 +69,13 @@ func gentext() {
                {"si", 6},
                {"di", 7},
        } {
-               thunkfunc := ld.Linklookup(ld.Ctxt, "__x86.get_pc_thunk."+r.name, 0)
+               thunkfunc := ld.Linklookup(ctxt, "__x86.get_pc_thunk."+r.name, 0)
                thunkfunc.Type = obj.STEXT
                thunkfunc.Attr |= ld.AttrLocal
                thunkfunc.Attr |= ld.AttrReachable //TODO: remove?
                o := func(op ...uint8) {
                        for _, op1 := range op {
-                               ld.Adduint8(ld.Ctxt, thunkfunc, op1)
+                               ld.Adduint8(ctxt, thunkfunc, op1)
                        }
                }
                // 8b 04 24     mov    (%esp),%eax
@@ -84,10 +84,10 @@ func gentext() {
                // c3           ret
                o(0xc3)
 
-               ld.Ctxt.Textp = append(ld.Ctxt.Textp, thunkfunc)
+               ctxt.Textp = append(ctxt.Textp, thunkfunc)
        }
 
-       addmoduledata := ld.Linklookup(ld.Ctxt, "runtime.addmoduledata", 0)
+       addmoduledata := ld.Linklookup(ctxt, "runtime.addmoduledata", 0)
        if addmoduledata.Type == obj.STEXT {
                // we're linking a module containing the runtime -> no need for
                // an init function
@@ -96,20 +96,20 @@ func gentext() {
 
        addmoduledata.Attr |= ld.AttrReachable
 
-       initfunc := ld.Linklookup(ld.Ctxt, "go.link.addmoduledata", 0)
+       initfunc := ld.Linklookup(ctxt, "go.link.addmoduledata", 0)
        initfunc.Type = obj.STEXT
        initfunc.Attr |= ld.AttrLocal
        initfunc.Attr |= ld.AttrReachable
        o := func(op ...uint8) {
                for _, op1 := range op {
-                       ld.Adduint8(ld.Ctxt, initfunc, op1)
+                       ld.Adduint8(ctxt, initfunc, op1)
                }
        }
 
        // go.link.addmoduledata:
        //      53                      push %ebx
        //      e8 00 00 00 00          call __x86.get_pc_thunk.cx + R_CALL __x86.get_pc_thunk.cx
-       //      8d 81 00 00 00 00       lea 0x0(%ecx), %eax + R_PCREL ld.Ctxt.Moduledata
+       //      8d 81 00 00 00 00       lea 0x0(%ecx), %eax + R_PCREL ctxt.Moduledata
        //      8d 99 00 00 00 00       lea 0x0(%ecx), %ebx + R_GOTPC _GLOBAL_OFFSET_TABLE_
        //      e8 00 00 00 00          call runtime.addmoduledata@plt + R_CALL runtime.addmoduledata
        //      5b                      pop %ebx
@@ -118,55 +118,55 @@ func gentext() {
        o(0x53)
 
        o(0xe8)
-       addcall(ld.Ctxt, initfunc, ld.Linklookup(ld.Ctxt, "__x86.get_pc_thunk.cx", 0))
+       addcall(ctxt, initfunc, ld.Linklookup(ctxt, "__x86.get_pc_thunk.cx", 0))
 
        o(0x8d, 0x81)
-       ld.Addpcrelplus(ld.Ctxt, initfunc, ld.Ctxt.Moduledata, 6)
+       ld.Addpcrelplus(ctxt, initfunc, ctxt.Moduledata, 6)
 
        o(0x8d, 0x99)
        i := initfunc.Size
        initfunc.Size += 4
-       ld.Symgrow(ld.Ctxt, initfunc, initfunc.Size)
+       ld.Symgrow(ctxt, initfunc, initfunc.Size)
        r := ld.Addrel(initfunc)
-       r.Sym = ld.Linklookup(ld.Ctxt, "_GLOBAL_OFFSET_TABLE_", 0)
+       r.Sym = ld.Linklookup(ctxt, "_GLOBAL_OFFSET_TABLE_", 0)
        r.Off = int32(i)
        r.Type = obj.R_PCREL
        r.Add = 12
        r.Siz = 4
 
        o(0xe8)
-       addcall(ld.Ctxt, initfunc, addmoduledata)
+       addcall(ctxt, initfunc, addmoduledata)
 
        o(0x5b)
 
        o(0xc3)
 
-       ld.Ctxt.Textp = append(ld.Ctxt.Textp, initfunc)
-       initarray_entry := ld.Linklookup(ld.Ctxt, "go.link.addmoduledatainit", 0)
+       ctxt.Textp = append(ctxt.Textp, initfunc)
+       initarray_entry := ld.Linklookup(ctxt, "go.link.addmoduledatainit", 0)
        initarray_entry.Attr |= ld.AttrReachable
        initarray_entry.Attr |= ld.AttrLocal
        initarray_entry.Type = obj.SINITARR
-       ld.Addaddr(ld.Ctxt, initarray_entry, initfunc)
+       ld.Addaddr(ctxt, initarray_entry, initfunc)
 }
 
-func adddynrel(s *ld.Symbol, r *ld.Reloc) {
+func adddynrel(ctxt *ld.Link, s *ld.Symbol, r *ld.Reloc) {
        targ := r.Sym
-       ld.Ctxt.Cursym = s
+       ctxt.Cursym = s
 
        switch r.Type {
        default:
                if r.Type >= 256 {
-                       ld.Ctxt.Diag("unexpected relocation type %d", r.Type)
+                       ctxt.Diag("unexpected relocation type %d", r.Type)
                        return
                }
 
                // Handle relocations found in ELF object files.
        case 256 + ld.R_386_PC32:
                if targ.Type == obj.SDYNIMPORT {
-                       ld.Ctxt.Diag("unexpected R_386_PC32 relocation for dynamic symbol %s", targ.Name)
+                       ctxt.Diag("unexpected R_386_PC32 relocation for dynamic symbol %s", targ.Name)
                }
                if targ.Type == 0 || targ.Type == obj.SXREF {
-                       ld.Ctxt.Diag("unknown symbol %s in pcrel", targ.Name)
+                       ctxt.Diag("unknown symbol %s in pcrel", targ.Name)
                }
                r.Type = obj.R_PCREL
                r.Add += 4
@@ -176,8 +176,8 @@ func adddynrel(s *ld.Symbol, r *ld.Reloc) {
                r.Type = obj.R_PCREL
                r.Add += 4
                if targ.Type == obj.SDYNIMPORT {
-                       addpltsym(ld.Ctxt, targ)
-                       r.Sym = ld.Linklookup(ld.Ctxt, ".plt", 0)
+                       addpltsym(ctxt, targ)
+                       r.Sym = ld.Linklookup(ctxt, ".plt", 0)
                        r.Add += int64(targ.Plt)
                }
 
@@ -204,11 +204,11 @@ func adddynrel(s *ld.Symbol, r *ld.Reloc) {
                                return
                        }
 
-                       ld.Ctxt.Diag("unexpected GOT reloc for non-dynamic symbol %s", targ.Name)
+                       ctxt.Diag("unexpected GOT reloc for non-dynamic symbol %s", targ.Name)
                        return
                }
 
-               addgotsym(ld.Ctxt, targ)
+               addgotsym(ctxt, targ)
                r.Type = obj.R_CONST // write r->add during relocsym
                r.Sym = nil
                r.Add += int64(targ.Got)
@@ -220,13 +220,13 @@ func adddynrel(s *ld.Symbol, r *ld.Reloc) {
 
        case 256 + ld.R_386_GOTPC:
                r.Type = obj.R_PCREL
-               r.Sym = ld.Linklookup(ld.Ctxt, ".got", 0)
+               r.Sym = ld.Linklookup(ctxt, ".got", 0)
                r.Add += 4
                return
 
        case 256 + ld.R_386_32:
                if targ.Type == obj.SDYNIMPORT {
-                       ld.Ctxt.Diag("unexpected R_386_32 relocation for dynamic symbol %s", targ.Name)
+                       ctxt.Diag("unexpected R_386_32 relocation for dynamic symbol %s", targ.Name)
                }
                r.Type = obj.R_ADDR
                return
@@ -234,14 +234,14 @@ func adddynrel(s *ld.Symbol, r *ld.Reloc) {
        case 512 + ld.MACHO_GENERIC_RELOC_VANILLA*2 + 0:
                r.Type = obj.R_ADDR
                if targ.Type == obj.SDYNIMPORT {
-                       ld.Ctxt.Diag("unexpected reloc for dynamic symbol %s", targ.Name)
+                       ctxt.Diag("unexpected reloc for dynamic symbol %s", targ.Name)
                }
                return
 
        case 512 + ld.MACHO_GENERIC_RELOC_VANILLA*2 + 1:
                if targ.Type == obj.SDYNIMPORT {
-                       addpltsym(ld.Ctxt, targ)
-                       r.Sym = ld.Linklookup(ld.Ctxt, ".plt", 0)
+                       addpltsym(ctxt, targ)
+                       r.Sym = ld.Linklookup(ctxt, ".plt", 0)
                        r.Add = int64(targ.Plt)
                        r.Type = obj.R_PCREL
                        return
@@ -255,7 +255,7 @@ func adddynrel(s *ld.Symbol, r *ld.Reloc) {
                        // have symbol
                        // turn MOVL of GOT entry into LEAL of symbol itself
                        if r.Off < 2 || s.P[r.Off-2] != 0x8b {
-                               ld.Ctxt.Diag("unexpected GOT reloc for non-dynamic symbol %s", targ.Name)
+                               ctxt.Diag("unexpected GOT reloc for non-dynamic symbol %s", targ.Name)
                                return
                        }
 
@@ -264,8 +264,8 @@ func adddynrel(s *ld.Symbol, r *ld.Reloc) {
                        return
                }
 
-               addgotsym(ld.Ctxt, targ)
-               r.Sym = ld.Linklookup(ld.Ctxt, ".got", 0)
+               addgotsym(ctxt, targ)
+               r.Sym = ld.Linklookup(ctxt, ".got", 0)
                r.Add += int64(targ.Got)
                r.Type = obj.R_PCREL
                return
@@ -279,8 +279,8 @@ func adddynrel(s *ld.Symbol, r *ld.Reloc) {
        switch r.Type {
        case obj.R_CALL,
                obj.R_PCREL:
-               addpltsym(ld.Ctxt, targ)
-               r.Sym = ld.Linklookup(ld.Ctxt, ".plt", 0)
+               addpltsym(ctxt, targ)
+               r.Sym = ld.Linklookup(ctxt, ".plt", 0)
                r.Add = int64(targ.Plt)
                return
 
@@ -289,10 +289,10 @@ func adddynrel(s *ld.Symbol, r *ld.Reloc) {
                        break
                }
                if ld.Iself {
-                       ld.Adddynsym(ld.Ctxt, targ)
-                       rel := ld.Linklookup(ld.Ctxt, ".rel", 0)
-                       ld.Addaddrplus(ld.Ctxt, rel, s, int64(r.Off))
-                       ld.Adduint32(ld.Ctxt, rel, ld.ELF32_R_INFO(uint32(targ.Dynid), ld.R_386_32))
+                       ld.Adddynsym(ctxt, targ)
+                       rel := ld.Linklookup(ctxt, ".rel", 0)
+                       ld.Addaddrplus(ctxt, rel, s, int64(r.Off))
+                       ld.Adduint32(ctxt, rel, ld.ELF32_R_INFO(uint32(targ.Dynid), ld.R_386_32))
                        r.Type = obj.R_CONST // write r->add during relocsym
                        r.Sym = nil
                        return
@@ -309,16 +309,16 @@ func adddynrel(s *ld.Symbol, r *ld.Reloc) {
                        // just in case the C code assigns to the variable,
                        // and of course it only works for single pointers,
                        // but we only need to support cgo and that's all it needs.
-                       ld.Adddynsym(ld.Ctxt, targ)
+                       ld.Adddynsym(ctxt, targ)
 
-                       got := ld.Linklookup(ld.Ctxt, ".got", 0)
+                       got := ld.Linklookup(ctxt, ".got", 0)
                        s.Type = got.Type | obj.SSUB
                        s.Outer = got
                        s.Sub = got.Sub
                        got.Sub = s
                        s.Value = got.Size
-                       ld.Adduint32(ld.Ctxt, got, 0)
-                       ld.Adduint32(ld.Ctxt, ld.Linklookup(ld.Ctxt, ".linkedit.got", 0), uint32(targ.Dynid))
+                       ld.Adduint32(ctxt, got, 0)
+                       ld.Adduint32(ctxt, ld.Linklookup(ctxt, ".linkedit.got", 0), uint32(targ.Dynid))
                        r.Type = 256 // ignore during relocsym
                        return
                }
@@ -329,11 +329,11 @@ func adddynrel(s *ld.Symbol, r *ld.Reloc) {
                }
        }
 
-       ld.Ctxt.Cursym = s
-       ld.Ctxt.Diag("unsupported relocation for dynamic symbol %s (type=%d stype=%d)", targ.Name, r.Type, targ.Type)
+       ctxt.Cursym = s
+       ctxt.Diag("unsupported relocation for dynamic symbol %s (type=%d stype=%d)", targ.Name, r.Type, targ.Type)
 }
 
-func elfreloc1(r *ld.Reloc, sectoff int64) int {
+func elfreloc1(ctxt *ld.Link, r *ld.Reloc, sectoff int64) int {
        ld.Thearch.Lput(uint32(sectoff))
 
        elfsym := r.Xsym.ElfsymForReloc()
@@ -397,14 +397,14 @@ func elfreloc1(r *ld.Reloc, sectoff int64) int {
        return 0
 }
 
-func machoreloc1(r *ld.Reloc, sectoff int64) int {
+func machoreloc1(ctxt *ld.Link, r *ld.Reloc, sectoff int64) int {
        var v uint32
 
        rs := r.Xsym
 
        if rs.Type == obj.SHOSTOBJ {
                if rs.Dynid < 0 {
-                       ld.Ctxt.Diag("reloc %d to non-macho symbol %s type=%d", r.Type, rs.Name, rs.Type)
+                       ctxt.Diag("reloc %d to non-macho symbol %s type=%d", r.Type, rs.Name, rs.Type)
                        return -1
                }
 
@@ -413,7 +413,7 @@ func machoreloc1(r *ld.Reloc, sectoff int64) int {
        } else {
                v = uint32(rs.Sect.Extnum)
                if v == 0 {
-                       ld.Ctxt.Diag("reloc %d to symbol %s in non-macho section %s type=%d", r.Type, rs.Name, rs.Sect.Name, rs.Type)
+                       ctxt.Diag("reloc %d to symbol %s in non-macho section %s type=%d", r.Type, rs.Name, rs.Sect.Name, rs.Type)
                        return -1
                }
        }
@@ -453,13 +453,13 @@ func machoreloc1(r *ld.Reloc, sectoff int64) int {
        return 0
 }
 
-func pereloc1(r *ld.Reloc, sectoff int64) bool {
+func pereloc1(ctxt *ld.Link, r *ld.Reloc, sectoff int64) bool {
        var v uint32
 
        rs := r.Xsym
 
        if rs.Dynid < 0 {
-               ld.Ctxt.Diag("reloc %d to non-coff symbol %s type=%d", r.Type, rs.Name, rs.Type)
+               ctxt.Diag("reloc %d to non-coff symbol %s type=%d", r.Type, rs.Name, rs.Type)
                return false
        }
 
@@ -483,7 +483,7 @@ func pereloc1(r *ld.Reloc, sectoff int64) bool {
        return true
 }
 
-func archreloc(r *ld.Reloc, s *ld.Symbol, val *int64) int {
+func archreloc(ctxt *ld.Link, r *ld.Reloc, s *ld.Symbol, val *int64) int {
        if ld.Linkmode == ld.LinkExternal {
                return -1
        }
@@ -493,42 +493,42 @@ func archreloc(r *ld.Reloc, s *ld.Symbol, val *int64) int {
                return 0
 
        case obj.R_GOTOFF:
-               *val = ld.Symaddr(ld.Ctxt, r.Sym) + r.Add - ld.Symaddr(ld.Ctxt, ld.Linklookup(ld.Ctxt, ".got", 0))
+               *val = ld.Symaddr(ctxt, r.Sym) + r.Add - ld.Symaddr(ctxt, ld.Linklookup(ctxt, ".got", 0))
                return 0
        }
 
        return -1
 }
 
-func archrelocvariant(r *ld.Reloc, s *ld.Symbol, t int64) int64 {
+func archrelocvariant(ctxt *ld.Link, r *ld.Reloc, s *ld.Symbol, t int64) int64 {
        log.Fatalf("unexpected relocation variant")
        return t
 }
 
-func elfsetupplt() {
-       plt := ld.Linklookup(ld.Ctxt, ".plt", 0)
-       got := ld.Linklookup(ld.Ctxt, ".got.plt", 0)
+func elfsetupplt(ctxt *ld.Link) {
+       plt := ld.Linklookup(ctxt, ".plt", 0)
+       got := ld.Linklookup(ctxt, ".got.plt", 0)
        if plt.Size == 0 {
                // pushl got+4
-               ld.Adduint8(ld.Ctxt, plt, 0xff)
+               ld.Adduint8(ctxt, plt, 0xff)
 
-               ld.Adduint8(ld.Ctxt, plt, 0x35)
-               ld.Addaddrplus(ld.Ctxt, plt, got, 4)
+               ld.Adduint8(ctxt, plt, 0x35)
+               ld.Addaddrplus(ctxt, plt, got, 4)
 
                // jmp *got+8
-               ld.Adduint8(ld.Ctxt, plt, 0xff)
+               ld.Adduint8(ctxt, plt, 0xff)
 
-               ld.Adduint8(ld.Ctxt, plt, 0x25)
-               ld.Addaddrplus(ld.Ctxt, plt, got, 8)
+               ld.Adduint8(ctxt, plt, 0x25)
+               ld.Addaddrplus(ctxt, plt, got, 8)
 
                // zero pad
-               ld.Adduint32(ld.Ctxt, plt, 0)
+               ld.Adduint32(ctxt, plt, 0)
 
                // assume got->size == 0 too
-               ld.Addaddrplus(ld.Ctxt, got, ld.Linklookup(ld.Ctxt, ".dynamic", 0), 0)
+               ld.Addaddrplus(ctxt, got, ld.Linklookup(ctxt, ".dynamic", 0), 0)
 
-               ld.Adduint32(ld.Ctxt, got, 0)
-               ld.Adduint32(ld.Ctxt, got, 0)
+               ld.Adduint32(ctxt, got, 0)
+               ld.Adduint32(ctxt, got, 0)
        }
 }
 
@@ -544,7 +544,7 @@ func addpltsym(ctxt *ld.Link, s *ld.Symbol) {
                got := ld.Linklookup(ctxt, ".got.plt", 0)
                rel := ld.Linklookup(ctxt, ".rel.plt", 0)
                if plt.Size == 0 {
-                       elfsetupplt()
+                       elfsetupplt(ctxt)
                }
 
                // jmpq *got+size
@@ -588,7 +588,7 @@ func addpltsym(ctxt *ld.Link, s *ld.Symbol) {
                ld.Adduint8(ctxt, plt, 0x25)
                ld.Addaddrplus(ctxt, plt, ld.Linklookup(ctxt, ".got", 0), int64(s.Got))
        } else {
-               ld.Ctxt.Diag("addpltsym: unsupported binary format")
+               ctxt.Diag("addpltsym: unsupported binary format")
        }
 }
 
@@ -609,7 +609,7 @@ func addgotsym(ctxt *ld.Link, s *ld.Symbol) {
        } else if ld.HEADTYPE == obj.Hdarwin {
                ld.Adduint32(ctxt, ld.Linklookup(ctxt, ".linkedit.got", 0), uint32(s.Dynid))
        } else {
-               ld.Ctxt.Diag("addgotsym: unsupported binary format")
+               ctxt.Diag("addgotsym: unsupported binary format")
        }
 }
 
index dea8c6411f4a06f1913d879db9711745db01ac08..f1b0fb7e8ce8d3b21b1071547da2a78ae94d6735 100644 (file)
@@ -78,7 +78,7 @@ func linkarchinit() {
        ld.Thearch.Solarisdynld = "/lib/ld.so.1"
 }
 
-func archinit() {
+func archinit(ctxt *ld.Link) {
        // getgoextlinkenabled is based on GO_EXTLINK_ENABLED when
        // Go was built; see ../../make.bash.
        if ld.Linkmode == ld.LinkAuto && obj.Getgoextlinkenabled() == "0" {
@@ -87,7 +87,7 @@ func archinit() {
 
        if ld.Buildmode == ld.BuildmodeCShared || ld.Buildmode == ld.BuildmodePIE || ld.DynlinkingGo() {
                ld.Linkmode = ld.LinkExternal
-               got := ld.Linklookup(ld.Ctxt, "_GLOBAL_OFFSET_TABLE_", 0)
+               got := ld.Linklookup(ctxt, "_GLOBAL_OFFSET_TABLE_", 0)
                got.Type = obj.SDYNIMPORT
                got.Attr |= ld.AttrReachable
        }
@@ -145,7 +145,7 @@ func archinit() {
                obj.Hfreebsd,
                obj.Hnetbsd,
                obj.Hopenbsd:
-               ld.Elfinit(ld.Ctxt)
+               ld.Elfinit(ctxt)
 
                ld.HEADR = ld.ELFRESERVE
                if ld.INITTEXT == -1 {
@@ -159,7 +159,7 @@ func archinit() {
                }
 
        case obj.Hnacl:
-               ld.Elfinit(ld.Ctxt)
+               ld.Elfinit(ctxt)
                ld.HEADR = 0x10000
                ld.Funcalign = 32
                if ld.INITTEXT == -1 {
@@ -173,7 +173,7 @@ func archinit() {
                }
 
        case obj.Hwindows: /* PE executable */
-               ld.Peinit(ld.Ctxt)
+               ld.Peinit(ctxt)
 
                ld.HEADR = ld.PEFILEHEADR
                if ld.INITTEXT == -1 {