aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/internal
diff options
context:
space:
mode:
authorCherry Zhang <cherryyz@google.com>2020-11-08 11:27:53 -0500
committerCherry Zhang <cherryyz@google.com>2021-03-05 23:34:43 +0000
commitf901ea701ddac5a4d600d49007e54caa32b4c9b5 (patch)
tree30fc1857082153506af456117a382a224302887c /src/cmd/internal
parent87d29939c8f93799ce889d98e0e5579d1eb2ffe5 (diff)
downloadgo-f901ea701ddac5a4d600d49007e54caa32b4c9b5.tar.xz
cmd/internal/goobj: store relocation type as uint16
Currently, relocation type is stored as uint8 in object files, as Go relocations do not exceed 255. In the linker, however, it is used as a 16-bit type, because external relocations can exceed 255. The linker has to store the extra byte in a side table. This complicates many things. Just store it as uint16 in object files. This simplifies things, with a small cost of increasing the object file sizes. before after hello.o 1672 1678 runtime.a 7927784 8056194 Change-Id: I313cf44ad0b8b3b76e35055ae55d911ff35e3158 Reviewed-on: https://go-review.googlesource.com/c/go/+/268477 Trust: Cherry Zhang <cherryyz@google.com> Run-TryBot: Cherry Zhang <cherryyz@google.com> TryBot-Result: Go Bot <gobot@golang.org> Reviewed-by: Than McIntosh <thanm@google.com>
Diffstat (limited to 'src/cmd/internal')
-rw-r--r--src/cmd/internal/goobj/objfile.go34
-rw-r--r--src/cmd/internal/goobj/objfile_test.go4
-rw-r--r--src/cmd/internal/obj/objfile.go2
3 files changed, 20 insertions, 20 deletions
diff --git a/src/cmd/internal/goobj/objfile.go b/src/cmd/internal/goobj/objfile.go
index 247cc695f0..e2858bd57d 100644
--- a/src/cmd/internal/goobj/objfile.go
+++ b/src/cmd/internal/goobj/objfile.go
@@ -33,7 +33,7 @@ import (
// New object file format.
//
// Header struct {
-// Magic [...]byte // "\x00go116ld"
+// Magic [...]byte // "\x00go117ld"
// Fingerprint [8]byte
// Flags uint32
// Offsets [...]uint32 // byte offset of each block below
@@ -89,7 +89,7 @@ import (
// Relocs [...]struct {
// Off int32
// Size uint8
-// Type uint8
+// Type uint16
// Add int64
// Sym symRef
// }
@@ -219,7 +219,7 @@ type Header struct {
Offsets [NBlk]uint32
}
-const Magic = "\x00go116ld"
+const Magic = "\x00go117ld"
func (h *Header) Write(w *Writer) {
w.RawString(h.Magic)
@@ -373,32 +373,32 @@ const HashSize = sha1.Size
// Reloc struct {
// Off int32
// Siz uint8
-// Type uint8
+// Type uint16
// Add int64
// Sym SymRef
// }
type Reloc [RelocSize]byte
-const RelocSize = 4 + 1 + 1 + 8 + 8
+const RelocSize = 4 + 1 + 2 + 8 + 8
-func (r *Reloc) Off() int32 { return int32(binary.LittleEndian.Uint32(r[:])) }
-func (r *Reloc) Siz() uint8 { return r[4] }
-func (r *Reloc) Type() uint8 { return r[5] }
-func (r *Reloc) Add() int64 { return int64(binary.LittleEndian.Uint64(r[6:])) }
+func (r *Reloc) Off() int32 { return int32(binary.LittleEndian.Uint32(r[:])) }
+func (r *Reloc) Siz() uint8 { return r[4] }
+func (r *Reloc) Type() uint16 { return binary.LittleEndian.Uint16(r[5:]) }
+func (r *Reloc) Add() int64 { return int64(binary.LittleEndian.Uint64(r[7:])) }
func (r *Reloc) Sym() SymRef {
- return SymRef{binary.LittleEndian.Uint32(r[14:]), binary.LittleEndian.Uint32(r[18:])}
+ return SymRef{binary.LittleEndian.Uint32(r[15:]), binary.LittleEndian.Uint32(r[19:])}
}
-func (r *Reloc) SetOff(x int32) { binary.LittleEndian.PutUint32(r[:], uint32(x)) }
-func (r *Reloc) SetSiz(x uint8) { r[4] = x }
-func (r *Reloc) SetType(x uint8) { r[5] = x }
-func (r *Reloc) SetAdd(x int64) { binary.LittleEndian.PutUint64(r[6:], uint64(x)) }
+func (r *Reloc) SetOff(x int32) { binary.LittleEndian.PutUint32(r[:], uint32(x)) }
+func (r *Reloc) SetSiz(x uint8) { r[4] = x }
+func (r *Reloc) SetType(x uint16) { binary.LittleEndian.PutUint16(r[5:], x) }
+func (r *Reloc) SetAdd(x int64) { binary.LittleEndian.PutUint64(r[7:], uint64(x)) }
func (r *Reloc) SetSym(x SymRef) {
- binary.LittleEndian.PutUint32(r[14:], x.PkgIdx)
- binary.LittleEndian.PutUint32(r[18:], x.SymIdx)
+ binary.LittleEndian.PutUint32(r[15:], x.PkgIdx)
+ binary.LittleEndian.PutUint32(r[19:], x.SymIdx)
}
-func (r *Reloc) Set(off int32, size uint8, typ uint8, add int64, sym SymRef) {
+func (r *Reloc) Set(off int32, size uint8, typ uint16, add int64, sym SymRef) {
r.SetOff(off)
r.SetSiz(size)
r.SetType(typ)
diff --git a/src/cmd/internal/goobj/objfile_test.go b/src/cmd/internal/goobj/objfile_test.go
index 99d02a1bf1..ad80ede0f3 100644
--- a/src/cmd/internal/goobj/objfile_test.go
+++ b/src/cmd/internal/goobj/objfile_test.go
@@ -40,7 +40,7 @@ func TestReadWrite(t *testing.T) {
var r Reloc
r.SetOff(12)
r.SetSiz(4)
- r.SetType(uint8(objabi.R_ADDR))
+ r.SetType(uint16(objabi.R_ADDR))
r.SetAdd(54321)
r.SetSym(SymRef{11, 22})
r.Write(w)
@@ -63,7 +63,7 @@ func TestReadWrite(t *testing.T) {
b = b[SymSize:]
var r2 Reloc
r2.fromBytes(b)
- if r2.Off() != 12 || r2.Siz() != 4 || r2.Type() != uint8(objabi.R_ADDR) || r2.Add() != 54321 || r2.Sym() != (SymRef{11, 22}) {
+ if r2.Off() != 12 || r2.Siz() != 4 || r2.Type() != uint16(objabi.R_ADDR) || r2.Add() != 54321 || r2.Sym() != (SymRef{11, 22}) {
t.Errorf("read Reloc2 mismatch: got %v %v %v %v %v", r2.Off(), r2.Siz(), r2.Type(), r2.Add(), r2.Sym())
}
diff --git a/src/cmd/internal/obj/objfile.go b/src/cmd/internal/obj/objfile.go
index b031afbc36..24fb5a19de 100644
--- a/src/cmd/internal/obj/objfile.go
+++ b/src/cmd/internal/obj/objfile.go
@@ -498,7 +498,7 @@ func (w *writer) Reloc(r *Reloc) {
var o goobj.Reloc
o.SetOff(r.Off)
o.SetSiz(r.Siz)
- o.SetType(uint8(r.Type))
+ o.SetType(uint16(r.Type))
o.SetAdd(r.Add)
o.SetSym(makeSymRef(r.Sym))
o.Write(w.Writer)