@@ -393,30 +393,30 @@ def _handle_section(
393
393
elif section_type in {"SHT_PROGBITS" , "SHT_NOBITS" }:
394
394
if "SHF_ALLOC" not in flags :
395
395
return
396
+ if "SectionData" in section :
397
+ section_data_bytes = section ["SectionData" ]["Bytes" ]
398
+ else :
399
+ # Zeroed BSS data:
400
+ section_data_bytes = [0 ] * section ["Size" ]
396
401
if "SHF_EXECINSTR" in flags :
397
402
value = _stencils .HoleValue .CODE
398
403
stencil = group .code
399
404
else :
400
405
value = _stencils .HoleValue .DATA
401
406
stencil = group .data
402
- if section_type == "SHT_PROGBITS" :
403
- assert "SectionData" in section
404
- section_data_bytes = section ["SectionData" ]["Bytes" ]
405
- else :
406
- # Zeroed BSS data:
407
- section_data_bytes = [0 ] * section ["Size" ]
408
407
if "SHF_WRITE" in flags :
409
408
assert value is _stencils .HoleValue .DATA
410
409
value = _stencils .HoleValue .WRITABLE
411
410
section_data_bytes = []
412
- group .symbols [section ["Index" ]] = value , len (stencil .body )
411
+ base = len (stencil .body )
412
+ group .symbols [section ["Index" ]] = value , base
413
+ stencil .body .extend (section_data_bytes )
413
414
for wrapped_symbol in section ["Symbols" ]:
414
415
symbol = wrapped_symbol ["Symbol" ]
415
- offset = len ( stencil . body ) + symbol ["Value" ]
416
+ offset = base + symbol ["Value" ]
416
417
name = symbol ["Name" ]["Name" ]
417
418
name = name .removeprefix (self .symbol_prefix )
418
419
group .symbols [name ] = value , offset
419
- stencil .body .extend (section_data_bytes )
420
420
assert not section ["Relocations" ]
421
421
else :
422
422
assert section_type in {
@@ -474,15 +474,12 @@ class _MachO(
474
474
def _handle_section (
475
475
self , section : _schema .MachOSection , group : _stencils .StencilGroup
476
476
) -> None :
477
- assert section ["Address" ] >= len (group .code .body )
478
477
if "SectionData" in section :
479
478
section_data_bytes = section ["SectionData" ]["Bytes" ]
480
479
else :
481
480
# Zeroed BSS data:
482
481
section_data_bytes = [0 ] * section ["Size" ]
483
482
flags = {flag ["Name" ] for flag in section ["Attributes" ]["Flags" ]}
484
- name = section ["Name" ]["Value" ]
485
- name = name .removeprefix (self .symbol_prefix )
486
483
if "Debug" in flags :
487
484
return
488
485
if "PureInstructions" in flags :
@@ -492,19 +489,20 @@ def _handle_section(
492
489
value = _stencils .HoleValue .DATA
493
490
stencil = group .data
494
491
segment = section ["Segment" ]["Value" ]
492
+ assert segment in {"__DATA" , "__TEXT" }, segment
495
493
if segment == "__DATA" :
496
494
value = _stencils .HoleValue .WRITABLE
497
495
section_data_bytes = []
498
- else :
499
- assert segment == "__TEXT" , segment
500
496
base = len (stencil .body )
501
- group .symbols [name ] = value , base
502
497
group .symbols [section ["Index" ]] = value , base
503
498
stencil .body .extend (section_data_bytes )
499
+ name = section ["Name" ]["Value" ]
500
+ name = name .removeprefix (self .symbol_prefix )
501
+ group .symbols [name ] = value , base
504
502
assert "Symbols" in section
505
503
for wrapped_symbol in section ["Symbols" ]:
506
504
symbol = wrapped_symbol ["Symbol" ]
507
- offset = symbol ["Value" ] - section ["Address" ] + base
505
+ offset = base + symbol ["Value" ] - section ["Address" ]
508
506
name = symbol ["Name" ]["Name" ]
509
507
name = name .removeprefix (self .symbol_prefix )
510
508
group .symbols [name ] = value , offset
@@ -589,23 +587,23 @@ def get_target(host: str) -> _COFF32 | _COFF64 | _ELF | _MachO:
589
587
target = _MachO (host , condition , optimizer = optimizer )
590
588
elif re .fullmatch (r"aarch64-pc-windows-msvc" , host ):
591
589
host = "aarch64-pc-windows-msvc"
592
- args = ["-fms-runtime-lib=dll" , "-fplt" ]
593
590
condition = "defined(_M_ARM64)"
591
+ args = ["-fms-runtime-lib=dll" , "-fplt" ]
594
592
optimizer = _optimizers .OptimizerAArch64
595
593
target = _COFF64 (host , condition , args = args , optimizer = optimizer )
596
594
elif re .fullmatch (r"aarch64-.*-linux-gnu" , host ):
597
595
host = "aarch64-unknown-linux-gnu"
596
+ condition = "defined(__aarch64__) && defined(__linux__)"
598
597
# -mno-outline-atomics: Keep intrinsics from being emitted.
599
598
args = ["-fpic" , "-mno-outline-atomics" ]
600
- condition = "defined(__aarch64__) && defined(__linux__)"
601
599
optimizer = _optimizers .OptimizerAArch64
602
600
target = _ELF (host , condition , args = args , optimizer = optimizer )
603
601
elif re .fullmatch (r"i686-pc-windows-msvc" , host ):
604
602
host = "i686-pc-windows-msvc"
603
+ condition = "defined(_M_IX86)"
605
604
# -Wno-ignored-attributes: __attribute__((preserve_none)) is not supported here.
606
605
args = ["-DPy_NO_ENABLE_SHARED" , "-Wno-ignored-attributes" ]
607
606
optimizer = _optimizers .OptimizerX86
608
- condition = "defined(_M_IX86)"
609
607
target = _COFF32 (host , condition , args = args , optimizer = optimizer )
610
608
elif re .fullmatch (r"x86_64-apple-darwin.*" , host ):
611
609
host = "x86_64-apple-darwin"
@@ -614,14 +612,14 @@ def get_target(host: str) -> _COFF32 | _COFF64 | _ELF | _MachO:
614
612
target = _MachO (host , condition , optimizer = optimizer )
615
613
elif re .fullmatch (r"x86_64-pc-windows-msvc" , host ):
616
614
host = "x86_64-pc-windows-msvc"
617
- args = ["-fms-runtime-lib=dll" ]
618
615
condition = "defined(_M_X64)"
616
+ args = ["-fms-runtime-lib=dll" ]
619
617
optimizer = _optimizers .OptimizerX86
620
618
target = _COFF64 (host , condition , args = args , optimizer = optimizer )
621
619
elif re .fullmatch (r"x86_64-.*-linux-gnu" , host ):
622
620
host = "x86_64-unknown-linux-gnu"
623
- args = ["-fno-pic" , "-mcmodel=medium" , "-mlarge-data-threshold=0" ]
624
621
condition = "defined(__x86_64__) && defined(__linux__)"
622
+ args = ["-fno-pic" , "-mcmodel=medium" , "-mlarge-data-threshold=0" ]
625
623
optimizer = _optimizers .OptimizerX86
626
624
target = _ELF (host , condition , args = args , optimizer = optimizer )
627
625
else :
0 commit comments