aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/link/internal/loader/loader.go
diff options
context:
space:
mode:
authorThan McIntosh <thanm@google.com>2020-04-28 10:37:33 -0400
committerThan McIntosh <thanm@google.com>2020-04-28 18:57:48 +0000
commit12b11f3af9be5421ba330136b34efe1d8c80e1d6 (patch)
treedb1b02061869cf3460c1fe62be51500338f22385 /src/cmd/link/internal/loader/loader.go
parent183d25d9963107e6e4e86c49018ddd8871109d61 (diff)
downloadgo-12b11f3af9be5421ba330136b34efe1d8c80e1d6.tar.gz
go-12b11f3af9be5421ba330136b34efe1d8c80e1d6.zip
[dev.link] cmd/link/internal/loader: add elf symbol methods
Add new get/set methods to the loader for recording the ELF symbol index for a given loader symbol. These are map-based, since it is expected that many/most symbols will not need an ELF symbol table entry. Change-Id: I1102c3637775515ccc6650118e8b059468a2c3ea Reviewed-on: https://go-review.googlesource.com/c/go/+/230461 Run-TryBot: Than McIntosh <thanm@google.com> Reviewed-by: Cherry Zhang <cherryyz@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org>
Diffstat (limited to 'src/cmd/link/internal/loader/loader.go')
-rw-r--r--src/cmd/link/internal/loader/loader.go58
1 files changed, 49 insertions, 9 deletions
diff --git a/src/cmd/link/internal/loader/loader.go b/src/cmd/link/internal/loader/loader.go
index 2e4f5de0ee..1c687ee3e2 100644
--- a/src/cmd/link/internal/loader/loader.go
+++ b/src/cmd/link/internal/loader/loader.go
@@ -255,15 +255,17 @@ type Loader struct {
align map[Sym]int32 // stores alignment for symbols
- dynimplib map[Sym]string // stores Dynimplib symbol attribute
- dynimpvers map[Sym]string // stores Dynimpvers symbol attribute
- localentry map[Sym]uint8 // stores Localentry symbol attribute
- extname map[Sym]string // stores Extname symbol attribute
- elfType map[Sym]elf.SymType // stores elf type symbol property
- symPkg map[Sym]string // stores package for symbol, or library for shlib-derived syms
- plt map[Sym]int32 // stores dynimport for pe objects
- got map[Sym]int32 // stores got for pe objects
- dynid map[Sym]int32 // stores Dynid for symbol
+ dynimplib map[Sym]string // stores Dynimplib symbol attribute
+ dynimpvers map[Sym]string // stores Dynimpvers symbol attribute
+ localentry map[Sym]uint8 // stores Localentry symbol attribute
+ extname map[Sym]string // stores Extname symbol attribute
+ elfType map[Sym]elf.SymType // stores elf type symbol property
+ elfSym map[Sym]int32 // stores elf sym symbol property
+ localElfSym map[Sym]int32 // stores "local" elf sym symbol property
+ symPkg map[Sym]string // stores package for symbol, or library for shlib-derived syms
+ plt map[Sym]int32 // stores dynimport for pe objects
+ got map[Sym]int32 // stores got for pe objects
+ dynid map[Sym]int32 // stores Dynid for symbol
relocVariant map[relocId]sym.RelocVariant // stores variant relocs
@@ -331,6 +333,8 @@ func NewLoader(flags uint32, elfsetstring elfsetstringFunc, reporter *ErrorRepor
extname: make(map[Sym]string),
attrReadOnly: make(map[Sym]bool),
elfType: make(map[Sym]elf.SymType),
+ elfSym: make(map[Sym]int32),
+ localElfSym: make(map[Sym]int32),
symPkg: make(map[Sym]string),
plt: make(map[Sym]int32),
got: make(map[Sym]int32),
@@ -1235,6 +1239,42 @@ func (l *Loader) SetSymElfType(i Sym, et elf.SymType) {
}
}
+// SymElfSym returns the ELF symbol index for a given loader
+// symbol, assigned during ELF symtab generation.
+func (l *Loader) SymElfSym(i Sym) int32 {
+ return l.elfSym[i]
+}
+
+// SetSymElfSym sets the elf symbol index for a symbol.
+func (l *Loader) SetSymElfSym(i Sym, es int32) {
+ if i == 0 {
+ panic("bad sym index")
+ }
+ if es == 0 {
+ delete(l.elfSym, i)
+ } else {
+ l.elfSym[i] = es
+ }
+}
+
+// SymLocalElfSym returns the "local" ELF symbol index for a given loader
+// symbol, assigned during ELF symtab generation.
+func (l *Loader) SymLocalElfSym(i Sym) int32 {
+ return l.localElfSym[i]
+}
+
+// SetSymLocalElfSym sets the "local" elf symbol index for a symbol.
+func (l *Loader) SetSymLocalElfSym(i Sym, es int32) {
+ if i == 0 {
+ panic("bad sym index")
+ }
+ if es == 0 {
+ delete(l.localElfSym, i)
+ } else {
+ l.localElfSym[i] = es
+ }
+}
+
// SymPlt returns the plt value for pe symbols.
func (l *Loader) SymPlt(s Sym) int32 {
if v, ok := l.plt[s]; ok {