98 lines
3.6 KiB
Diff
98 lines
3.6 KiB
Diff
diff -ur a/lld/COFF/Driver.cpp b/lld/COFF/Driver.cpp
|
|
--- a/lld/COFF/Driver.cpp 2025-04-06 11:09:27.795116100 -0700
|
|
+++ b/lld/COFF/Driver.cpp 2025-04-06 11:12:50.937075500 -0700
|
|
@@ -2018,6 +2018,7 @@
|
|
parseMerge(".ctors=.rdata");
|
|
parseMerge(".dtors=.rdata");
|
|
parseMerge(".CRT=.rdata");
|
|
+ parseMerge(".data_cygwin_nocopy=.data");
|
|
}
|
|
|
|
// Handle /section
|
|
@@ -2474,6 +2475,10 @@
|
|
if (config->mingw) {
|
|
symtab.addAbsolute(symtab.mangle("__CTOR_LIST__"), 0);
|
|
symtab.addAbsolute(symtab.mangle("__DTOR_LIST__"), 0);
|
|
+ symtab.addAbsolute("__data_start__", 0);
|
|
+ symtab.addAbsolute("__data_end__", 0);
|
|
+ symtab.addAbsolute("__bss_start__", 0);
|
|
+ symtab.addAbsolute("__bss_end__", 0);
|
|
}
|
|
if (config->debug || config->buildIDHash != BuildIDHash::None)
|
|
if (symtab.findUnderscore("__buildid"))
|
|
diff -ur a/lld/COFF/Writer.cpp b/lld/COFF/Writer.cpp
|
|
--- a/lld/COFF/Writer.cpp 2025-04-06 11:09:27.826366000 -0700
|
|
+++ b/lld/COFF/Writer.cpp 2025-04-06 11:32:23.006090000 -0700
|
|
@@ -239,6 +239,7 @@
|
|
void createRuntimePseudoRelocs();
|
|
void createECChunks();
|
|
void insertCtorDtorSymbols();
|
|
+ void insertBssDataStartEndSymbols();
|
|
void markSymbolsWithRelocations(ObjFile *file, SymbolRVASet &usedSymbols);
|
|
void createGuardCFTables();
|
|
void markSymbolsForRVATable(ObjFile *file,
|
|
@@ -314,6 +314,7 @@
|
|
|
|
OutputSection *textSec;
|
|
OutputSection *hexpthkSec;
|
|
+ OutputSection *bssSec;
|
|
OutputSection *rdataSec;
|
|
OutputSection *buildidSec;
|
|
OutputSection *dataSec;
|
|
@@ -1068,7 +1069,7 @@
|
|
textSec = createSection(".text", code | r | x);
|
|
if (isArm64EC(ctx.config.machine))
|
|
hexpthkSec = createSection(".hexpthk", code | r | x);
|
|
- createSection(".bss", bss | r | w);
|
|
+ bssSec = createSection(".bss", bss | r | w);
|
|
rdataSec = createSection(".rdata", data | r);
|
|
buildidSec = createSection(".buildid", data | r);
|
|
dataSec = createSection(".data", data | r | w);
|
|
@@ -1242,8 +1243,10 @@
|
|
if (config->autoImport)
|
|
createRuntimePseudoRelocs();
|
|
|
|
- if (config->mingw)
|
|
+ if (config->mingw) {
|
|
insertCtorDtorSymbols();
|
|
+ insertBssDataStartEndSymbols();
|
|
+ }
|
|
}
|
|
|
|
// Create .idata section for the DLL-imported symbol table.
|
|
@@ -2334,6 +2337,34 @@
|
|
dtorListHead);
|
|
}
|
|
|
|
+// MinGW (really, Cygwin) specific.
|
|
+// The Cygwin startup code uses __data_start__ __data_end__ __bss_start__
|
|
+// and __bss_end__ to know what to copy during fork emulation.
|
|
+void Writer::insertBssDataStartEndSymbols() {
|
|
+ EmptyChunk *startOfData = make<EmptyChunk>();
|
|
+ EmptyChunk *endOfData = make<EmptyChunk>();
|
|
+ EmptyChunk *startOfBss = make<EmptyChunk>();
|
|
+ EmptyChunk *endOfBss = make<EmptyChunk>();
|
|
+ dataSec->insertChunkAtStart(startOfData);
|
|
+ dataSec->addChunk(endOfData);
|
|
+ bssSec->insertChunkAtStart(startOfBss);
|
|
+ bssSec->addChunk(endOfBss);
|
|
+
|
|
+ Symbol *dataStartSym = ctx.symtab.find("__data_start__");
|
|
+ Symbol *dataEndSym = ctx.symtab.find("__data_end__");
|
|
+ Symbol *bssStartSym = ctx.symtab.find("__bss_start__");
|
|
+ Symbol *bssEndSym = ctx.symtab.find("__bss_end__");
|
|
+ replaceSymbol<DefinedSynthetic>(dataStartSym, dataStartSym->getName(),
|
|
+ startOfData);
|
|
+ replaceSymbol<DefinedSynthetic>(dataEndSym, dataEndSym->getName(),
|
|
+ endOfData);
|
|
+ replaceSymbol<DefinedSynthetic>(bssStartSym, bssStartSym->getName(),
|
|
+ startOfBss);
|
|
+ replaceSymbol<DefinedSynthetic>(bssEndSym, bssEndSym->getName(),
|
|
+ endOfBss);
|
|
+
|
|
+}
|
|
+
|
|
// Handles /section options to allow users to overwrite
|
|
// section attributes.
|
|
void Writer::setSectionPermissions() {
|