From 82f6d8eabb49dbd16dd6e35f6a02cf585f279c02 Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Thu, 9 Apr 2020 20:21:13 -0400 Subject: [PATCH] [dev.link] cmd/link: use new-style Reloc accessors in loadpe Change-Id: I3601a5b4573e3e742a3e48c9709bbff616619d89 Reviewed-on: https://go-review.googlesource.com/c/go/+/227899 Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot Reviewed-by: Than McIntosh --- src/cmd/link/internal/loadpe/ldpe.go | 51 +++++++++++++++------------- 1 file changed, 27 insertions(+), 24 deletions(-) diff --git a/src/cmd/link/internal/loadpe/ldpe.go b/src/cmd/link/internal/loadpe/ldpe.go index 88819f3488..cf76741f43 100644 --- a/src/cmd/link/internal/loadpe/ldpe.go +++ b/src/cmd/link/internal/loadpe/ldpe.go @@ -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) } + + rel, _ := sb.AddRel(rType) + rel.SetOff(rOff) + rel.SetSiz(rSize) + rel.SetSym(rSym) + rel.SetAdd(rAdd) } - sort.Sort(loader.RelocByOff(rs[:rsect.NumberOfRelocations])) - - bld := l.MakeSymbolUpdater(sectsyms[rsect]) - bld.SetRelocs(rs[:rsect.NumberOfRelocations]) + sb.SortRelocs() } // enter sub-symbols into symbol table.