mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
cmd/link: Add section data slice to Archrelocvariant
PPC64 needs to preserve bits when applying some relocations. DS form relocations must preserve the lower two bits, and thus needs to inspect the section data as it streams out. Similarly, the overflow checking requires inspecting the primary opcode to see if the value is sign or zero extended. The existing PPC64 code no longer works as the slice returned by (loader*).Data is cleared as we layout the symbol and process relocations. This data is always the section undergoing relocation, thus we can directly inspect the contents to preserve bits or check for overflows. Change-Id: I239211f7e5e96208673663b6553b3017adae7e01 Reviewed-on: https://go-review.googlesource.com/c/go/+/300555 Run-TryBot: Paul Murphy <murp@ibm.com> Reviewed-by: Cherry Zhang <cherryyz@google.com> TryBot-Result: Go Bot <gobot@golang.org> Trust: Emmanuel Odeke <emmanuel@orijtech.com>
This commit is contained in:
parent
b95e4b7850
commit
e4253cd023
11 changed files with 18 additions and 17 deletions
|
|
@ -548,7 +548,7 @@ func archreloc(*ld.Target, *loader.Loader, *ld.ArchSyms, loader.Reloc, loader.Sy
|
||||||
return -1, 0, false
|
return -1, 0, false
|
||||||
}
|
}
|
||||||
|
|
||||||
func archrelocvariant(*ld.Target, *loader.Loader, loader.Reloc, sym.RelocVariant, loader.Sym, int64) int64 {
|
func archrelocvariant(*ld.Target, *loader.Loader, loader.Reloc, sym.RelocVariant, loader.Sym, int64, []byte) int64 {
|
||||||
log.Fatalf("unexpected relocation variant")
|
log.Fatalf("unexpected relocation variant")
|
||||||
return -1
|
return -1
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -565,7 +565,7 @@ func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loade
|
||||||
return val, 0, false
|
return val, 0, false
|
||||||
}
|
}
|
||||||
|
|
||||||
func archrelocvariant(*ld.Target, *loader.Loader, loader.Reloc, sym.RelocVariant, loader.Sym, int64) int64 {
|
func archrelocvariant(*ld.Target, *loader.Loader, loader.Reloc, sym.RelocVariant, loader.Sym, int64, []byte) int64 {
|
||||||
log.Fatalf("unexpected relocation variant")
|
log.Fatalf("unexpected relocation variant")
|
||||||
return -1
|
return -1
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -865,7 +865,7 @@ func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loade
|
||||||
return val, 0, false
|
return val, 0, false
|
||||||
}
|
}
|
||||||
|
|
||||||
func archrelocvariant(*ld.Target, *loader.Loader, loader.Reloc, sym.RelocVariant, loader.Sym, int64) int64 {
|
func archrelocvariant(*ld.Target, *loader.Loader, loader.Reloc, sym.RelocVariant, loader.Sym, int64, []byte) int64 {
|
||||||
log.Fatalf("unexpected relocation variant")
|
log.Fatalf("unexpected relocation variant")
|
||||||
return -1
|
return -1
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -507,7 +507,7 @@ func (st *relocSymState) relocsym(s loader.Sym, P []byte) {
|
||||||
|
|
||||||
if target.IsPPC64() || target.IsS390X() {
|
if target.IsPPC64() || target.IsS390X() {
|
||||||
if rv != sym.RV_NONE {
|
if rv != sym.RV_NONE {
|
||||||
o = thearch.Archrelocvariant(target, ldr, r, rv, s, o)
|
o = thearch.Archrelocvariant(target, ldr, r, rv, s, o, P)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -223,7 +223,7 @@ type Arch struct {
|
||||||
// to-be-relocated data item (from sym.P). Return is an updated
|
// to-be-relocated data item (from sym.P). Return is an updated
|
||||||
// offset value.
|
// offset value.
|
||||||
Archrelocvariant func(target *Target, ldr *loader.Loader, rel loader.Reloc,
|
Archrelocvariant func(target *Target, ldr *loader.Loader, rel loader.Reloc,
|
||||||
rv sym.RelocVariant, sym loader.Sym, offset int64) (relocatedOffset int64)
|
rv sym.RelocVariant, sym loader.Sym, offset int64, data []byte) (relocatedOffset int64)
|
||||||
|
|
||||||
// Generate a trampoline for a call from s to rs if necessary. ri is
|
// Generate a trampoline for a call from s to rs if necessary. ri is
|
||||||
// index of the relocation.
|
// index of the relocation.
|
||||||
|
|
|
||||||
|
|
@ -140,7 +140,7 @@ func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loade
|
||||||
return val, 0, false
|
return val, 0, false
|
||||||
}
|
}
|
||||||
|
|
||||||
func archrelocvariant(*ld.Target, *loader.Loader, loader.Reloc, sym.RelocVariant, loader.Sym, int64) int64 {
|
func archrelocvariant(*ld.Target, *loader.Loader, loader.Reloc, sym.RelocVariant, loader.Sym, int64, []byte) int64 {
|
||||||
return -1
|
return -1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -138,7 +138,7 @@ func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loade
|
||||||
return val, 0, false
|
return val, 0, false
|
||||||
}
|
}
|
||||||
|
|
||||||
func archrelocvariant(*ld.Target, *loader.Loader, loader.Reloc, sym.RelocVariant, loader.Sym, int64) int64 {
|
func archrelocvariant(*ld.Target, *loader.Loader, loader.Reloc, sym.RelocVariant, loader.Sym, int64, []byte) int64 {
|
||||||
return -1
|
return -1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -859,7 +859,7 @@ func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loade
|
||||||
return val, nExtReloc, false
|
return val, nExtReloc, false
|
||||||
}
|
}
|
||||||
|
|
||||||
func archrelocvariant(target *ld.Target, ldr *loader.Loader, r loader.Reloc, rv sym.RelocVariant, s loader.Sym, t int64) (relocatedOffset int64) {
|
func archrelocvariant(target *ld.Target, ldr *loader.Loader, r loader.Reloc, rv sym.RelocVariant, s loader.Sym, t int64, p []byte) (relocatedOffset int64) {
|
||||||
rs := ldr.ResolveABIAlias(r.Sym())
|
rs := ldr.ResolveABIAlias(r.Sym())
|
||||||
switch rv & sym.RV_TYPE_MASK {
|
switch rv & sym.RV_TYPE_MASK {
|
||||||
default:
|
default:
|
||||||
|
|
@ -875,9 +875,10 @@ func archrelocvariant(target *ld.Target, ldr *loader.Loader, r loader.Reloc, rv
|
||||||
// overflow depends on the instruction
|
// overflow depends on the instruction
|
||||||
var o1 uint32
|
var o1 uint32
|
||||||
if target.IsBigEndian() {
|
if target.IsBigEndian() {
|
||||||
o1 = binary.BigEndian.Uint32(ldr.Data(s)[r.Off()-2:])
|
o1 = binary.BigEndian.Uint32(p[r.Off()-2:])
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
o1 = binary.LittleEndian.Uint32(ldr.Data(s)[r.Off():])
|
o1 = binary.LittleEndian.Uint32(p[r.Off():])
|
||||||
}
|
}
|
||||||
switch o1 >> 26 {
|
switch o1 >> 26 {
|
||||||
case 24, // ori
|
case 24, // ori
|
||||||
|
|
@ -909,9 +910,9 @@ func archrelocvariant(target *ld.Target, ldr *loader.Loader, r loader.Reloc, rv
|
||||||
// overflow depends on the instruction
|
// overflow depends on the instruction
|
||||||
var o1 uint32
|
var o1 uint32
|
||||||
if target.IsBigEndian() {
|
if target.IsBigEndian() {
|
||||||
o1 = binary.BigEndian.Uint32(ldr.Data(s)[r.Off()-2:])
|
o1 = binary.BigEndian.Uint32(p[r.Off()-2:])
|
||||||
} else {
|
} else {
|
||||||
o1 = binary.LittleEndian.Uint32(ldr.Data(s)[r.Off():])
|
o1 = binary.LittleEndian.Uint32(p[r.Off():])
|
||||||
}
|
}
|
||||||
switch o1 >> 26 {
|
switch o1 >> 26 {
|
||||||
case 25, // oris
|
case 25, // oris
|
||||||
|
|
@ -933,9 +934,9 @@ func archrelocvariant(target *ld.Target, ldr *loader.Loader, r loader.Reloc, rv
|
||||||
case sym.RV_POWER_DS:
|
case sym.RV_POWER_DS:
|
||||||
var o1 uint32
|
var o1 uint32
|
||||||
if target.IsBigEndian() {
|
if target.IsBigEndian() {
|
||||||
o1 = uint32(binary.BigEndian.Uint16(ldr.Data(s)[r.Off():]))
|
o1 = uint32(binary.BigEndian.Uint16(p[r.Off():]))
|
||||||
} else {
|
} else {
|
||||||
o1 = uint32(binary.LittleEndian.Uint16(ldr.Data(s)[r.Off():]))
|
o1 = uint32(binary.LittleEndian.Uint16(p[r.Off():]))
|
||||||
}
|
}
|
||||||
if t&3 != 0 {
|
if t&3 != 0 {
|
||||||
ldr.Errorf(s, "relocation for %s+%d is not aligned: %d", ldr.SymName(rs), r.Off(), t)
|
ldr.Errorf(s, "relocation for %s+%d is not aligned: %d", ldr.SymName(rs), r.Off(), t)
|
||||||
|
|
|
||||||
|
|
@ -230,7 +230,7 @@ func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loade
|
||||||
return val, 0, false
|
return val, 0, false
|
||||||
}
|
}
|
||||||
|
|
||||||
func archrelocvariant(*ld.Target, *loader.Loader, loader.Reloc, sym.RelocVariant, loader.Sym, int64) int64 {
|
func archrelocvariant(*ld.Target, *loader.Loader, loader.Reloc, sym.RelocVariant, loader.Sym, int64, []byte) int64 {
|
||||||
log.Fatalf("archrelocvariant")
|
log.Fatalf("archrelocvariant")
|
||||||
return -1
|
return -1
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -371,7 +371,7 @@ func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loade
|
||||||
return val, 0, false
|
return val, 0, false
|
||||||
}
|
}
|
||||||
|
|
||||||
func archrelocvariant(target *ld.Target, ldr *loader.Loader, r loader.Reloc, rv sym.RelocVariant, s loader.Sym, t int64) int64 {
|
func archrelocvariant(target *ld.Target, ldr *loader.Loader, r loader.Reloc, rv sym.RelocVariant, s loader.Sym, t int64, p []byte) int64 {
|
||||||
switch rv & sym.RV_TYPE_MASK {
|
switch rv & sym.RV_TYPE_MASK {
|
||||||
default:
|
default:
|
||||||
ldr.Errorf(s, "unexpected relocation variant %d", rv)
|
ldr.Errorf(s, "unexpected relocation variant %d", rv)
|
||||||
|
|
|
||||||
|
|
@ -415,7 +415,7 @@ func archreloc(*ld.Target, *loader.Loader, *ld.ArchSyms, loader.Reloc, loader.Sy
|
||||||
return -1, 0, false
|
return -1, 0, false
|
||||||
}
|
}
|
||||||
|
|
||||||
func archrelocvariant(*ld.Target, *loader.Loader, loader.Reloc, sym.RelocVariant, loader.Sym, int64) int64 {
|
func archrelocvariant(*ld.Target, *loader.Loader, loader.Reloc, sym.RelocVariant, loader.Sym, int64, []byte) int64 {
|
||||||
log.Fatalf("unexpected relocation variant")
|
log.Fatalf("unexpected relocation variant")
|
||||||
return -1
|
return -1
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue