]> Cypherpunks repositories - gostls13.git/commitdiff
[dev.link] cmd/link: add Target and ArchSyms to arch functions
authorJeremy Faller <jeremy@golang.org>
Wed, 4 Mar 2020 20:27:47 +0000 (15:27 -0500)
committerJeremy Faller <jeremy@golang.org>
Wed, 11 Mar 2020 14:30:54 +0000 (14:30 +0000)
Change-Id: Iab9e5bd8115e81a10067e44397cbe34addda1b63
Reviewed-on: https://go-review.googlesource.com/c/go/+/222064
Run-TryBot: Jeremy Faller <jeremy@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Than McIntosh <thanm@google.com>
12 files changed:
src/cmd/link/internal/amd64/asm.go
src/cmd/link/internal/arm/asm.go
src/cmd/link/internal/arm64/asm.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/mips/asm.go
src/cmd/link/internal/mips64/asm.go
src/cmd/link/internal/ppc64/asm.go
src/cmd/link/internal/riscv64/asm.go
src/cmd/link/internal/s390x/asm.go
src/cmd/link/internal/x86/asm.go

index de5a96507f9aefd0a521af06933e0e76a9b40fcb..34eb6f10018e9899065bf03ef2474ba1aafacd02 100644 (file)
@@ -106,7 +106,7 @@ func makeWritable(s *sym.Symbol) {
        }
 }
 
