mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
cmd/internal/obj, cmd/link: record ABIs and aliases in Go obj files
This repurposes the "version" field of a symbol reference in the Go object file format to be an ABI field. Currently, this is just 0 or 1 depending on whether the symbol is static (the linker turns it into a different internal version number), so it's already only tenuously a symbol version. We change this to be -1 for static symbols and otherwise by the ABI number. This also adds a separate list of ABI alias symbols to be recorded in the object file. The ABI aliases must be a separate list and not just part of the symbol definitions because it's possible to have a symbol defined in one package and the alias "defined" in a different package. For example, this can happen if a symbol is defined in assembly in one package and stubbed in a different package. The stub triggers the generation of the ABI alias, but in a different package from the definition. For #27539. Change-Id: I015c9fe54690c027de6ef77e22b5585976a01587 Reviewed-on: https://go-review.googlesource.com/c/147157 Run-TryBot: Austin Clements <austin@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: David Chase <drchase@google.com>
This commit is contained in:
parent
07544c7e80
commit
c5718b6b26
6 changed files with 96 additions and 26 deletions
|
|
@ -5,6 +5,7 @@
|
|||
package sym
|
||||
|
||||
import (
|
||||
"cmd/internal/obj"
|
||||
"cmd/internal/objabi"
|
||||
"cmd/internal/sys"
|
||||
"debug/elf"
|
||||
|
|
@ -52,9 +53,21 @@ type AuxSymbol struct {
|
|||
}
|
||||
|
||||
const (
|
||||
SymVerStatic = 10 // Minimum version used by static (file-local) syms
|
||||
SymVerABI0 = 0
|
||||
SymVerABIInternal = 1
|
||||
SymVerStatic = 10 // Minimum version used by static (file-local) syms
|
||||
)
|
||||
|
||||
func ABIToVersion(abi obj.ABI) int {
|
||||
switch abi {
|
||||
case obj.ABI0:
|
||||
return SymVerABI0
|
||||
case obj.ABIInternal:
|
||||
return SymVerABIInternal
|
||||
}
|
||||
return -1
|
||||
}
|
||||
|
||||
func (s *Symbol) String() string {
|
||||
if s.Version == 0 {
|
||||
return s.Name
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue