MSYS2-packages/llvm/0203-hack-add-data-bss-start-end.patch

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() {