]> Cypherpunks repositories - gostls13.git/commitdiff
[dev.link] cmd/link: remove elf sym fields from sym.Symbol
authorThan McIntosh <thanm@google.com>
Tue, 28 Apr 2020 14:51:40 +0000 (10:51 -0400)
committerThan McIntosh <thanm@google.com>
Tue, 28 Apr 2020 19:04:47 +0000 (19:04 +0000)
Remove the "ElfSym" and "LocalElfSym" fields from sym.Symbol,
replacing uses with loader method calls as needed.

Change-Id: I3828f13203ece2bdc03eeb09ab37a5c94e21a726
Reviewed-on: https://go-review.googlesource.com/c/go/+/230462
Reviewed-by: Cherry Zhang <cherryyz@google.com>
13 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/elf.go
src/cmd/link/internal/ld/lib.go
src/cmd/link/internal/ld/symtab.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/s390x/asm.go
src/cmd/link/internal/sym/sizeof_test.go
src/cmd/link/internal/sym/symbol.go
src/cmd/link/internal/x86/asm.go

index 95831d6dd0c773d5bad2d98025c99a5a30aaf9ea..24134adc270da2867ee55995fdf8372b465cb2a2 100644 (file)
@@ -396,7 +396,7 @@ func adddynrel2(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s load
 func elfreloc1(ctxt *ld.Link, r *sym.Reloc, sectoff int64) bool {
        ctxt.Out.Write64(uint64(sectoff))
 
-       elfsym := r.Xsym.ElfsymForReloc()
+       elfsym := ld.ElfSymForReloc(ctxt, r.Xsym)
        switch r.Type {
        default:
                return false
index 7665cc59f04cf3ea1ef8f21589cde3e104205a9e..e42ea0f6e5cbd15923285da4273d6e1ac8445c86 100644 (file)
@@ -252,7 +252,7 @@ func adddynrel2(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s load
 func elfreloc1(ctxt *ld.Link, r *sym.Reloc, sectoff int64) bool {
        ctxt.Out.Write32(uint32(sectoff))
 
-       elfsym := r.Xsym.ElfsymForReloc()
+       elfsym := ld.ElfSymForReloc(ctxt, r.Xsym)
        switch r.Type {
        default:
                return false
index fbcbc9c8c34d127b4893171615dfffa31de8e1d4..f49172ea23a8cb06da374b83a9137d17f31b51c8 100644 (file)
@@ -328,7 +328,7 @@ func adddynrel2(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s load
 func elfreloc1(ctxt *ld.Link, r *sym.Reloc, sectoff int64) bool {
        ctxt.Out.Write64(uint64(sectoff))
 
-       elfsym := r.Xsym.ElfsymForReloc()
+       elfsym := ld.ElfSymForReloc(ctxt, r.Xsym)
        switch r.Type {
        default:
                return false
index 3a0a305db9ab9bf27ca628b94a0a8ad9e66ac34f..3be3f991711ca376523ec8317d4677cf907f4574 100644 (file)
@@ -1411,7 +1411,8 @@ func elfrelocsect(ctxt *Link, sect *sym.Section, syms []*sym.Symbol) {
                                Errorf(s, "missing xsym in relocation %#v %#v", r.Sym.Name, s)
                                continue
                        }
-                       if r.Xsym.ElfsymForReloc() == 0 {
+                       esr := ElfSymForReloc(ctxt, r.Xsym)
+                       if esr == 0 {
                                Errorf(s, "reloc %d (%s) to non-elf symbol %s (outer=%s) %d (%s)", r.Type, sym.RelocName(ctxt.Arch, r.Type), r.Sym.Name, r.Xsym.Name, r.Sym.Type, r.Sym.Type)
                        }
                        if !r.Xsym.Attr.Reachable() {
index 03d841dccb8df2186364d29786b94e8a20be7c17..e1f89858b69ae79377d2b0311c727d264ac9f574 100644 (file)
@@ -2918,6 +2918,17 @@ func symPkg(ctxt *Link, s *sym.Symbol) string {
        return ctxt.loader.SymPkg(loader.Sym(s.SymIdx))
 }
 
+func ElfSymForReloc(ctxt *Link, s *sym.Symbol) int32 {
+       // If putelfsym created a local version of this symbol, use that in all
+       // relocations.
+       les := ctxt.loader.SymLocalElfSym(loader.Sym(s.SymIdx))
+       if les != 0 {
+               return les
+       } else {
+               return ctxt.loader.SymElfSym(loader.Sym(s.SymIdx))
+       }
+}
+
 func (ctxt *Link) dumpsyms() {
        for _, s := range ctxt.loader.Syms {
                if s == nil {
index 1d7ec895dc945c6fe7fe88ccd987d481b292022c..f9eb05146ffffbe92b1397f417ee3b1916fc2b52 100644 (file)
@@ -185,7 +185,7 @@ func putelfsym(ctxt *Link, x *sym.Symbol, s string, t SymbolType, addr int64) {
                // ELF linker -Bsymbolic-functions option, but that is buggy on
                // several platforms.
                putelfsyment(ctxt.Out, putelfstr("local."+s), addr, size, STB_LOCAL<<4|typ&0xf, elfshnum, other)
-               x.LocalElfsym = int32(ctxt.numelfsym)
+               ctxt.loader.SetSymLocalElfSym(loader.Sym(x.SymIdx), int32(ctxt.numelfsym))
                ctxt.numelfsym++
                return
        } else if bind != ctxt.elfbind {
@@ -193,13 +193,13 @@ func putelfsym(ctxt *Link, x *sym.Symbol, s string, t SymbolType, addr int64) {
        }
 
        putelfsyment(ctxt.Out, putelfstr(s), addr, size, bind<<4|typ&0xf, elfshnum, other)
-       x.Elfsym = int32(ctxt.numelfsym)
+       ctxt.loader.SetSymElfSym(loader.Sym(x.SymIdx), int32(ctxt.numelfsym))
        ctxt.numelfsym++
 }
 
 func putelfsectionsym(ctxt *Link, out *OutBuf, s *sym.Symbol, shndx int) {
        putelfsyment(out, 0, 0, 0, STB_LOCAL<<4|STT_SECTION, shndx, 0)
-       s.Elfsym = int32(ctxt.numelfsym)
+       ctxt.loader.SetSymElfSym(loader.Sym(s.SymIdx), int32(ctxt.numelfsym))
        ctxt.numelfsym++
 }
 
index 928167870442abee54ee3c41cac8e066bd7f0540..53032a7e335fd244120621a28a979f963ce21a90 100644 (file)
@@ -54,7 +54,7 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s *sym.
 func elfreloc1(ctxt *ld.Link, r *sym.Reloc, sectoff int64) bool {
        ctxt.Out.Write32(uint32(sectoff))
 
-       elfsym := r.Xsym.ElfsymForReloc()
+       elfsym := ld.ElfSymForReloc(ctxt, r.Xsym)
        switch r.Type {
        default:
                return false
index 615851b564a6a80952c9cad1761b91a8999e470e..33f8b3350908db1b4c617fa6f64dcc1ad4912c3c 100644 (file)
@@ -61,7 +61,7 @@ func elfreloc1(ctxt *ld.Link, r *sym.Reloc, sectoff int64) bool {
 
        ctxt.Out.Write64(uint64(sectoff))
 
-       elfsym := r.Xsym.ElfsymForReloc()
+       elfsym := ld.ElfSymForReloc(ctxt, r.Xsym)
        ctxt.Out.Write32(uint32(elfsym))
        ctxt.Out.Write8(0)
        ctxt.Out.Write8(0)
index 6b6e1294d30862b635c9ecaf140e0f9c8f614bbf..dfc55a30fd187521b005ef62ea2bdba6821040a2 100644 (file)
@@ -453,7 +453,7 @@ func elfreloc1(ctxt *ld.Link, r *sym.Reloc, sectoff int64) bool {
        }
        ctxt.Out.Write64(uint64(sectoff))
 
-       elfsym := r.Xsym.ElfsymForReloc()
+       elfsym := ld.ElfSymForReloc(ctxt, r.Xsym)
        switch r.Type {
        default:
                return false
index ac634f99e396a6349cbccda3d56701dd36fdc2b7..a9cb79a1ccfb08625b66a8b5a55fd99dc4980798 100644 (file)
@@ -224,7 +224,7 @@ func adddynrel2(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s load
 func elfreloc1(ctxt *ld.Link, r *sym.Reloc, sectoff int64) bool {
        ctxt.Out.Write64(uint64(sectoff))
 
-       elfsym := r.Xsym.ElfsymForReloc()
+       elfsym := ld.ElfSymForReloc(ctxt, r.Xsym)
        switch r.Type {
        default:
                return false
index d7db7f1daaaa91c31edb8aabbb6130422f93d6d9..4cfca3b5a33bb48984f48cfe8651ff1b5260fa0c 100644 (file)
@@ -21,7 +21,7 @@ func TestSizeof(t *testing.T) {
                _32bit uintptr     // size on 32bit platforms
                _64bit uintptr     // size on 64bit platforms
        }{
-               {Symbol{}, 92, 144},
+               {Symbol{}, 84, 136},
        }
 
        for _, tt := range tests {
index 643c48d5894915a94c2186f50ef7ba1ceff51b78..546798fdf492e78375cf835de6e4034a8fccc4c4 100644 (file)
@@ -15,21 +15,19 @@ import (
 
 // Symbol is an entry in the symbol table.
 type Symbol struct {
-       Name        string
-       Type        SymKind
-       Version     int16
-       Attr        Attribute
-       Dynid       int32
-       Align       int32
-       Elfsym      int32
-       LocalElfsym int32
-       Value       int64
-       Size        int64
-       Sub         *Symbol
-       Outer       *Symbol
-       SymIdx      LoaderSym
-       auxinfo     *AuxSymbol
-       Sect        *Section
+       Name    string
+       Type    SymKind
+       Version int16
+       Attr    Attribute
+       Dynid   int32
+       Align   int32
+       Value   int64
+       Size    int64
+       Sub     *Symbol
+       Outer   *Symbol
+       SymIdx  LoaderSym
+       auxinfo *AuxSymbol
+       Sect    *Section
        // P contains the raw symbol data.
        P []byte
        R []Reloc
@@ -86,16 +84,6 @@ func (s *Symbol) IsFileLocal() bool {
        return s.Version >= SymVerStatic
 }
 
-func (s *Symbol) ElfsymForReloc() int32 {
-       // If putelfsym created a local version of this symbol, use that in all
-       // relocations.
-       if s.LocalElfsym != 0 {
-               return s.LocalElfsym
-       } else {
-               return s.Elfsym
-       }
-}
-
 func (s *Symbol) Len() int64 {
        return s.Size
 }
index 069d2bc31ce05fefa66206efb986c1e098c85f84..157e13496c5a14d7a4301de8f53d97c99e48c1b1 100644 (file)
@@ -343,7 +343,7 @@ func adddynrel2(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s load
 func elfreloc1(ctxt *ld.Link, r *sym.Reloc, sectoff int64) bool {
        ctxt.Out.Write32(uint32(sectoff))
 
-       elfsym := r.Xsym.ElfsymForReloc()
+       elfsym := ld.ElfSymForReloc(ctxt, r.Xsym)
        switch r.Type {
        default:
                return false