]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/5l, etc, cmd/internal/ld: consolidate implementations of adddynsym
authorMichael Hudson-Doyle <michael.hudson@canonical.com>
Tue, 12 May 2015 03:59:15 +0000 (15:59 +1200)
committerRuss Cox <rsc@golang.org>
Fri, 15 May 2015 20:08:42 +0000 (20:08 +0000)
The only essential difference is elf32 vs elf64, I assume the other differences
are bugs in one version or another...

Change-Id: Ie6ff33d5574a6592b543df9983eff8fdf88c97a1
Reviewed-on: https://go-review.googlesource.com/10001
Run-TryBot: Michael Hudson-Doyle <michael.hudson@canonical.com>
Reviewed-by: Russ Cox <rsc@golang.org>
13 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/elf.go
src/cmd/internal/ld/go.go
src/cmd/internal/ld/lib.go

index 14302a5a38b589270b9b699241cb69296becc85e..1b69671b9f5e38983b00d0ba4dd62a8181cdf9f6 100644 (file)
@@ -176,7 +176,7 @@ func adddynrel(s *ld.LSym, r *ld.Reloc) {
                        break
                }
                if ld.Iself {
-                       adddynsym(ld.Ctxt, targ)
+                       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 dynmic reloc
@@ -422,7 +422,7 @@ func addpltsym(ctxt *ld.Link, s *ld.LSym) {
                return
        }
 
-       adddynsym(ctxt, s)
+       ld.Adddynsym(ctxt, s)
 
        if ld.Iself {
                plt := ld.Linklookup(ctxt, ".plt", 0)
@@ -477,7 +477,7 @@ func addgotsym(ctxt *ld.Link, s *ld.LSym) {
                return
        }
 
-       adddynsym(ctxt, s)
+       ld.Adddynsym(ctxt, s)
        got := ld.Linklookup(ctxt, ".got", 0)
        s.Got = int32(got.Size)
        ld.Adduint32(ctxt, got, 0)
@@ -491,54 +491,6 @@ func addgotsym(ctxt *ld.Link, s *ld.LSym) {
        }
 }
 
-func adddynsym(ctxt *ld.Link, s *ld.LSym) {
-       if s.Dynid >= 0 {
-               return
-       }
-
-       if ld.Iself {
-               s.Dynid = int32(ld.Nelfsym)
-               ld.Nelfsym++
-
-               d := ld.Linklookup(ctxt, ".dynsym", 0)
-
-               /* name */
-               name := s.Extname
-
-               ld.Adduint32(ctxt, d, uint32(ld.Addstring(ld.Linklookup(ctxt, ".dynstr", 0), name)))
-
-               /* value */
-               if s.Type == obj.SDYNIMPORT {
-                       ld.Adduint32(ctxt, d, 0)
-               } else {
-                       ld.Addaddr(ctxt, d, s)
-               }
-
-               /* size */
-               ld.Adduint32(ctxt, d, 0)
-
-               /* type */
-               t := ld.STB_GLOBAL << 4
-
-               if (s.Cgoexport&ld.CgoExportDynamic != 0) && s.Type&obj.SMASK == obj.STEXT {
-                       t |= ld.STT_FUNC
-               } else {
-                       t |= ld.STT_OBJECT
-               }
-               ld.Adduint8(ctxt, d, uint8(t))
-               ld.Adduint8(ctxt, d, 0)
-
-               /* shndx */
-               if s.Type == obj.SDYNIMPORT {
-                       ld.Adduint16(ctxt, d, ld.SHN_UNDEF)
-               } else {
-                       ld.Adduint16(ctxt, d, 1)
-               }
-       } else {
-               ld.Diag("adddynsym: unsupported binary format")
-       }
-}
-
 func asmb() {
        if ld.Debug['v'] != 0 {
                fmt.Fprintf(&ld.Bso, "%5.2f asmb\n", obj.Cputime())
index d9485521adf8a9a241169e890a87e6454d2c0ae7..9c9578343e27f107b6ba3a8e4d6ebfa3997e9700 100644 (file)
@@ -59,7 +59,6 @@ func linkarchinit() {
        ld.Thearch.Dwarfreglr = DWARFREGLR
 
        ld.Thearch.Adddynrel = adddynrel
-       ld.Thearch.Adddynsym = adddynsym
        ld.Thearch.Archinit = archinit
        ld.Thearch.Archreloc = archreloc
        ld.Thearch.Archrelocvariant = archrelocvariant
index 9b471a04ac77466abe83086e79e251b4b2ac6e25..5520a5acf11d6793719cd16509c566fc87a260c4 100644 (file)
@@ -274,7 +274,7 @@ func adddynrel(s *ld.LSym, r *ld.Reloc) {
                        break
                }
                if ld.Iself {
-                       adddynsym(ld.Ctxt, targ)
+                       ld.Adddynsym(ld.Ctxt, targ)
                        rela := ld.Linklookup(ld.Ctxt, ".rela", 0)
                        ld.Addaddrplus(ld.Ctxt, rela, s, int64(r.Off))
                        if r.Siz == 8 {
@@ -298,7 +298,7 @@ func adddynrel(s *ld.LSym, 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.
-                       adddynsym(ld.Ctxt, targ)
+                       ld.Adddynsym(ld.Ctxt, targ)
 
                        got := ld.Linklookup(ld.Ctxt, ".got", 0)
                        s.Type = got.Type | obj.SSUB
@@ -526,7 +526,7 @@ func addpltsym(s *ld.LSym) {
                return
        }
 
-       adddynsym(ld.Ctxt, s)
+       ld.Adddynsym(ld.Ctxt, s)
 
        if ld.Iself {
                plt := ld.Linklookup(ld.Ctxt, ".plt", 0)
@@ -594,7 +594,7 @@ func addgotsym(s *ld.LSym) {
                return
        }
 
-       adddynsym(ld.Ctxt, s)
+       ld.Adddynsym(ld.Ctxt, s)
        got := ld.Linklookup(ld.Ctxt, ".got", 0)
        s.Got = int32(got.Size)
        ld.Adduint64(ld.Ctxt, got, 0)
@@ -611,62 +611,6 @@ func addgotsym(s *ld.LSym) {
        }
 }
 
-func adddynsym(ctxt *ld.Link, s *ld.LSym) {
-       if s.Dynid >= 0 {
-               return
-       }
-
-       if ld.Iself {
-               s.Dynid = int32(ld.Nelfsym)
-               ld.Nelfsym++
-
-               d := ld.Linklookup(ctxt, ".dynsym", 0)
-
-               name := s.Extname
-               ld.Adduint32(ctxt, d, uint32(ld.Addstring(ld.Linklookup(ctxt, ".dynstr", 0), name)))
-
-               /* type */
-               t := ld.STB_GLOBAL << 4
-
-               if s.Cgoexport != 0 && s.Type&obj.SMASK == obj.STEXT {
-                       t |= ld.STT_FUNC
-               } else {
-                       t |= ld.STT_OBJECT
-               }
-               ld.Adduint8(ctxt, d, uint8(t))
-
-               /* reserved */
-               ld.Adduint8(ctxt, d, 0)
-
-               /* section where symbol is defined */
-               if s.Type == obj.SDYNIMPORT {
-                       ld.Adduint16(ctxt, d, ld.SHN_UNDEF)
-               } else {
-                       ld.Adduint16(ctxt, d, 1)
-               }
-
-               /* value */
-               if s.Type == obj.SDYNIMPORT {
-                       ld.Adduint64(ctxt, d, 0)
-               } else {
-                       ld.Addaddr(ctxt, d, s)
-               }
-
-               /* size of object */
-               ld.Adduint64(ctxt, d, uint64(s.Size))
-
-               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 {
-               ld.Diag("adddynsym: missed symbol %s (%s)", s.Name, s.Extname)
-       } else if ld.HEADTYPE == obj.Hwindows {
-       } else // already taken care of
-       {
-               ld.Diag("adddynsym: unsupported binary format")
-       }
-}
-
 func asmb() {
        if ld.Debug['v'] != 0 {
                fmt.Fprintf(&ld.Bso, "%5.2f asmb\n", obj.Cputime())
index 38ac0783b6070be7ce177c415b8ce419e37776ae..1dc9e02a8bacda1174f267374c1380733d7abac9 100644 (file)
@@ -62,7 +62,6 @@ func linkarchinit() {
        ld.Thearch.Dwarfreglr = DWARFREGLR
 
        ld.Thearch.Adddynrel = adddynrel
-       ld.Thearch.Adddynsym = adddynsym
        ld.Thearch.Archinit = archinit
        ld.Thearch.Archreloc = archreloc
        ld.Thearch.Archrelocvariant = archrelocvariant
index a0e813cfa50978268ce645f717408bf1fbb57caa..3dfb8c666d765324172d0cd4b84ec0d69c85b5f7 100644 (file)
@@ -275,10 +275,6 @@ func archrelocvariant(r *ld.Reloc, s *ld.LSym, t int64) int64 {
        return -1
 }
 
-func adddynsym(ctxt *ld.Link, s *ld.LSym) {
-       // TODO(minux): implement when needed.
-}
-
 func asmb() {
        if ld.Debug['v'] != 0 {
                fmt.Fprintf(&ld.Bso, "%5.2f asmb\n", obj.Cputime())
index 7d0500387b5d3e4f501809b37e97c32693d3df14..f88584b9387e18771fd7efcaedeaf5ccdeca26b4 100644 (file)
@@ -59,7 +59,6 @@ func linkarchinit() {
        ld.Thearch.Dwarfreglr = DWARFREGLR
 
        ld.Thearch.Adddynrel = adddynrel
-       ld.Thearch.Adddynsym = adddynsym
        ld.Thearch.Archinit = archinit
        ld.Thearch.Archreloc = archreloc
        ld.Thearch.Archrelocvariant = archrelocvariant
index 873fd16470fb32b10f67845776b758eb0cb6a865..a63c51f58dfd690a5c0e0b835dde260b736ce4ce 100644 (file)
@@ -184,7 +184,7 @@ func adddynrel(s *ld.LSym, r *ld.Reloc) {
                        break
                }
                if ld.Iself {
-                       adddynsym(ld.Ctxt, targ)
+                       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))
@@ -204,7 +204,7 @@ func adddynrel(s *ld.LSym, 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.
-                       adddynsym(ld.Ctxt, targ)
+                       ld.Adddynsym(ld.Ctxt, targ)
 
                        got := ld.Linklookup(ld.Ctxt, ".got", 0)
                        s.Type = got.Type | obj.SSUB
@@ -402,7 +402,7 @@ func addpltsym(ctxt *ld.Link, s *ld.LSym) {
                return
        }
 
-       adddynsym(ctxt, s)
+       ld.Adddynsym(ctxt, s)
 
        if ld.Iself {
                plt := ld.Linklookup(ctxt, ".plt", 0)
@@ -462,7 +462,7 @@ func addgotsym(ctxt *ld.Link, s *ld.LSym) {
                return
        }
 
-       adddynsym(ctxt, s)
+       ld.Adddynsym(ctxt, s)
        got := ld.Linklookup(ctxt, ".got", 0)
        s.Got = int32(got.Size)
        ld.Adduint32(ctxt, got, 0)
@@ -478,58 +478,6 @@ func addgotsym(ctxt *ld.Link, s *ld.LSym) {
        }
 }
 
-func adddynsym(ctxt *ld.Link, s *ld.LSym) {
-       if s.Dynid >= 0 {
-               return
-       }
-
-       if ld.Iself {
-               s.Dynid = int32(ld.Nelfsym)
-               ld.Nelfsym++
-
-               d := ld.Linklookup(ctxt, ".dynsym", 0)
-
-               /* name */
-               name := s.Extname
-
-               ld.Adduint32(ctxt, d, uint32(ld.Addstring(ld.Linklookup(ctxt, ".dynstr", 0), name)))
-
-               /* value */
-               if s.Type == obj.SDYNIMPORT {
-                       ld.Adduint32(ctxt, d, 0)
-               } else {
-                       ld.Addaddr(ctxt, d, s)
-               }
-
-               /* size */
-               ld.Adduint32(ctxt, d, 0)
-
-               /* type */
-               t := ld.STB_GLOBAL << 4
-
-               if s.Cgoexport != 0 && s.Type&obj.SMASK == obj.STEXT {
-                       t |= ld.STT_FUNC
-               } else {
-                       t |= ld.STT_OBJECT
-               }
-               ld.Adduint8(ctxt, d, uint8(t))
-               ld.Adduint8(ctxt, d, 0)
-
-               /* shndx */
-               if s.Type == obj.SDYNIMPORT {
-                       ld.Adduint16(ctxt, d, ld.SHN_UNDEF)
-               } else {
-                       ld.Adduint16(ctxt, d, 1)
-               }
-       } else if ld.HEADTYPE == obj.Hdarwin {
-               ld.Diag("adddynsym: missed symbol %s (%s)", s.Name, s.Extname)
-       } else if ld.HEADTYPE == obj.Hwindows {
-       } else // already taken care of
-       {
-               ld.Diag("adddynsym: unsupported binary format")
-       }
-}
-
 func asmb() {
        if ld.Debug['v'] != 0 {
                fmt.Fprintf(&ld.Bso, "%5.2f asmb\n", obj.Cputime())
index 9bbaa7ee1bd7b9a553c85df62b6890a1e2582bd3..bea0d03cfefa4bf1001895231dd9f6d7e16dd7d4 100644 (file)
@@ -59,7 +59,6 @@ func linkarchinit() {
        ld.Thearch.Dwarfreglr = DWARFREGLR
 
        ld.Thearch.Adddynrel = adddynrel
-       ld.Thearch.Adddynsym = adddynsym
        ld.Thearch.Archinit = archinit
        ld.Thearch.Archreloc = archreloc
        ld.Thearch.Archrelocvariant = archrelocvariant
index 702ba2bb7cdee70e1947ba3d623ce4e553b17a38..45aa3f84c27457912d12f695824318e9b7c148b3 100644 (file)
@@ -222,7 +222,7 @@ func adddynrel(s *ld.LSym, r *ld.Reloc) {
                r.Type = obj.R_ADDR
                if targ.Type == obj.SDYNIMPORT {
                        // These happen in .toc sections
-                       adddynsym(ld.Ctxt, targ)
+                       ld.Adddynsym(ld.Ctxt, targ)
 
                        rela := ld.Linklookup(ld.Ctxt, ".rela", 0)
                        ld.Addaddrplus(ld.Ctxt, rela, s, int64(r.Off))
@@ -502,7 +502,7 @@ func addpltsym(ctxt *ld.Link, s *ld.LSym) {
                return
        }
 
-       adddynsym(ctxt, s)
+       ld.Adddynsym(ctxt, s)
 
        if ld.Iself {
                plt := ld.Linklookup(ctxt, ".plt", 0)
@@ -604,54 +604,6 @@ func ensureglinkresolver() *ld.LSym {
        return glink
 }
 
-func adddynsym(ctxt *ld.Link, s *ld.LSym) {
-       if s.Dynid >= 0 {
-               return
-       }
-
-       if ld.Iself {
-               s.Dynid = int32(ld.Nelfsym)
-               ld.Nelfsym++
-
-               d := ld.Linklookup(ctxt, ".dynsym", 0)
-
-               name := s.Extname
-               ld.Adduint32(ctxt, d, uint32(ld.Addstring(ld.Linklookup(ctxt, ".dynstr", 0), name)))
-
-               /* type */
-               t := ld.STB_GLOBAL << 4
-
-               if s.Cgoexport != 0 && s.Type&obj.SMASK == obj.STEXT {
-                       t |= ld.STT_FUNC
-               } else {
-                       t |= ld.STT_OBJECT
-               }
-               ld.Adduint8(ctxt, d, uint8(t))
-
-               /* reserved */
-               ld.Adduint8(ctxt, d, 0)
-
-               /* section where symbol is defined */
-               if s.Type == obj.SDYNIMPORT {
-                       ld.Adduint16(ctxt, d, ld.SHN_UNDEF)
-               } else {
-                       ld.Adduint16(ctxt, d, 1)
-               }
-
-               /* value */
-               if s.Type == obj.SDYNIMPORT {
-                       ld.Adduint64(ctxt, d, 0)
-               } else {
-                       ld.Addaddr(ctxt, d, s)
-               }
-
-               /* size of object */
-               ld.Adduint64(ctxt, d, uint64(s.Size))
-       } else {
-               ld.Diag("adddynsym: unsupported binary format")
-       }
-}
-
 func asmb() {
        if ld.Debug['v'] != 0 {
                fmt.Fprintf(&ld.Bso, "%5.2f asmb\n", obj.Cputime())
index f584ca43cd3b7f1a19945fdcd797857308f39ec0..011f290298fa9b6d940e2b6dd27bb2b4e86fe6c7 100644 (file)
@@ -63,7 +63,6 @@ func linkarchinit() {
        ld.Thearch.Dwarfreglr = DWARFREGLR
 
        ld.Thearch.Adddynrel = adddynrel
-       ld.Thearch.Adddynsym = adddynsym
        ld.Thearch.Archinit = archinit
        ld.Thearch.Archreloc = archreloc
        ld.Thearch.Archrelocvariant = archrelocvariant
index 5c17b2da6f979a6cc8177e61b8e470686056cf05..b73a75b59b5b7485f05519b9e0a83618dc50b212 100644 (file)
@@ -2349,6 +2349,93 @@ elfobj:
        }
 }
 
+func Elfadddynsym(ctxt *Link, s *LSym) {
+       if elf64 {
+               s.Dynid = int32(Nelfsym)
+               Nelfsym++
+
+               d := Linklookup(ctxt, ".dynsym", 0)
+
+               name := s.Extname
+               Adduint32(ctxt, d, uint32(Addstring(Linklookup(ctxt, ".dynstr", 0), name)))
+
+               /* type */
+               t := STB_GLOBAL << 4
+
+               if s.Cgoexport != 0 && s.Type&obj.SMASK == obj.STEXT {
+                       t |= STT_FUNC
+               } else {
+                       t |= STT_OBJECT
+               }
+               Adduint8(ctxt, d, uint8(t))
+
+               /* reserved */
+               Adduint8(ctxt, d, 0)
+
+               /* section where symbol is defined */
+               if s.Type == obj.SDYNIMPORT {
+                       Adduint16(ctxt, d, SHN_UNDEF)
+               } else {
+                       Adduint16(ctxt, d, 1)
+               }
+
+               /* value */
+               if s.Type == obj.SDYNIMPORT {
+                       Adduint64(ctxt, d, 0)
+               } else {
+                       Addaddr(ctxt, d, s)
+               }
+
+               /* size of object */
+               Adduint64(ctxt, d, uint64(s.Size))
+
+               if Thearch.Thechar == '6' && s.Cgoexport&CgoExportDynamic == 0 && s.Dynimplib != "" && !seenlib[s.Dynimplib] {
+                       Elfwritedynent(Linklookup(ctxt, ".dynamic", 0), DT_NEEDED, uint64(Addstring(Linklookup(ctxt, ".dynstr", 0), s.Dynimplib)))
+               }
+       } else {
+               s.Dynid = int32(Nelfsym)
+               Nelfsym++
+
+               d := Linklookup(ctxt, ".dynsym", 0)
+
+               /* name */
+               name := s.Extname
+
+               Adduint32(ctxt, d, uint32(Addstring(Linklookup(ctxt, ".dynstr", 0), name)))
+
+               /* value */
+               if s.Type == obj.SDYNIMPORT {
+                       Adduint32(ctxt, d, 0)
+               } else {
+                       Addaddr(ctxt, d, s)
+               }
+
+               /* size */
+               Adduint32(ctxt, d, 0)
+
+               /* type */
+               t := STB_GLOBAL << 4
+
+               // TODO(mwhudson): presumably the behaviour should actually be the same on both arm and 386.
+               if Thearch.Thechar == '8' && s.Cgoexport != 0 && s.Type&obj.SMASK == obj.STEXT {
+                       t |= STT_FUNC
+               } else if Thearch.Thechar == '5' && s.Cgoexport&CgoExportDynamic != 0 && s.Type&obj.SMASK == obj.STEXT {
+                       t |= STT_FUNC
+               } else {
+                       t |= STT_OBJECT
+               }
+               Adduint8(ctxt, d, uint8(t))
+               Adduint8(ctxt, d, 0)
+
+               /* shndx */
+               if s.Type == obj.SDYNIMPORT {
+                       Adduint16(ctxt, d, SHN_UNDEF)
+               } else {
+                       Adduint16(ctxt, d, 1)
+               }
+       }
+}
+
 func ELF32_R_SYM(info uint32) uint32 {
        return info >> 8
 }
index c1defeb8a2a5132285577f6ef9bb3cb62217410c..a5b09202e8cbb90152816d1c6ec17fc974ff9430 100644 (file)
@@ -534,13 +534,13 @@ err:
        nerrors++
 }
 
-var Seenlib = make(map[string]bool)
+var seenlib = make(map[string]bool)
 
 func adddynlib(lib string) {
-       if Seenlib[lib] {
+       if seenlib[lib] {
                return
        }
-       Seenlib[lib] = true
+       seenlib[lib] = true
 
        if Iself {
                s := Linklookup(Ctxt, ".dynstr", 0)
@@ -555,6 +555,22 @@ func adddynlib(lib string) {
        }
 }
 
+func Adddynsym(ctxt *Link, s *LSym) {
+       if s.Dynid >= 0 {
+               return
+       }
+
+       if Iself {
+               Elfadddynsym(ctxt, s)
+       } else if HEADTYPE == obj.Hdarwin {
+               Diag("adddynsym: missed symbol %s (%s)", s.Name, s.Extname)
+       } else if HEADTYPE == obj.Hwindows {
+               // already taken care of
+       } else {
+               Diag("adddynsym: unsupported binary format")
+       }
+}
+
 var markq *LSym
 
 var emarkq *LSym
@@ -759,7 +775,7 @@ func addexport() {
        }
 
        for i := 0; i < len(dynexp); i++ {
-               Thearch.Adddynsym(Ctxt, dynexp[i])
+               Adddynsym(Ctxt, dynexp[i])
        }
 }
 
index 5ab5f653f35bccc173de158bf0965e658b3db5e3..cc0840c04abd4542d6b272aad80fdece4203d11b 100644 (file)
@@ -95,7 +95,6 @@ type Arch struct {
        Dragonflydynld   string
        Solarisdynld     string
        Adddynrel        func(*LSym, *Reloc)
-       Adddynsym        func(*Link, *LSym)
        Archinit         func()
        Archreloc        func(*Reloc, *LSym, *int64) int
        Archrelocvariant func(*Reloc, *LSym, int64) int64