-func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool {
+func adddynrel(ctxt *ld.Link, target *ld.Target, syms *ld.ArchSyms, s *sym.Symbol, r *sym.Reloc) bool {
        targ := r.Sym
 
        switch r.Type {
@@ -572,7 +572,7 @@ func archrelocvariant(target *ld.Target, syms *ld.ArchSyms, r *sym.Reloc, s *sym
        return t
 }
 
-func elfsetupplt(ctxt *ld.Link) {
+func elfsetupplt(ctxt *ld.Link, target *ld.Target, syms *ld.ArchSyms) {
        plt := ctxt.Syms.Lookup(".plt", 0)
        got := ctxt.Syms.Lookup(".got.plt", 0)
        if plt.Size == 0 {
@@ -611,7 +611,7 @@ func addpltsym(ctxt *ld.Link, s *sym.Symbol) {
                got := ctxt.Syms.Lookup(".got.plt", 0)
                rela := ctxt.Syms.Lookup(".rela.plt", 0)
                if plt.Size == 0 {
-                       elfsetupplt(ctxt)
+                       elfsetupplt(ctxt, &ctxt.Target, &ctxt.ArchSyms)
                }
 
                // jmpq *got+size(IP)
index 233383432419ade97ae6e0715ff002fc26b9c2a7..56c0a5c6649e7a90d163e5b4f6df2ab393c4ae38 100644 (file)
@@ -115,7 +115,7 @@ func braddoff(a int32, b int32) int32 {
        return int32((uint32(a))&0xff000000 | 0x00ffffff&uint32(a+b))
 }
 
-func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool {
+func adddynrel(ctxt *ld.Link, target *ld.Target, syms *ld.ArchSyms, s *sym.Symbol, r *sym.Reloc) bool {
        targ := r.Sym
 
        switch r.Type {
@@ -300,7 +300,7 @@ func elfreloc1(ctxt *ld.Link, r *sym.Reloc, sectoff int64) bool {
        return true
 }
 
-func elfsetupplt(ctxt *ld.Link) {
+func elfsetupplt(ctxt *ld.Link, target *ld.Target, syms *ld.ArchSyms) {
        plt := ctxt.Syms.Lookup(".plt", 0)
        got := ctxt.Syms.Lookup(".got.plt", 0)
        if plt.Size == 0 {
@@ -697,7 +697,7 @@ func addpltsym(ctxt *ld.Link, s *sym.Symbol) {
                got := ctxt.Syms.Lookup(".got.plt", 0)
                rel := ctxt.Syms.Lookup(".rel.plt", 0)
                if plt.Size == 0 {
-                       elfsetupplt(ctxt)
+                       elfsetupplt(ctxt, &ctxt.Target, &ctxt.ArchSyms)
                }
 
                // .got entry
index 33a1c851b69dea7057707b8c9fcd2fe418651ce1..0e5da99b974fca2ff33ced27dad8571921401328 100644 (file)
@@ -91,7 +91,7 @@ func gentext(ctxt *ld.Link) {
        initarray_entry.AddAddr(ctxt.Arch, initfunc)
 }
 
-func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool {
+func adddynrel(ctxt *ld.Link, target *ld.Target, syms *ld.ArchSyms, s *sym.Symbol, r *sym.Reloc) bool {
        targ := r.Sym
 
        switch r.Type {
@@ -711,7 +711,7 @@ func archrelocvariant(target *ld.Target, syms *ld.ArchSyms, r *sym.Reloc, s *sym
        return -1
 }
 
-func elfsetupplt(ctxt *ld.Link) {
+func elfsetupplt(ctxt *ld.Link, target *ld.Target, syms *ld.ArchSyms) {
        plt := ctxt.Syms.Lookup(".plt", 0)
        gotplt := ctxt.Syms.Lookup(".got.plt", 0)
        if plt.Size == 0 {
@@ -767,7 +767,7 @@ func addpltsym(ctxt *ld.Link, s *sym.Symbol) {
                gotplt := ctxt.Syms.Lookup(".got.plt", 0)
                rela := ctxt.Syms.Lookup(".rela.plt", 0)
                if plt.Size == 0 {
-                       elfsetupplt(ctxt)
+                       elfsetupplt(ctxt, &ctxt.Target, &ctxt.ArchSyms)
                }
 
                // adrp    x16, &got.plt[0]
index 4b1975dcd9ec5426029ec201a7583b82f51a5278..39ec054ab3d3cd7f4dae619008ed8690e8036e01 100644 (file)
@@ -665,13 +665,15 @@ func (ctxt *Link) windynrelocsyms() {
 }
 
 func dynrelocsym(ctxt *Link, s *sym.Symbol) {
+       target := &ctxt.Target
+       syms := &ctxt.ArchSyms
        for ri := range s.R {
                r := &s.R[ri]
                if ctxt.BuildMode == BuildModePIE && ctxt.LinkMode == LinkInternal {
                        // It's expected that some relocations will be done
                        // later by relocsym (R_TLS_LE, R_ADDROFF), so
                        // don't worry if Adddynrel returns false.
-                       thearch.Adddynrel(ctxt, s, r)
+                       thearch.Adddynrel(ctxt, target, syms, s, r)
                        continue
                }
 
@@ -679,7 +681,7 @@ func dynrelocsym(ctxt *Link, s *sym.Symbol) {
                        if r.Sym != nil && !r.Sym.Attr.Reachable() {
                                Errorf(s, "dynamic relocation to unreachable symbol %s", r.Sym.Name)
                        }
-                       if !thearch.Adddynrel(ctxt, s, r) {
+                       if !thearch.Adddynrel(ctxt, target, syms, s, r) {
                                Errorf(s, "unsupported dynamic relocation for symbol %s (type=%d (%s) stype=%d (%s))", r.Sym.Name, r.Type, sym.RelocName(ctxt.Arch, r.Type), r.Sym.Type, r.Sym.Type)
                        }
                }
index d7db1b816cca79909a63b306ba6546f2a25bcee8..6146bed284ea3cc621712fa418a8731e04b6ebf5 100644 (file)
@@ -1599,7 +1599,7 @@ func (ctxt *Link) doelf() {
                        s.Type = sym.SELFRXSECT
                }
 
-               thearch.Elfsetupplt(ctxt)
+               thearch.Elfsetupplt(ctxt, &ctxt.Target, &ctxt.ArchSyms)
 
                s = ctxt.Syms.Lookup(elfRelType+".plt", 0)
                s.Attr |= sym.AttrReachable
index e1948ecfc5989c4bf998bd727edc3c83fe3ff8be..bf8f240b006bfcbb10b4dad0d7c5cd105e876240 100644 (file)
@@ -141,7 +141,7 @@ type Arch struct {
        Openbsddynld   string
        Dragonflydynld string
        Solarisdynld   string
-       Adddynrel      func(*Link, *sym.Symbol, *sym.Reloc) bool
+       Adddynrel      func(*Link, *Target, *ArchSyms, *sym.Symbol, *sym.Reloc) bool
        Archinit       func(*Link)
        // Archreloc is an arch-specific hook that assists in
        // relocation processing (invoked by 'relocsym'); it handles
@@ -174,7 +174,7 @@ type Arch struct {
        Asmb2 func(*Link)
 
        Elfreloc1   func(*Link, *sym.Reloc, int64) bool
-       Elfsetupplt func(*Link)
+       Elfsetupplt func(*Link, *Target, *ArchSyms)
        Gentext     func(*Link)
        Machoreloc1 func(*sys.Arch, *OutBuf, *sym.Symbol, *sym.Reloc, int64) bool
        PEreloc1    func(*sys.Arch, *OutBuf, *sym.Symbol, *sym.Reloc, int64) bool
index 7531d3f78dbd62e9eae97db590273af04880c984..aceed343017cc0a710c163e6e346ef896cfa8afb 100644 (file)
@@ -44,7 +44,7 @@ func gentext(ctxt *ld.Link) {
        return
 }
 
-func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool {
+func adddynrel(ctxt *ld.Link, target *ld.Target, syms *ld.ArchSyms, s *sym.Symbol, r *sym.Reloc) bool {
        log.Fatalf("adddynrel not implemented")
        return false
 }
@@ -74,7 +74,7 @@ func elfreloc1(ctxt *ld.Link, r *sym.Reloc, sectoff int64) bool {
        return true
 }
 
-func elfsetupplt(ctxt *ld.Link) {
+func elfsetupplt(ctxt *ld.Link, target *ld.Target, syms *ld.ArchSyms) {
        return
 }
 
index 03caa2c6bcf249b458062d84de4c6b169393e030..d62ff8ec36d47eba5f8243b9012df0a23da60cf5 100644 (file)
@@ -42,7 +42,7 @@ import (
 
 func gentext(ctxt *ld.Link) {}
 
-func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool {
+func adddynrel(ctxt *ld.Link, target *ld.Target, syms *ld.ArchSyms, s *sym.Symbol, r *sym.Reloc) bool {
        log.Fatalf("adddynrel not implemented")
        return false
 }
@@ -91,7 +91,7 @@ func elfreloc1(ctxt *ld.Link, r *sym.Reloc, sectoff int64) bool {
        return true
 }
 
-func elfsetupplt(ctxt *ld.Link) {
+func elfsetupplt(ctxt *ld.Link, target *ld.Target, syms *ld.ArchSyms) {
        return
 }
 
index b0a85f3a436563d74da0bd98118809383760f7ba..21c9ad3e48d8035e98c57f1d3b10ea8f57117771 100644 (file)
@@ -262,7 +262,7 @@ func gencallstub(ctxt *ld.Link, abicase int, stub *sym.Symbol, targ *sym.Symbol)
        stub.AddUint32(ctxt.Arch, 0x4e800420) // bctr
 }
 
-func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool {
+func adddynrel(ctxt *ld.Link, target *ld.Target, syms *ld.ArchSyms, s *sym.Symbol, r *sym.Reloc) bool {
        if ctxt.IsELF {
                return addelfdynrel(ctxt, s, r)
        } else if ctxt.HeadType == objabi.Haix {
@@ -498,7 +498,7 @@ func elfreloc1(ctxt *ld.Link, r *sym.Reloc, sectoff int64) bool {
        return true
 }
 
-func elfsetupplt(ctxt *ld.Link) {
+func elfsetupplt(ctxt *ld.Link, target *ld.Target, syms *ld.ArchSyms) {
        plt := ctxt.Syms.Lookup(".plt", 0)
        if plt.Size == 0 {
                // The dynamic linker stores the address of the
@@ -949,7 +949,7 @@ func addpltsym(ctxt *ld.Link, s *sym.Symbol) {
                plt := ctxt.Syms.Lookup(".plt", 0)
                rela := ctxt.Syms.Lookup(".rela.plt", 0)
                if plt.Size == 0 {
-                       elfsetupplt(ctxt)
+                       elfsetupplt(ctxt, &ctxt.Target, &ctxt.ArchSyms)
                }
 
                // Create the glink resolver if necessary
index fce0daf56a76bbd09d7e76a844f3baad025e7343..704435ffd080a843adb5819111427f6e03a8ae8e 100644 (file)
@@ -17,11 +17,11 @@ import (
 func gentext(ctxt *ld.Link) {
 }
 
-func adddynrela(ctxt *ld.Link, rel *sym.Symbol, s *sym.Symbol, r *sym.Reloc) {
+func adddynrela(ctxt *ld.Link, target *ld.Target, syms *ld.ArchSyms, rel *sym.Symbol, s *sym.Symbol, r *sym.Reloc) {
        log.Fatalf("adddynrela not implemented")
 }
 
-func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool {
+func adddynrel(ctxt *ld.Link, target *ld.Target, syms *ld.ArchSyms, s *sym.Symbol, r *sym.Reloc) bool {
        log.Fatalf("adddynrel not implemented")
        return false
 }
@@ -31,7 +31,7 @@ func elfreloc1(ctxt *ld.Link, r *sym.Reloc, sectoff int64) bool {
        return false
 }
 
-func elfsetupplt(ctxt *ld.Link) {
+func elfsetupplt(ctxt *ld.Link, target *ld.Target, syms *ld.ArchSyms) {
        log.Fatalf("elfsetuplt")
 }
 
index 0d7199a16fbd89f6b7be46dba4c007e0744b7ace..9bf3c5bde62b7f0400ebdf40f9feacb2decefdff 100644 (file)
@@ -104,7 +104,7 @@ func gentext(ctxt *ld.Link) {
        initarray_entry.AddAddr(ctxt.Arch, initfunc)
 }
 
-func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool {
+func adddynrel(ctxt *ld.Link, target *ld.Target, syms *ld.ArchSyms, s *sym.Symbol, r *sym.Reloc) bool {
        targ := r.Sym
        r.InitExt()
 
@@ -333,7 +333,7 @@ func elfreloc1(ctxt *ld.Link, r *sym.Reloc, sectoff int64) bool {
        return true
 }
 
-func elfsetupplt(ctxt *ld.Link) {
+func elfsetupplt(ctxt *ld.Link, target *ld.Target, syms *ld.ArchSyms) {
        plt := ctxt.Syms.Lookup(".plt", 0)
        got := ctxt.Syms.Lookup(".got", 0)
        if plt.Size == 0 {
@@ -431,7 +431,7 @@ func addpltsym(ctxt *ld.Link, s *sym.Symbol) {
                got := ctxt.Syms.Lookup(".got", 0)
                rela := ctxt.Syms.Lookup(".rela.plt", 0)
                if plt.Size == 0 {
-                       elfsetupplt(ctxt)
+                       elfsetupplt(ctxt, &ctxt.Target, &ctxt.ArchSyms)
                }
                // larl    %r1,_GLOBAL_OFFSET_TABLE_+index
 
index a246be2b5762c057a4567fa144b3fd3a4b504164..267e048b40aa297f7213960a3e5ad1577074b565 100644 (file)
@@ -167,7 +167,7 @@ func gentext(ctxt *ld.Link) {
        initarray_entry.AddAddr(ctxt.Arch, initfunc)
 }
 
-func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool {
+func adddynrel(ctxt *ld.Link, target *ld.Target, syms *ld.ArchSyms, s *sym.Symbol, r *sym.Reloc) bool {
        targ := r.Sym
 
        switch r.Type {
@@ -511,7 +511,7 @@ func archrelocvariant(target *ld.Target, syms *ld.ArchSyms, r *sym.Reloc, s *sym
        return t
 }
 
-func elfsetupplt(ctxt *ld.Link) {
+func elfsetupplt(ctxt *ld.Link, target *ld.Target, syms *ld.ArchSyms) {
        plt := ctxt.Syms.Lookup(".plt", 0)
        got := ctxt.Syms.Lookup(".got.plt", 0)
        if plt.Size == 0 {
@@ -550,7 +550,7 @@ func addpltsym(ctxt *ld.Link, s *sym.Symbol) {
                got := ctxt.Syms.Lookup(".got.plt", 0)
                rel := ctxt.Syms.Lookup(".rel.plt", 0)
                if plt.Size == 0 {
-                       elfsetupplt(ctxt)
+                       elfsetupplt(ctxt, &ctxt.Target, &ctxt.ArchSyms)
                }
 
                // jmpq *got+size