]> Cypherpunks.ru repositories - gostls13.git/commitdiff
[dev.link] cmd/link: use new-style Reloc accessors in loadpe
authorCherry Zhang <cherryyz@google.com>
Fri, 10 Apr 2020 00:21:13 +0000 (20:21 -0400)
committerCherry Zhang <cherryyz@google.com>
Fri, 10 Apr 2020 17:30:25 +0000 (17:30 +0000)
Change-Id: I3601a5b4573e3e742a3e48c9709bbff616619d89
Reviewed-on: https://go-review.googlesource.com/c/go/+/227899
Run-TryBot: Cherry Zhang <cherryyz@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Than McIntosh <thanm@google.com>
src/cmd/link/internal/loadpe/ldpe.go

index 88819f348837b528c97a7eba22d0e6e8cb8518ca..cf76741f4301d29b73c3d7826945ffa7cbe7ffef 100644 (file)
@@ -16,7 +16,6 @@ import (
        "errors"
        "fmt"
        "io"
-       "sort"
        "strings"
 )
 
@@ -246,9 +245,8 @@ func Load(l *loader.Loader, arch *sys.Arch, localSymVersion int, input *bio.Read
                        continue
                }
 
-               rs := make([]loader.Reloc, rsect.NumberOfRelocations)
+               sb := l.MakeSymbolUpdater(sectsyms[rsect])
                for j, r := range rsect.Relocs {
-                       rp := &rs[j]
                        if int(r.SymbolTableIndex) >= len(f.COFFSymbols) {
                                return nil, 0, fmt.Errorf("relocation number %d symbol index idx=%d cannot be large then number of symbols %d", j, r.SymbolTableIndex, len(f.COFFSymbols))
                        }
@@ -265,9 +263,11 @@ func Load(l *loader.Loader, arch *sys.Arch, localSymVersion int, input *bio.Read
                                return nil, 0, fmt.Errorf("reloc of invalid sym %s idx=%d type=%d", name, r.SymbolTableIndex, pesym.Type)
                        }
 
-                       rp.Sym = gosym
-                       rp.Size = 4
-                       rp.Off = int32(r.VirtualAddress)
+                       rSym := gosym
+                       rSize := uint8(4)
+                       rOff := int32(r.VirtualAddress)
+                       var rAdd int64
+                       var rType objabi.RelocType
                        switch arch.Family {
                        default:
                                return nil, 0, fmt.Errorf("%s: unsupported arch %v", pn, arch.Family)
@@ -279,23 +279,23 @@ func Load(l *loader.Loader, arch *sys.Arch, localSymVersion int, input *bio.Read
                                case IMAGE_REL_I386_REL32, IMAGE_REL_AMD64_REL32,
                                        IMAGE_REL_AMD64_ADDR32, // R_X86_64_PC32
                                        IMAGE_REL_AMD64_ADDR32NB:
-                                       rp.Type = objabi.R_PCREL
+                                       rType = objabi.R_PCREL
 
-                                       rp.Add = int64(int32(binary.LittleEndian.Uint32(sectdata[rsect][rp.Off:])))
+                                       rAdd = int64(int32(binary.LittleEndian.Uint32(sectdata[rsect][rOff:])))
 
                                case IMAGE_REL_I386_DIR32NB, IMAGE_REL_I386_DIR32:
-                                       rp.Type = objabi.R_ADDR
+                                       rType = objabi.R_ADDR
 
                                        // load addend from image
-                                       rp.Add = int64(int32(binary.LittleEndian.Uint32(sectdata[rsect][rp.Off:])))
+                                       rAdd = int64(int32(binary.LittleEndian.Uint32(sectdata[rsect][rOff:])))
 
                                case IMAGE_REL_AMD64_ADDR64: // R_X86_64_64
-                                       rp.Size = 8
+                                       rSize = 8
 
-                                       rp.Type = objabi.R_ADDR
+                                       rType = objabi.R_ADDR
 
                                        // load addend from image
-                                       rp.Add = int64(binary.LittleEndian.Uint64(sectdata[rsect][rp.Off:]))
+                                       rAdd = int64(binary.LittleEndian.Uint64(sectdata[rsect][rOff:]))
                                }
 
                        case sys.ARM:
@@ -304,19 +304,19 @@ func Load(l *loader.Loader, arch *sys.Arch, localSymVersion int, input *bio.Read
                                        return nil, 0, fmt.Errorf("%s: %v: unknown ARM relocation type %v", pn, sectsyms[rsect], r.Type)
 
                                case IMAGE_REL_ARM_SECREL:
-                                       rp.Type = objabi.R_PCREL
+                                       rType = objabi.R_PCREL
 
-                                       rp.Add = int64(int32(binary.LittleEndian.Uint32(sectdata[rsect][rp.Off:])))
+                                       rAdd = int64(int32(binary.LittleEndian.Uint32(sectdata[rsect][rOff:])))
 
                                case IMAGE_REL_ARM_ADDR32:
-                                       rp.Type = objabi.R_ADDR
+                                       rType = objabi.R_ADDR
 
-                                       rp.Add = int64(int32(binary.LittleEndian.Uint32(sectdata[rsect][rp.Off:])))
+                                       rAdd = int64(int32(binary.LittleEndian.Uint32(sectdata[rsect][rOff:])))
 
                                case IMAGE_REL_ARM_BRANCH24:
-                                       rp.Type = objabi.R_CALLARM
+                                       rType = objabi.R_CALLARM
 
-                                       rp.Add = int64(int32(binary.LittleEndian.Uint32(sectdata[rsect][rp.Off:])))
+                                       rAdd = int64(int32(binary.LittleEndian.Uint32(sectdata[rsect][rOff:])))
                                }
                        }
 
@@ -324,14 +324,17 @@ func Load(l *loader.Loader, arch *sys.Arch, localSymVersion int, input *bio.Read
                        // same section but with different values, we have to take
                        // that into account
                        if issect(pesym) {
-                               rp.Add += int64(pesym.Value)
+                               rAdd += int64(pesym.Value)
                        }
-               }
 
-               sort.Sort(loader.RelocByOff(rs[:rsect.NumberOfRelocations]))
+                       rel, _ := sb.AddRel(rType)
+                       rel.SetOff(rOff)
+                       rel.SetSiz(rSize)
+                       rel.SetSym(rSym)
+                       rel.SetAdd(rAdd)
+               }
 
-               bld := l.MakeSymbolUpdater(sectsyms[rsect])
-               bld.SetRelocs(rs[:rsect.NumberOfRelocations])
+               sb.SortRelocs()
        }
 
        // enter sub-symbols into symbol table.