llvm: add lld hack to define necessary symbols for Cygwin

This commit is contained in:
Jeremy Drake 2025-04-06 12:36:52 -07:00
parent b9c966a89b
commit 54ac10ddf9
2 changed files with 101 additions and 1 deletions

View File

@ -0,0 +1,97 @@
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() {

View File

@ -47,6 +47,7 @@ source=("${_url}/llvm-${pkgver}.src.tar.xz"{,.sig}
"0107-Clang-Cygwin-Remove-erroneous-define.patch"
"0201-LLD-MinGW-Implement-dll-search-prefix-option.patch"
"0202-hack-add-system-search-paths.patch"
"0203-hack-add-data-bss-start-end.patch"
)
sha256sums=('6286c526db3b84ce79292f80118e7e6d3fbd5b5ce3e4a0ebb32b2d205233bd86'
'SKIP'
@ -72,7 +73,8 @@ sha256sums=('6286c526db3b84ce79292f80118e7e6d3fbd5b5ce3e4a0ebb32b2d205233bd86'
'bb5092e0eead24259bae4fd294e5bb21a6f8f5d9e7dce512c3882cdaf5d17707'
'e0eb057009fbfd6b9099d652c289a4b4d8ba9056a4746c85c898ffefe178dc55'
'e0be8739d7423021a713d7b9e86d5841cc82f8666857a4c9cd855692266f0cd4'
'cd3b441073e007b2e2900ea778be96076286178b7c1c6db0f2ef43fe1836906e')
'cd3b441073e007b2e2900ea778be96076286178b7c1c6db0f2ef43fe1836906e'
'11ae0fd24d0249accaf3f9e19b44862272b634298cf7b84f2479f81a8fa414b6')
validpgpkeys=('B6C8F98282B944E3B0D5C2530FC3042E345AD05D' # Hans Wennborg, Google.
'474E22316ABF4785A88C6E8EA2C794A986419D8A' # Tom Stellard
'D574BD5D1D0E98895E3BF90044F2485E45D59042') # Tobias Hieta
@ -135,6 +137,7 @@ prepare() {
cd "${srcdir}"/lld
apply_git_patch_with_msg 0201-LLD-MinGW-Implement-dll-search-prefix-option.patch
apply_git_patch_with_msg 0202-hack-add-system-search-paths.patch
apply_git_patch_with_msg 0203-hack-add-data-bss-start-end.patch
}
build() {