]> Cypherpunks.ru repositories - gostls13.git/commitdiff
[dev.link] cmd/link/internal/loader: add SetRelocType symbolbuilder method
authorThan McIntosh <thanm@google.com>
Thu, 23 Apr 2020 13:18:44 +0000 (09:18 -0400)
committerThan McIntosh <thanm@google.com>
Fri, 24 Apr 2020 13:41:32 +0000 (13:41 +0000)
Clients may need to invoke the loader.Reloc2.SetType method to reset
the type of a relocation from external flavor to internal flavor,
meaning that the external type add-in needs to be zeroed (this is
needed when adding dynsym entries).

Add a new SymbolBuider method to support mutating the type of a reloc
for an external symbol, so that the external type can be changed as
well (Reloc2 doesn't have access to that). Also add similar methods
for updating target symbol and addend, so as to have a consistent
interface for ext reloc mutation.

Change-Id: I8e26cdae0a0f353019acba5f9c8a0506e3970266
Reviewed-on: https://go-review.googlesource.com/c/go/+/229604
Reviewed-by: Cherry Zhang <cherryyz@google.com>
Reviewed-by: Jeremy Faller <jeremy@golang.org>
src/cmd/link/internal/loader/loader.go
src/cmd/link/internal/loader/symbolbuilder.go

index ba0cff3ff66c4a2d6c73c71562f965bc6dac4f3a..c0893daeceb34cddcaba9ac76dca4dbe618020a7 100644 (file)
@@ -58,7 +58,7 @@ type Reloc2 struct {
 
        // External reloc types may not fit into a uint8 which the Go object file uses.
        // Store it here, instead of in the byte of goobj2.Reloc2.
-       // For Go symbols this will always be 0.
+       // For Go symbols this will always be zero.
        // goobj2.Reloc2.Type() + typ is always the right type, for both Go and external
        // symbols.
        typ objabi.RelocType
@@ -73,6 +73,10 @@ func (rel Reloc2) SetType(t objabi.RelocType) {
                panic("SetType: type doesn't fit into Reloc2")
        }
        rel.Reloc.SetType(uint8(t))
+       if rel.typ != 0 {
+               // should use SymbolBuilder.SetRelocType
+               panic("wrong method to set reloc type")
+       }
 }
 
 // Aux2 holds a "handle" to access an aux symbol record from an
index f5db69856be58ef05eaf0cf379d1a11bfbc9be4f..21ed621f80b31d398dfed1c5b1516acbdb73c751 100644 (file)
@@ -143,6 +143,22 @@ func (sb *SymbolBuilder) SetRelocs(rslice []Reloc) {
        }
 }
 
+// SetRelocType sets the type of the 'i'-th relocation on this sym to 't'
+func (sb *SymbolBuilder) SetRelocType(i int, t objabi.RelocType) {
+       sb.relocs[i].SetType(0)
+       sb.reltypes[i] = t
+}
+
+// SetRelocSym sets the target sym of the 'i'-th relocation on this sym to 's'
+func (sb *SymbolBuilder) SetRelocSym(i int, tgt Sym) {
+       sb.relocs[i].SetSym(goobj2.SymRef{PkgIdx: 0, SymIdx: uint32(tgt)})
+}
+
+// SetRelocAdd sets the addend of the 'i'-th relocation on this sym to 'a'
+func (sb *SymbolBuilder) SetRelocAdd(i int, a int64) {
+       sb.relocs[i].SetAdd(a)
+}
+
 // Add n relocations, return a handle to the relocations.
 func (sb *SymbolBuilder) AddRelocs(n int) Relocs {
        sb.relocs = append(sb.relocs, make([]goobj2.Reloc, n)...)