@@ -239,6 +239,7 @@ class Writer {
239
239
void createRuntimePseudoRelocs ();
240
240
void createECChunks ();
241
241
void insertCtorDtorSymbols ();
242
+ void insertBssDataStartEndSymbols ();
242
243
void markSymbolsWithRelocations (ObjFile *file, SymbolRVASet &usedSymbols);
243
244
void createGuardCFTables ();
244
245
void markSymbolsForRVATable (ObjFile *file,
@@ -314,6 +315,7 @@ class Writer {
314
315
315
316
OutputSection *textSec;
316
317
OutputSection *hexpthkSec;
318
+ OutputSection *bssSec;
317
319
OutputSection *rdataSec;
318
320
OutputSection *buildidSec;
319
321
OutputSection *dataSec;
@@ -1077,7 +1079,7 @@ void Writer::createSections() {
1077
1079
textSec = createSection (" .text" , code | r | x);
1078
1080
if (isArm64EC (ctx.config .machine ))
1079
1081
hexpthkSec = createSection (" .hexpthk" , code | r | x);
1080
- createSection (" .bss" , bss | r | w);
1082
+ bssSec = createSection (" .bss" , bss | r | w);
1081
1083
rdataSec = createSection (" .rdata" , data | r);
1082
1084
buildidSec = createSection (" .buildid" , data | r);
1083
1085
dataSec = createSection (" .data" , data | r | w);
@@ -1260,8 +1262,10 @@ void Writer::createMiscChunks() {
1260
1262
if (config->autoImport )
1261
1263
createRuntimePseudoRelocs ();
1262
1264
1263
- if (config->mingw )
1265
+ if (config->mingw ) {
1264
1266
insertCtorDtorSymbols ();
1267
+ insertBssDataStartEndSymbols ();
1268
+ }
1265
1269
}
1266
1270
1267
1271
// Create .idata section for the DLL-imported symbol table.
@@ -2369,6 +2373,31 @@ void Writer::insertCtorDtorSymbols() {
2369
2373
}
2370
2374
}
2371
2375
2376
+ // MinGW (really, Cygwin) specific.
2377
+ // The Cygwin startup code uses __data_start__ __data_end__ __bss_start__
2378
+ // and __bss_end__ to know what to copy during fork emulation.
2379
+ void Writer::insertBssDataStartEndSymbols () {
2380
+ if (!dataSec->chunks .empty ()) {
2381
+ Symbol *dataStartSym = ctx.symtab .find (" __data_start__" );
2382
+ Symbol *dataEndSym = ctx.symtab .find (" __data_end__" );
2383
+ Chunk *endChunk = dataSec->chunks .back ();
2384
+ replaceSymbol<DefinedSynthetic>(dataStartSym, dataStartSym->getName (),
2385
+ dataSec->chunks .front ());
2386
+ replaceSymbol<DefinedSynthetic>(dataEndSym, dataEndSym->getName (), endChunk,
2387
+ endChunk->getSize ());
2388
+ }
2389
+
2390
+ if (!bssSec->chunks .empty ()) {
2391
+ Symbol *bssStartSym = ctx.symtab .find (" __bss_start__" );
2392
+ Symbol *bssEndSym = ctx.symtab .find (" __bss_end__" );
2393
+ Chunk *endChunk = bssSec->chunks .back ();
2394
+ replaceSymbol<DefinedSynthetic>(bssStartSym, bssStartSym->getName (),
2395
+ bssSec->chunks .front ());
2396
+ replaceSymbol<DefinedSynthetic>(bssEndSym, bssEndSym->getName (), endChunk,
2397
+ endChunk->getSize ());
2398
+ }
2399
+ }
2400
+
2372
2401
// Handles /section options to allow users to overwrite
2373
2402
// section attributes.
2374
2403
void Writer::setSectionPermissions () {
0 commit comments