]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/5l, etc, cmd/internal/ld: consolidate implementations of adddynlib
authorMichael Hudson-Doyle <michael.hudson@canonical.com>
Tue, 12 May 2015 03:40:13 +0000 (15:40 +1200)
committerRuss Cox <rsc@golang.org>
Fri, 15 May 2015 20:07:54 +0000 (20:07 +0000)
They were all essentially the same.

Change-Id: I6e0b548cda6e4bbe2ec3b3025b746d1f6d332d48
Reviewed-on: https://go-review.googlesource.com/10000
Run-TryBot: Michael Hudson-Doyle <michael.hudson@canonical.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Russ Cox <rsc@golang.org>
12 files changed:
src/cmd/5l/asm.go
src/cmd/5l/obj.go
src/cmd/6l/asm.go
src/cmd/6l/obj.go
src/cmd/7l/asm.go
src/cmd/7l/obj.go
src/cmd/8l/asm.go
src/cmd/8l/obj.go
src/cmd/9l/asm.go
src/cmd/9l/obj.go
src/cmd/internal/ld/go.go
src/cmd/internal/ld/lib.go

index 85ea684fc77d26cf655e80219c15d6fce9a479bb..14302a5a38b589270b9b699241cb69296becc85e 100644 (file)
@@ -37,24 +37,6 @@ import (
        "log"
 )
 
-func needlib(name string) int {
-       if name[0] == '\x00' {
-               return 0
-       }
-
-       /* reuse hash code in symbol table */
-       p := fmt.Sprintf(".dynlib.%s", name)
-
-       s := ld.Linklookup(ld.Ctxt, p, 0)
-
-       if s.Type == 0 {
-               s.Type = 100 // avoid SDATA, etc.
-               return 1
-       }
-
-       return 0
-}
-
 func gentext() {
 }
 
@@ -557,24 +539,6 @@ func adddynsym(ctxt *ld.Link, s *ld.LSym) {
        }
 }
 
