cmd/link: add and use new SymKind SFirstUnallocated

The linker sources in several places used SXREF to mark the first
SymKind which is not allocated in memory. This is cryptic.
Instead use SFirstUnallocated, following the example of the
existing SFirstWritable.

Change-Id: If326ad63027402699094bcc49ef860db3772f82a
Reviewed-on: https://go-review.googlesource.com/c/go/+/715623
Reviewed-by: Than McIntosh <thanm@golang.org>
Auto-Submit: Ian Lance Taylor <iant@golang.org>
Reviewed-by: Cherry Mui <cherryyz@google.com>
Reviewed-by: Michael Pratt <mpratt@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
This commit is contained in:
Ian Lance Taylor 2025-10-28 14:01:48 -07:00 committed by Gopher Robot
parent f5f14262d0
commit 6914dd11c0
7 changed files with 36 additions and 34 deletions

View file

@ -1628,9 +1628,9 @@ type dodataState struct {
// Link context // Link context
ctxt *Link ctxt *Link
// Data symbols bucketed by type. // Data symbols bucketed by type.
data [sym.SXREF][]loader.Sym data [sym.SFirstUnallocated][]loader.Sym
// Max alignment for each flavor of data symbol. // Max alignment for each flavor of data symbol.
dataMaxAlign [sym.SXREF]int32 dataMaxAlign [sym.SFirstUnallocated]int32
// Overridden sym type // Overridden sym type
symGroupType []sym.SymKind symGroupType []sym.SymKind
// Current data size so far. // Current data size so far.
@ -1687,7 +1687,7 @@ func (ctxt *Link) dodata(symGroupType []sym.SymKind) {
st := state.symType(s) st := state.symType(s)
if st <= sym.STEXTFIPSEND || st >= sym.SXREF { if st <= sym.STEXTEND || st >= sym.SFirstUnallocated {
continue continue
} }
state.data[st] = append(state.data[st], s) state.data[st] = append(state.data[st], s)
@ -2264,11 +2264,11 @@ func (state *dodataState) allocateDataSections(ctxt *Link) {
} }
siz := 0 siz := 0
for symn := sym.SELFRXSECT; symn < sym.SXREF; symn++ { for symn := sym.SELFRXSECT; symn < sym.SFirstUnallocated; symn++ {
siz += len(state.data[symn]) siz += len(state.data[symn])
} }
ctxt.datap = make([]loader.Sym, 0, siz) ctxt.datap = make([]loader.Sym, 0, siz)
for symn := sym.SELFRXSECT; symn < sym.SXREF; symn++ { for symn := sym.SELFRXSECT; symn < sym.SFirstUnallocated; symn++ {
ctxt.datap = append(ctxt.datap, state.data[symn]...) ctxt.datap = append(ctxt.datap, state.data[symn]...)
} }
} }

View file

