llvm: add lld hack to define necessary symbols for Cygwin
This commit is contained in:
parent
b9c966a89b
commit
54ac10ddf9
97
llvm/0203-hack-add-data-bss-start-end.patch
Normal file
97
llvm/0203-hack-add-data-bss-start-end.patch
Normal 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() {
|
||||
@ -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() {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user