-func adddynlib(lib string) {
-       if needlib(lib) == 0 {
-               return
-       }
-
-       if ld.Iself {
-               s := ld.Linklookup(ld.Ctxt, ".dynstr", 0)
-               if s.Size == 0 {
-                       ld.Addstring(s, "")
-               }
-               ld.Elfwritedynent(ld.Linklookup(ld.Ctxt, ".dynamic", 0), ld.DT_NEEDED, uint64(ld.Addstring(s, lib)))
-       } else if ld.HEADTYPE == obj.Hdarwin {
-               ld.Machoadddynlib(lib)
-       } else {
-               ld.Diag("adddynlib: unsupported binary format")
-       }
-}
-
 func asmb() {
        if ld.Debug['v'] != 0 {
                fmt.Fprintf(&ld.Bso, "%5.2f asmb\n", obj.Cputime())
index e4fffdec6a068bedab79d03bde939f1748863b7e..d9485521adf8a9a241169e890a87e6454d2c0ae7 100644 (file)
@@ -58,7 +58,6 @@ func linkarchinit() {
        ld.Thearch.Dwarfregsp = DWARFREGSP
        ld.Thearch.Dwarfreglr = DWARFREGLR
 
-       ld.Thearch.Adddynlib = adddynlib
        ld.Thearch.Adddynrel = adddynrel
        ld.Thearch.Adddynsym = adddynsym
        ld.Thearch.Archinit = archinit
index a025ce6ea634042cf67adde683b7fb0ccf4de211..9b471a04ac77466abe83086e79e251b4b2ac6e25 100644 (file)
@@ -44,24 +44,6 @@ func PADDR(x uint32) uint32 {
 
 var zeroes string
 
-func needlib(name string) int {
-       if name[0] == '\x00' {
-               return 0
-       }
-
-       /* reuse hash code in symbol table */
-       p := fmt.Sprintf(".elfload.%s", name)
-
-       s := ld.Linklookup(ld.Ctxt, p, 0)
-
-       if s.Type == 0 {
-               s.Type = 100 // avoid SDATA, etc.
-               return 1
-       }
-
-       return 0
-}
-
 func Addcall(ctxt *ld.Link, s *ld.LSym, t *ld.LSym) int64 {
        s.Reachable = true
        i := s.Size
@@ -673,7 +655,7 @@ func adddynsym(ctxt *ld.Link, s *ld.LSym) {
                /* size of object */
                ld.Adduint64(ctxt, d, uint64(s.Size))
 
-               if s.Cgoexport&ld.CgoExportDynamic == 0 && s.Dynimplib != "" && needlib(s.Dynimplib) != 0 {
+               if s.Cgoexport&ld.CgoExportDynamic == 0 && s.Dynimplib != "" && !ld.Seenlib[s.Dynimplib] {
                        ld.Elfwritedynent(ld.Linklookup(ctxt, ".dynamic", 0), ld.DT_NEEDED, uint64(ld.Addstring(ld.Linklookup(ctxt, ".dynstr", 0), s.Dynimplib)))
                }
        } else if ld.HEADTYPE == obj.Hdarwin {
@@ -685,24 +667,6 @@ func adddynsym(ctxt *ld.Link, s *ld.LSym) {
        }
 }
 
-func adddynlib(lib string) {
-       if needlib(lib) == 0 {
-               return
-       }
-
-       if ld.Iself {
-               s := ld.Linklookup(ld.Ctxt, ".dynstr", 0)
-               if s.Size == 0 {
-                       ld.Addstring(s, "")
-               }
-               ld.Elfwritedynent(ld.Linklookup(ld.Ctxt, ".dynamic", 0), ld.DT_NEEDED, uint64(ld.Addstring(s, lib)))
-       } else if ld.HEADTYPE == obj.Hdarwin {
-               ld.Machoadddynlib(lib)
-       } else {
-               ld.Diag("adddynlib: unsupported binary format")
-       }
-}
-
 func asmb() {
        if ld.Debug['v'] != 0 {
                fmt.Fprintf(&ld.Bso, "%5.2f asmb\n", obj.Cputime())
index 8ee7bb28dbe93685f2c0ffe6633d6581354f5c4d..38ac0783b6070be7ce177c415b8ce419e37776ae 100644 (file)
@@ -61,7 +61,6 @@ func linkarchinit() {
        ld.Thearch.Dwarfregsp = DWARFREGSP
        ld.Thearch.Dwarfreglr = DWARFREGLR
 
-       ld.Thearch.Adddynlib = adddynlib
        ld.Thearch.Adddynrel = adddynrel
        ld.Thearch.Adddynsym = adddynsym
        ld.Thearch.Archinit = archinit
index a17899dcf00b35ef155cb31b2f772b7510c1a4ef..a0e813cfa50978268ce645f717408bf1fbb57caa 100644 (file)
@@ -40,24 +40,6 @@ import (
 
 func gentext() {}
 
-func needlib(name string) int {
-       if name[0] == '\x00' {
-               return 0
-       }
-
-       /* reuse hash code in symbol table */
-       p := fmt.Sprintf(".dynlib.%s", name)
-
-       s := ld.Linklookup(ld.Ctxt, p, 0)
-
-       if s.Type == 0 {
-               s.Type = 100 // avoid SDATA, etc.
-               return 1
-       }
-
-       return 0
-}
-
 func adddynrela(rel *ld.LSym, s *ld.LSym, r *ld.Reloc) {
        log.Fatalf("adddynrela not implemented")
 }
@@ -297,24 +279,6 @@ func adddynsym(ctxt *ld.Link, s *ld.LSym) {
        // TODO(minux): implement when needed.
 }
 
-func adddynlib(lib string) {
-       if needlib(lib) == 0 {
-               return
-       }
-
-       if ld.Iself {
-               s := ld.Linklookup(ld.Ctxt, ".dynstr", 0)
-               if s.Size == 0 {
-                       ld.Addstring(s, "")
-               }
-               ld.Elfwritedynent(ld.Linklookup(ld.Ctxt, ".dynamic", 0), ld.DT_NEEDED, uint64(ld.Addstring(s, lib)))
-       } else if ld.HEADTYPE == obj.Hdarwin {
-               ld.Machoadddynlib(lib)
-       } else {
-               ld.Diag("adddynlib: unsupported binary format")
-       }
-}
-
 func asmb() {
        if ld.Debug['v'] != 0 {
                fmt.Fprintf(&ld.Bso, "%5.2f asmb\n", obj.Cputime())
index aeea421bc2120430912935932618f9ef031b3e16..7d0500387b5d3e4f501809b37e97c32693d3df14 100644 (file)
@@ -58,7 +58,6 @@ func linkarchinit() {
        ld.Thearch.Dwarfregsp = DWARFREGSP
        ld.Thearch.Dwarfreglr = DWARFREGLR
 
-       ld.Thearch.Adddynlib = adddynlib
        ld.Thearch.Adddynrel = adddynrel
        ld.Thearch.Adddynsym = adddynsym
        ld.Thearch.Archinit = archinit
index 7231379108564d1f3a0c0ed1140f7ca72ec8b74b..873fd16470fb32b10f67845776b758eb0cb6a865 100644 (file)
@@ -37,24 +37,6 @@ import (
        "log"
 )
 
-func needlib(name string) int {
-       if name[0] == '\x00' {
-               return 0
-       }
-
-       /* reuse hash code in symbol table */
-       p := fmt.Sprintf(".dynlib.%s", name)
-
-       s := ld.Linklookup(ld.Ctxt, p, 0)
-
-       if s.Type == 0 {
-               s.Type = 100 // avoid SDATA, etc.
-               return 1
-       }
-
-       return 0
-}
-
 func gentext() {
 }
 
@@ -548,24 +530,6 @@ func adddynsym(ctxt *ld.Link, s *ld.LSym) {
        }
 }
 
-func adddynlib(lib string) {
-       if needlib(lib) == 0 {
-               return
-       }
-
-       if ld.Iself {
-               s := ld.Linklookup(ld.Ctxt, ".dynstr", 0)
-               if s.Size == 0 {
-                       ld.Addstring(s, "")
-               }
-               ld.Elfwritedynent(ld.Linklookup(ld.Ctxt, ".dynamic", 0), ld.DT_NEEDED, uint64(ld.Addstring(s, lib)))
-       } else if ld.HEADTYPE == obj.Hdarwin {
-               ld.Machoadddynlib(lib)
-       } else if ld.HEADTYPE != obj.Hwindows {
-               ld.Diag("adddynlib: unsupported binary format")
-       }
-}
-
 func asmb() {
        if ld.Debug['v'] != 0 {
                fmt.Fprintf(&ld.Bso, "%5.2f asmb\n", obj.Cputime())
index 5af3f9249b6eeea050012926f92d6f5df2b42afa..9bbaa7ee1bd7b9a553c85df62b6890a1e2582bd3 100644 (file)
@@ -58,7 +58,6 @@ func linkarchinit() {
        ld.Thearch.Dwarfregsp = DWARFREGSP
        ld.Thearch.Dwarfreglr = DWARFREGLR
 
-       ld.Thearch.Adddynlib = adddynlib
        ld.Thearch.Adddynrel = adddynrel
        ld.Thearch.Adddynsym = adddynsym
        ld.Thearch.Archinit = archinit
index 257f23e2abcb028eed9d50325e982be8bb122e38..702ba2bb7cdee70e1947ba3d623ce4e553b17a38 100644 (file)
@@ -38,24 +38,6 @@ import (
        "log"
 )
 
-func needlib(name string) int {
-       if name[0] == '\x00' {
-               return 0
-       }
-
-       /* reuse hash code in symbol table */
-       p := fmt.Sprintf(".dynlib.%s", name)
-
-       s := ld.Linklookup(ld.Ctxt, p, 0)
-
-       if s.Type == 0 {
-               s.Type = 100 // avoid SDATA, etc.
-               return 1
-       }
-
-       return 0
-}
-
 func gentext() {
        var s *ld.LSym
        var stub *ld.LSym
@@ -670,22 +652,6 @@ func adddynsym(ctxt *ld.Link, s *ld.LSym) {
        }
 }
 
-func adddynlib(lib string) {
-       if needlib(lib) == 0 {
-               return
-       }
-
-       if ld.Iself {
-               s := ld.Linklookup(ld.Ctxt, ".dynstr", 0)
-               if s.Size == 0 {
-                       ld.Addstring(s, "")
-               }
-               ld.Elfwritedynent(ld.Linklookup(ld.Ctxt, ".dynamic", 0), ld.DT_NEEDED, uint64(ld.Addstring(s, lib)))
-       } else {
-               ld.Diag("adddynlib: unsupported binary format")
-       }
-}
-
 func asmb() {
        if ld.Debug['v'] != 0 {
                fmt.Fprintf(&ld.Bso, "%5.2f asmb\n", obj.Cputime())
index 2da37561e96a8df3c74783bc3e224d1eeec95fcb..f584ca43cd3b7f1a19945fdcd797857308f39ec0 100644 (file)
@@ -62,7 +62,6 @@ func linkarchinit() {
        ld.Thearch.Dwarfregsp = DWARFREGSP
        ld.Thearch.Dwarfreglr = DWARFREGLR
 
-       ld.Thearch.Adddynlib = adddynlib
        ld.Thearch.Adddynrel = adddynrel
        ld.Thearch.Adddynsym = adddynsym
        ld.Thearch.Archinit = archinit
index 0223bfae9d2448f0b4cbc7183f7efecba5d29b37..c1defeb8a2a5132285577f6ef9bb3cb62217410c 100644 (file)
@@ -416,7 +416,7 @@ func loadcgo(file string, pkg string, p string) {
                                // to force a link of foo.so.
                                havedynamic = 1
 
-                               Thearch.Adddynlib(lib)
+                               adddynlib(lib)
                                continue
                        }
 
@@ -534,6 +534,27 @@ err:
        nerrors++
 }
 
+var Seenlib = make(map[string]bool)
+
+func adddynlib(lib string) {
+       if Seenlib[lib] {
+               return
+       }
+       Seenlib[lib] = true
+
+       if Iself {
+               s := Linklookup(Ctxt, ".dynstr", 0)
+               if s.Size == 0 {
+                       Addstring(s, "")
+               }
+               Elfwritedynent(Linklookup(Ctxt, ".dynamic", 0), DT_NEEDED, uint64(Addstring(s, lib)))
+       } else if HEADTYPE == obj.Hdarwin {
+               Machoadddynlib(lib)
+       } else {
+               Diag("adddynlib: unsupported binary format")
+       }
+}
+
 var markq *LSym
 
 var emarkq *LSym
index d4e67800d26b92e235bb775270fe2b7ec26b8368..5ab5f653f35bccc173de158bf0965e658b3db5e3 100644 (file)
@@ -94,7 +94,6 @@ type Arch struct {
        Openbsddynld     string
        Dragonflydynld   string
        Solarisdynld     string
-       Adddynlib        func(string)
        Adddynrel        func(*LSym, *Reloc)
        Adddynsym        func(*Link, *LSym)
        Archinit         func()