@ -919,7 +919,7 @@ func collectmachosyms(ctxt *Link) {
continue continue
} }
t := ldr.SymType(s) t := ldr.SymType(s)
if t >= sym.SELFRXSECT && t < sym.SXREF { // data sections handled in dodata if t >= sym.SELFRXSECT && t < sym.SFirstUnallocated { // data sections handled in dodata
if t == sym.STLSBSS { if t == sym.STLSBSS {
// TLSBSS is not used on darwin. See data.go:allocateDataSections // TLSBSS is not used on darwin. See data.go:allocateDataSections
continue continue

View file

@ -854,7 +854,7 @@ func (f *peFile) writeSymbols(ctxt *Link) {
continue continue
} }
t := ldr.SymType(s) t := ldr.SymType(s)
if t >= sym.SELFRXSECT && t < sym.SXREF { // data sections handled in dodata if t >= sym.SELFRXSECT && t < sym.SFirstUnallocated { // data sections handled in dodata
if t == sym.STLSBSS { if t == sym.STLSBSS {
continue continue
} }

View file

@ -244,7 +244,7 @@ func genelfsym(ctxt *Link, elfbind elf.SymBind) {
continue continue
} }
st := ldr.SymType(s) st := ldr.SymType(s)
if st >= sym.SELFRXSECT && st < sym.SXREF { if st >= sym.SELFRXSECT && st < sym.SFirstUnallocated {
typ := elf.STT_OBJECT typ := elf.STT_OBJECT
if st == sym.STLSBSS { if st == sym.STLSBSS {
if ctxt.IsInternal() { if ctxt.IsInternal() {
@ -345,7 +345,7 @@ func asmbPlan9Sym(ctxt *Link) {
continue continue
} }
t := ldr.SymType(s) t := ldr.SymType(s)
if t >= sym.SELFRXSECT && t < sym.SXREF { // data sections handled in dodata if t >= sym.SELFRXSECT && t < sym.SFirstUnallocated { // data sections handled in dodata
if t == sym.STLSBSS { if t == sym.STLSBSS {
continue continue
} }
@ -843,7 +843,7 @@ func (ctxt *Link) symtab(pcln *pclntab) []sym.SymKind {
} }
// CarrierSymByType tracks carrier symbols and their sizes. // CarrierSymByType tracks carrier symbols and their sizes.
var CarrierSymByType [sym.SXREF]struct { var CarrierSymByType [sym.SFirstUnallocated]struct {
Sym loader.Sym Sym loader.Sym
Size int64 Size int64
} }

View file

@ -1121,7 +1121,7 @@ func (f *xcoffFile) asmaixsym(ctxt *Link) {
putaixsym(ctxt, s, BSSSym) putaixsym(ctxt, s, BSSSym)
} }
case st >= sym.SELFRXSECT && st < sym.SXREF: // data sections handled in dodata case st >= sym.SELFRXSECT && st < sym.SFirstUnallocated: // data sections handled in dodata
if ldr.AttrReachable(s) { if ldr.AttrReachable(s) {
putaixsym(ctxt, s, DataSym) putaixsym(ctxt, s, DataSym)
} }

View file

@ -125,6 +125,7 @@ const (
STLSBSS // Thread-local zeroed data. STLSBSS // Thread-local zeroed data.
// Unallocated segment. // Unallocated segment.
SFirstUnallocated
SXREF // Reference from non-Go object file. SXREF // Reference from non-Go object file.
SMACHOSYMSTR // Mach-O string table. SMACHOSYMSTR // Mach-O string table.
SMACHOSYMTAB // Mach-O symbol table. SMACHOSYMTAB // Mach-O symbol table.

View file

@ -67,32 +67,33 @@ func _() {
_ = x[SCOVERAGE_COUNTER-56] _ = x[SCOVERAGE_COUNTER-56]
_ = x[SCOVERAGE_AUXVAR-57] _ = x[SCOVERAGE_AUXVAR-57]
_ = x[STLSBSS-58] _ = x[STLSBSS-58]
_ = x[SXREF-59] _ = x[SFirstUnallocated-59]
_ = x[SMACHOSYMSTR-60] _ = x[SXREF-60]
_ = x[SMACHOSYMTAB-61] _ = x[SMACHOSYMSTR-61]
_ = x[SMACHOINDIRECTPLT-62] _ = x[SMACHOSYMTAB-62]
_ = x[SMACHOINDIRECTGOT-63] _ = x[SMACHOINDIRECTPLT-63]
_ = x[SDYNIMPORT-64] _ = x[SMACHOINDIRECTGOT-64]
_ = x[SHOSTOBJ-65] _ = x[SDYNIMPORT-65]
_ = x[SUNDEFEXT-66] _ = x[SHOSTOBJ-66]
_ = x[SDWARFSECT-67] _ = x[SUNDEFEXT-67]
_ = x[SDWARFCUINFO-68] _ = x[SDWARFSECT-68]
_ = x[SDWARFCONST-69] _ = x[SDWARFCUINFO-69]
_ = x[SDWARFFCN-70] _ = x[SDWARFCONST-70]
_ = x[SDWARFABSFCN-71] _ = x[SDWARFFCN-71]
_ = x[SDWARFTYPE-72] _ = x[SDWARFABSFCN-72]
_ = x[SDWARFVAR-73] _ = x[SDWARFTYPE-73]
_ = x[SDWARFRANGE-74] _ = x[SDWARFVAR-74]
_ = x[SDWARFLOC-75] _ = x[SDWARFRANGE-75]
_ = x[SDWARFLINES-76] _ = x[SDWARFLOC-76]
_ = x[SDWARFADDR-77] _ = x[SDWARFLINES-77]
_ = x[SSEHUNWINDINFO-78] _ = x[SDWARFADDR-78]
_ = x[SSEHSECT-79] _ = x[SSEHUNWINDINFO-79]
_ = x[SSEHSECT-80]
} }
const _SymKind_name = "SxxxSTEXTSTEXTFIPSSTARTSTEXTFIPSSTEXTFIPSENDSTEXTENDSELFRXSECTSMACHOPLTSTYPESSTRINGSGOSTRINGSGOFUNCSGCBITSSRODATASRODATAFIPSSTARTSRODATAFIPSSRODATAFIPSENDSRODATAENDSFUNCTABSELFROSECTSTYPERELROSSTRINGRELROSGOSTRINGRELROSGOFUNCRELROSGCBITSRELROSRODATARELROSFUNCTABRELROSELFRELROSECTSMACHORELROSECTSTYPELINKSITABLINKSSYMTABSPCLNTABSFirstWritableSBUILDINFOSFIPSINFOSELFSECTSMACHOSMACHOGOTSWINDOWSSELFGOTSNOPTRDATASNOPTRDATAFIPSSTARTSNOPTRDATAFIPSSNOPTRDATAFIPSENDSNOPTRDATAENDSINITARRSDATASDATAFIPSSTARTSDATAFIPSSDATAFIPSENDSDATAENDSXCOFFTOCSBSSSNOPTRBSSSLIBFUZZER_8BIT_COUNTERSCOVERAGE_COUNTERSCOVERAGE_AUXVARSTLSBSSSXREFSMACHOSYMSTRSMACHOSYMTABSMACHOINDIRECTPLTSMACHOINDIRECTGOTSDYNIMPORTSHOSTOBJSUNDEFEXTSDWARFSECTSDWARFCUINFOSDWARFCONSTSDWARFFCNSDWARFABSFCNSDWARFTYPESDWARFVARSDWARFRANGESDWARFLOCSDWARFLINESSDWARFADDRSSEHUNWINDINFOSSEHSECT" const _SymKind_name = "SxxxSTEXTSTEXTFIPSSTARTSTEXTFIPSSTEXTFIPSENDSTEXTENDSELFRXSECTSMACHOPLTSTYPESSTRINGSGOSTRINGSGOFUNCSGCBITSSRODATASRODATAFIPSSTARTSRODATAFIPSSRODATAFIPSENDSRODATAENDSFUNCTABSELFROSECTSTYPERELROSSTRINGRELROSGOSTRINGRELROSGOFUNCRELROSGCBITSRELROSRODATARELROSFUNCTABRELROSELFRELROSECTSMACHORELROSECTSTYPELINKSITABLINKSSYMTABSPCLNTABSFirstWritableSBUILDINFOSFIPSINFOSELFSECTSMACHOSMACHOGOTSWINDOWSSELFGOTSNOPTRDATASNOPTRDATAFIPSSTARTSNOPTRDATAFIPSSNOPTRDATAFIPSENDSNOPTRDATAENDSINITARRSDATASDATAFIPSSTARTSDATAFIPSSDATAFIPSENDSDATAENDSXCOFFTOCSBSSSNOPTRBSSSLIBFUZZER_8BIT_COUNTERSCOVERAGE_COUNTERSCOVERAGE_AUXVARSTLSBSSSFirstUnallocatedSXREFSMACHOSYMSTRSMACHOSYMTABSMACHOINDIRECTPLTSMACHOINDIRECTGOTSDYNIMPORTSHOSTOBJSUNDEFEXTSDWARFSECTSDWARFCUINFOSDWARFCONSTSDWARFFCNSDWARFABSFCNSDWARFTYPESDWARFVARSDWARFRANGESDWARFLOCSDWARFLINESSDWARFADDRSSEHUNWINDINFOSSEHSECT"
var _SymKind_index = [...]uint16{0, 4, 9, 23, 32, 44, 52, 62, 71, 76, 83, 92, 99, 106, 113, 129, 140, 154, 164, 172, 182, 192, 204, 218, 230, 242, 254, 267, 280, 295, 304, 313, 320, 328, 342, 352, 361, 369, 375, 384, 392, 399, 409, 428, 442, 459, 472, 480, 485, 499, 508, 520, 528, 537, 541, 550, 573, 590, 606, 613, 618, 630, 642, 659, 676, 686, 694, 703, 713, 725, 736, 745, 757, 767, 776, 787, 796, 807, 817, 831, 839} var _SymKind_index = [...]uint16{0, 4, 9, 23, 32, 44, 52, 62, 71, 76, 83, 92, 99, 106, 113, 129, 140, 154, 164, 172, 182, 192, 204, 218, 230, 242, 254, 267, 280, 295, 304, 313, 320, 328, 342, 352, 361, 369, 375, 384, 392, 399, 409, 428, 442, 459, 472, 480, 485, 499, 508, 520, 528, 537, 541, 550, 573, 590, 606, 613, 630, 635, 647, 659, 676, 693, 703, 711, 720, 730, 742, 753, 762, 774, 784, 793, 804, 813, 824, 834, 848, 856}
func (i SymKind) String() string { func (i SymKind) String() string {
if i >= SymKind(len(_SymKind_index)-1) { if i >= SymKind(len(_SymKind_index)-1) {