]> Cypherpunks repositories - gostls13.git/commitdiff
[dev.link] cmd/link/internal/loader: add elf symbol methods
authorThan McIntosh <thanm@google.com>
Tue, 28 Apr 2020 14:37:33 +0000 (10:37 -0400)
committerThan McIntosh <thanm@google.com>
Tue, 28 Apr 2020 18:57:48 +0000 (18:57 +0000)
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>

src/cmd/link/internal/loader/loader.go

index 2e4f5de0ee9d598b23f1ffd830a4b0eb0c887d50..1c687ee3e29af3ae89110ee92e2c21a69c321bbb 100644 (file)
@@ -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 {