llvm: update __data/bss_start/end__ patch

This commit is contained in:
Jeremy Drake 2025-04-17 11:28:09 -07:00
parent 2e8787649d
commit e1a9cc68ba
2 changed files with 32 additions and 30 deletions

View File

@ -1,13 +1,18 @@
From 03dd9259f5d37b861387607af8e77610a8d94499 Mon Sep 17 00:00:00 2001
From 6a552fa2d904773ac0b9aa1f11ccf642b96f8dd2 Mon Sep 17 00:00:00 2001
From: Jeremy Drake <github@jdrake.com>
Date: Sun, 13 Apr 2025 22:41:05 -0700
Subject: [PATCH 12/15] [LLD][COFF] add __{data,bss}_{start,end}__ symbols for
Subject: [PATCH 11/15] [LLD][COFF] add __{data,bss}_{start,end}__ symbols for
Cygwin support
Cygwin requires these symbols for its fork emulation to know what data
to copy into the child. GNU ld defines these symbols for MinGW targets
also, so do the same here.
Signed-off-by: Jeremy Drake <github@jdrake.com>
---
lld/COFF/Driver.cpp | 5 +++++
lld/COFF/Writer.cpp | 36 ++++++++++++++++++++++++++++++++++--
2 files changed, 39 insertions(+), 2 deletions(-)
lld/COFF/Writer.cpp | 33 +++++++++++++++++++++++++++++++--
2 files changed, 36 insertions(+), 2 deletions(-)
diff --git a/lld/COFF/Driver.cpp b/lld/COFF/Driver.cpp
index ac3ac57bd..fa882f883 100644
@ -33,7 +38,7 @@ index ac3ac57bd..fa882f883 100644
if (config->debug || config->buildIDHash != BuildIDHash::None)
if (symtab.findUnderscore("__buildid"))
diff --git a/lld/COFF/Writer.cpp b/lld/COFF/Writer.cpp
index 2bdaeb58a..3b3c490f5 100644
index 2bdaeb58a..41973a245 100644
--- a/lld/COFF/Writer.cpp
+++ b/lld/COFF/Writer.cpp
@@ -239,6 +239,7 @@ private:
@ -73,7 +78,7 @@ index 2bdaeb58a..3b3c490f5 100644
}
// Create .idata section for the DLL-imported symbol table.
@@ -2334,6 +2338,34 @@ void Writer::insertCtorDtorSymbols() {
@@ -2334,6 +2338,31 @@ void Writer::insertCtorDtorSymbols() {
dtorListHead);
}
@ -81,28 +86,25 @@ index 2bdaeb58a..3b3c490f5 100644
+// 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);
+ if (!dataSec->chunks.empty()) {
+ Symbol *dataStartSym = ctx.symtab.find("__data_start__");
+ Symbol *dataEndSym = ctx.symtab.find("__data_end__");
+ Chunk *endChunk = dataSec->chunks.back();
+ replaceSymbol<DefinedSynthetic>(dataStartSym, dataStartSym->getName(),
+ dataSec->chunks.front());
+ replaceSymbol<DefinedSynthetic>(dataEndSym, dataEndSym->getName(), endChunk,
+ endChunk->getSize());
+ }
+
+ if (!bssSec->chunks.empty()) {
+ Symbol *bssStartSym = ctx.symtab.find("__bss_start__");
+ Symbol *bssEndSym = ctx.symtab.find("__bss_end__");
+ Chunk *endChunk = bssSec->chunks.back();
+ replaceSymbol<DefinedSynthetic>(bssStartSym, bssStartSym->getName(),
+ bssSec->chunks.front());
+ replaceSymbol<DefinedSynthetic>(bssEndSym, bssEndSym->getName(), endChunk,
+ endChunk->getSize());
+ }
+}
+
// Handles /section options to allow users to overwrite

View File

@ -50,7 +50,7 @@ source=("${_url}/llvm-${pkgver}.src.tar.xz"{,.sig}
"0111-Clang-Driver-use-__cxa_atexit-by-default-on-Cygwin.patch"
"0112-hack-cygwin-define-_GLIBCXX_USE_CXX11_ABI-to-1-if-no.patch"
"0201-LLD-MinGW-Implement-dll-search-prefix-option.patch"
"0203-hack-add-data-bss-start-end.patch"
"0203-LLD-COFF-add-__-data-bss-_-start-end-__-symbols-for-.patch"
"0204-LLD-MinGW-Fall-back-to-using-default-target-if-no-m-.patch"
)
sha256sums=('e5dc9b9d842c5f79080f67860a084077e163430de1e2cd3a74e8bee86e186751'
@ -80,7 +80,7 @@ sha256sums=('e5dc9b9d842c5f79080f67860a084077e163430de1e2cd3a74e8bee86e186751'
'5a383313e4a2432471b0cd2946786eb3bafd9f6dfc5f2ff005c594b77a82470d'
'4587f6bd019e69df04fab9b7ba6c9245cd1a26167ce2557530eb185d495f3717'
'92edbcd4cb2c9d6706a31bd64c25865931025e3c430d23c16900ac39a408785f'
'ef47bc11766948f5bd5bd1f1054d975399bbb5f12a1bf893fc22a0c0d8abd2b2'
'e94efca8f2336bbd76265847dc449dcc537b8c6a4f740473884bc70249ca8b02'
'9df6ecfdd5a18a875442f529fbe08a86eae07986557b0633c3c01404cf6ba3ea')
validpgpkeys=('B6C8F98282B944E3B0D5C2530FC3042E345AD05D' # Hans Wennborg, Google.
'474E22316ABF4785A88C6E8EA2C794A986419D8A' # Tom Stellard
@ -143,7 +143,7 @@ prepare() {
# Patch lld
cd "${srcdir}"/lld
apply_git_patch_with_msg 0201-LLD-MinGW-Implement-dll-search-prefix-option.patch
apply_git_patch_with_msg 0203-hack-add-data-bss-start-end.patch
apply_git_patch_with_msg 0203-LLD-COFF-add-__-data-bss-_-start-end-__-symbols-for-.patch
apply_git_patch_with_msg 0204-LLD-MinGW-Fall-back-to-using-default-target-if-no-m-.patch
}