]> git.feebdaed.xyz Git - 0xmirror/go.git/commitdiff
cmd/link: put moduledata in its own .go.module section
authorIan Lance Taylor <iant@golang.org>
Fri, 14 Nov 2025 19:48:55 +0000 (11:48 -0800)
committerIan Lance Taylor <iant@golang.org>
Thu, 27 Nov 2025 04:07:41 +0000 (20:07 -0800)
There is a test for this in CL 721480 later in this series.

For #76038

Change-Id: Ib7ed1f0b0aed2d929ca0f135b54d6b62112cae30
Reviewed-on: https://go-review.googlesource.com/c/go/+/720660
TryBot-Bypass: David Chase <drchase@google.com>
Reviewed-by: Cherry Mui <cherryyz@google.com>
Reviewed-by: David Chase <drchase@google.com>
src/cmd/link/internal/ld/data.go
src/cmd/link/internal/ld/lib.go
src/cmd/link/internal/ld/xcoff.go
src/cmd/link/internal/sym/symkind.go
src/cmd/link/internal/sym/symkind_string.go
src/cmd/link/internal/wasm/asm.go

index f25b6c11da9ae71ecdefc260921a1933a5f08fee..5b6dabb62b58cb6dff26d158ad7b7c5d9198aa22 100644 (file)
@@ -1937,6 +1937,26 @@ func (state *dodataState) allocateDataSections(ctxt *Link) {
        }
        ldr := ctxt.loader
 
+       // SMODULEDATA needs to be writable, but the GC doesn't need to
+       // look at it. We don't use allocateSingleSymSections because
+       // the name of the section is not the name of the symbol.
+       if len(state.data[sym.SMODULEDATA]) > 0 {
+               if len(state.data[sym.SMODULEDATA]) != 1 {
+                       Errorf("internal error: more than one SMODULEDATA symbol")
+               }
+               s := state.data[sym.SMODULEDATA][0]
+               sect := addsection(ldr, ctxt.Arch, &Segdata, ".go.module", 06)
+               sect.Align = symalign(ldr, s)
+               state.datsize = Rnd(state.datsize, int64(sect.Align))
+               sect.Vaddr = uint64(state.datsize)
+               ldr.SetSymSect(s, sect)
+               state.setSymType(s, sym.SDATA)
+               ldr.SetSymValue(s, int64(uint64(state.datsize)-sect.Vaddr))
+               state.datsize += ldr.SymSize(s)
+               sect.Length = uint64(state.datsize) - sect.Vaddr
+               state.checkdatsize(sym.SMODULEDATA)
+       }
+
        // writable .got (note that for PIE binaries .got goes in relro)
        if len(state.data[sym.SELFGOT]) > 0 {
                state.allocateNamedSectionAndAssignSyms(&Segdata, ".got", sym.SELFGOT, sym.SDATA, 06)
index 2c861129b52f9abb00b7b7feef3600acd9ae4484..22ee13dff87eca7c5768ff9c788e1dc3d2fdc5b1 100644 (file)
@@ -923,9 +923,7 @@ func (ctxt *Link) linksetup() {
                mdsb = ctxt.loader.MakeSymbolUpdater(moduledata)
                ctxt.loader.SetAttrLocal(moduledata, true)
        }
-       // In all cases way we mark the moduledata as noptrdata to hide it from
-       // the GC.
-       mdsb.SetType(sym.SNOPTRDATA)
+       mdsb.SetType(sym.SMODULEDATA)
        ctxt.loader.SetAttrReachable(moduledata, true)
        ctxt.Moduledata = moduledata
 
index 4500a7cb0c95b3f879c5aef941f8aff336871679..77ae1236c9c0105a147b0a6fabe9e63ff9ec59ad 100644 (file)
@@ -1254,7 +1254,7 @@ func Xcoffadddynrel(target *Target, ldr *loader.Loader, syms *ArchSyms, s loader
                                        break
                                }
                        }
-               } else if t := ldr.SymType(s); t.IsDATA() || t.IsNOPTRDATA() || t == sym.SBUILDINFO || t == sym.SXCOFFTOC {
+               } else if t := ldr.SymType(s); t.IsDATA() || t.IsNOPTRDATA() || t == sym.SBUILDINFO || t == sym.SXCOFFTOC || t == sym.SMODULEDATA {
                        switch ldr.SymSect(targ).Seg {
                        default:
                                ldr.Errorf(s, "unknown segment for .loader relocation with symbol %s", ldr.SymName(targ))
index 8709e7b48f8a2a20085591540865386d3ba2b5cb..746a12efd6252cd804d6a75659b9c97de6810fd8 100644 (file)
@@ -99,9 +99,10 @@ const (
        SFIPSINFO           // go:fipsinfo aka crypto/internal/fips140/check.Linkinfo (why is this writable)?
        SELFSECT            // .got.plt, .plt, .dynamic where appropriate.
        SMACHO              // Used only for .llvmasm?
-       SMACHOGOT           // Mach-O GOT.
        SWINDOWS            // Windows dynamic symbols.
+       SMODULEDATA         // Linker generated moduledata struct.
        SELFGOT             // Writable ELF GOT section.
+       SMACHOGOT           // Mach-O GOT.
        SNOPTRDATA          // Data with no heap pointers.
        SNOPTRDATAFIPSSTART // Start of FIPS non-pointer writable data.
        SNOPTRDATAFIPS      // FIPS non-pointer writable data.
index 019e7c746a679db5f6723bc5a20ac7a8ae872d21..80da278b3323a7df7003f4984f005f5ce7f434f5 100644 (file)
@@ -45,54 +45,55 @@ func _() {
        _ = x[SFIPSINFO-34]
        _ = x[SELFSECT-35]
        _ = x[SMACHO-36]
-       _ = x[SMACHOGOT-37]
-       _ = x[SWINDOWS-38]
+       _ = x[SWINDOWS-37]
+       _ = x[SMODULEDATA-38]
        _ = x[SELFGOT-39]
-       _ = x[SNOPTRDATA-40]
-       _ = x[SNOPTRDATAFIPSSTART-41]
-       _ = x[SNOPTRDATAFIPS-42]
-       _ = x[SNOPTRDATAFIPSEND-43]
-       _ = x[SNOPTRDATAEND-44]
-       _ = x[SINITARR-45]
-       _ = x[SDATA-46]
-       _ = x[SDATAFIPSSTART-47]
-       _ = x[SDATAFIPS-48]
-       _ = x[SDATAFIPSEND-49]
-       _ = x[SDATAEND-50]
-       _ = x[SXCOFFTOC-51]
-       _ = x[SBSS-52]
-       _ = x[SNOPTRBSS-53]
-       _ = x[SLIBFUZZER_8BIT_COUNTER-54]
-       _ = x[SCOVERAGE_COUNTER-55]
-       _ = x[SCOVERAGE_AUXVAR-56]
-       _ = x[STLSBSS-57]
-       _ = x[SFirstUnallocated-58]
-       _ = x[SXREF-59]
-       _ = x[SMACHOSYMSTR-60]
-       _ = x[SMACHOSYMTAB-61]
-       _ = x[SMACHOINDIRECTPLT-62]
-       _ = x[SMACHOINDIRECTGOT-63]
-       _ = x[SDYNIMPORT-64]
-       _ = x[SHOSTOBJ-65]
-       _ = x[SUNDEFEXT-66]
-       _ = x[SDWARFSECT-67]
-       _ = x[SDWARFCUINFO-68]
-       _ = x[SDWARFCONST-69]
-       _ = x[SDWARFFCN-70]
-       _ = x[SDWARFABSFCN-71]
-       _ = x[SDWARFTYPE-72]
-       _ = x[SDWARFVAR-73]
-       _ = x[SDWARFRANGE-74]
-       _ = x[SDWARFLOC-75]
-       _ = x[SDWARFLINES-76]
-       _ = x[SDWARFADDR-77]
-       _ = x[SSEHUNWINDINFO-78]
-       _ = x[SSEHSECT-79]
+       _ = x[SMACHOGOT-40]
+       _ = x[SNOPTRDATA-41]
+       _ = x[SNOPTRDATAFIPSSTART-42]
+       _ = x[SNOPTRDATAFIPS-43]
+       _ = x[SNOPTRDATAFIPSEND-44]
+       _ = x[SNOPTRDATAEND-45]
+       _ = x[SINITARR-46]
+       _ = x[SDATA-47]
+       _ = x[SDATAFIPSSTART-48]
+       _ = x[SDATAFIPS-49]
+       _ = x[SDATAFIPSEND-50]
+       _ = x[SDATAEND-51]
+       _ = x[SXCOFFTOC-52]
+       _ = x[SBSS-53]
+       _ = x[SNOPTRBSS-54]
+       _ = x[SLIBFUZZER_8BIT_COUNTER-55]
+       _ = x[SCOVERAGE_COUNTER-56]
+       _ = x[SCOVERAGE_AUXVAR-57]
+       _ = x[STLSBSS-58]
+       _ = x[SFirstUnallocated-59]
+       _ = x[SXREF-60]
+       _ = x[SMACHOSYMSTR-61]
+       _ = x[SMACHOSYMTAB-62]
+       _ = x[SMACHOINDIRECTPLT-63]
+       _ = x[SMACHOINDIRECTGOT-64]
+       _ = x[SDYNIMPORT-65]
+       _ = x[SHOSTOBJ-66]
+       _ = x[SUNDEFEXT-67]
+       _ = x[SDWARFSECT-68]
+       _ = x[SDWARFCUINFO-69]
+       _ = x[SDWARFCONST-70]
+       _ = x[SDWARFFCN-71]
+       _ = x[SDWARFABSFCN-72]
+       _ = x[SDWARFTYPE-73]
+       _ = x[SDWARFVAR-74]
+       _ = x[SDWARFRANGE-75]
+       _ = x[SDWARFLOC-76]
+       _ = x[SDWARFLINES-77]
+       _ = x[SDWARFADDR-78]
+       _ = x[SSEHUNWINDINFO-79]
+       _ = x[SSEHSECT-80]
 }
 
-const _SymKind_name = "SxxxSTEXTSTEXTFIPSSTARTSTEXTFIPSSTEXTFIPSENDSTEXTENDSELFRXSECTSMACHOPLTSTYPESSTRINGSGOSTRINGSGOFUNCSGCBITSSRODATASRODATAFIPSSTARTSRODATAFIPSSRODATAFIPSENDSRODATAENDSFUNCTABSPCLNTABSELFROSECTSTYPERELROSSTRINGRELROSGOSTRINGRELROSGOFUNCRELROSGCBITSRELROSRODATARELROSFUNCTABRELROSELFRELROSECTSMACHORELROSECTSTYPELINKSITABLINKSFirstWritableSBUILDINFOSFIPSINFOSELFSECTSMACHOSMACHOGOTSWINDOWSSELFGOTSNOPTRDATASNOPTRDATAFIPSSTARTSNOPTRDATAFIPSSNOPTRDATAFIPSENDSNOPTRDATAENDSINITARRSDATASDATAFIPSSTARTSDATAFIPSSDATAFIPSENDSDATAENDSXCOFFTOCSBSSSNOPTRBSSSLIBFUZZER_8BIT_COUNTERSCOVERAGE_COUNTERSCOVERAGE_AUXVARSTLSBSSSFirstUnallocatedSXREFSMACHOSYMSTRSMACHOSYMTABSMACHOINDIRECTPLTSMACHOINDIRECTGOTSDYNIMPORTSHOSTOBJSUNDEFEXTSDWARFSECTSDWARFCUINFOSDWARFCONSTSDWARFFCNSDWARFABSFCNSDWARFTYPESDWARFVARSDWARFRANGESDWARFLOCSDWARFLINESSDWARFADDRSSEHUNWINDINFOSSEHSECT"
+const _SymKind_name = "SxxxSTEXTSTEXTFIPSSTARTSTEXTFIPSSTEXTFIPSENDSTEXTENDSELFRXSECTSMACHOPLTSTYPESSTRINGSGOSTRINGSGOFUNCSGCBITSSRODATASRODATAFIPSSTARTSRODATAFIPSSRODATAFIPSENDSRODATAENDSFUNCTABSPCLNTABSELFROSECTSTYPERELROSSTRINGRELROSGOSTRINGRELROSGOFUNCRELROSGCBITSRELROSRODATARELROSFUNCTABRELROSELFRELROSECTSMACHORELROSECTSTYPELINKSITABLINKSFirstWritableSBUILDINFOSFIPSINFOSELFSECTSMACHOSWINDOWSSMODULEDATASELFGOTSMACHOGOTSNOPTRDATASNOPTRDATAFIPSSTARTSNOPTRDATAFIPSSNOPTRDATAFIPSENDSNOPTRDATAENDSINITARRSDATASDATAFIPSSTARTSDATAFIPSSDATAFIPSENDSDATAENDSXCOFFTOCSBSSSNOPTRBSSSLIBFUZZER_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, 180, 190, 200, 212, 226, 238, 250, 262, 275, 288, 303, 312, 321, 335, 345, 354, 362, 368, 377, 385, 392, 402, 421, 435, 452, 465, 473, 478, 492, 501, 513, 521, 530, 534, 543, 566, 583, 599, 606, 623, 628, 640, 652, 669, 686, 696, 704, 713, 723, 735, 746, 755, 767, 777, 786, 797, 806, 817, 827, 841, 849}
+var _SymKind_index = [...]uint16{0, 4, 9, 23, 32, 44, 52, 62, 71, 76, 83, 92, 99, 106, 113, 129, 140, 154, 164, 172, 180, 190, 200, 212, 226, 238, 250, 262, 275, 288, 303, 312, 321, 335, 345, 354, 362, 368, 376, 387, 394, 403, 413, 432, 446, 463, 476, 484, 489, 503, 512, 524, 532, 541, 545, 554, 577, 594, 610, 617, 634, 639, 651, 663, 680, 697, 707, 715, 724, 734, 746, 757, 766, 778, 788, 797, 808, 817, 828, 838, 852, 860}
 
 func (i SymKind) String() string {
        if i >= SymKind(len(_SymKind_index)-1) {
index 65f79c80120e068f0b74698c63c5996bdff6b232..947f2da2b5d323df8d3a0375a740735b0dbfdef7 100644 (file)
@@ -127,6 +127,7 @@ func asmb(ctxt *ld.Link, ldr *loader.Loader) {
                ldr.SymSect(ldr.Lookup("runtime.rodata", 0)),
                ldr.SymSect(ldr.Lookup("runtime.typelink", 0)),
                ldr.SymSect(ldr.Lookup("runtime.itablink", 0)),
+               ldr.SymSect(ldr.Lookup("runtime.firstmoduledata", 0)),
                ldr.SymSect(ldr.Lookup("runtime.pclntab", 0)),
                ldr.SymSect(ldr.Lookup("runtime.noptrdata", 0)),
                ldr.SymSect(ldr.Lookup("runtime.data", 0)),