diff --git a/src/coreclr/nativeaot/BuildIntegration/Microsoft.NETCore.Native.Windows.targets b/src/coreclr/nativeaot/BuildIntegration/Microsoft.NETCore.Native.Windows.targets
index 8639c24343b883..6db428559a7623 100644
--- a/src/coreclr/nativeaot/BuildIntegration/Microsoft.NETCore.Native.Windows.targets
+++ b/src/coreclr/nativeaot/BuildIntegration/Microsoft.NETCore.Native.Windows.targets
@@ -81,6 +81,7 @@ The .NET Foundation licenses this file to you under the MIT license.
+
@@ -104,6 +105,9 @@ The .NET Foundation licenses this file to you under the MIT license.
+
+
+
diff --git a/src/coreclr/nativeaot/BuildIntegration/sectionlayout.txt b/src/coreclr/nativeaot/BuildIntegration/sectionlayout.txt
new file mode 100644
index 00000000000000..18aa2026a0c5e3
--- /dev/null
+++ b/src/coreclr/nativeaot/BuildIntegration/sectionlayout.txt
@@ -0,0 +1,54 @@
+;;
+;; section layout file
+;;
+
+;;
+;; The first thunks section should be 64K aligned because it can get
+;; mapped multiple times in memory, and mapping works on allocation
+;; granularity boundaries (we don't want to map more than what we need)
+;;
+;; The easiest way to do so is by having the thunks section at the
+;; first 64K aligned virtual address in the binary. We provide this section
+;; layout file to the linker to tell it how to layout the thunks sections
+;; that we care about.
+;;
+;; The PE spec says images cannot have gaps between sections (other
+;; than what is required by the section alignment value in the header),
+;; therefore we need a couple of padding data sections (otherwise the
+;; OS will not load the image).
+;;
+
+.pad0
+.pad1
+.pad2
+.pad3
+.pad4
+.pad5
+.pad6
+.pad7
+.pad8
+.pad9
+.pad10
+.pad11
+.pad12
+.pad13
+.pad14
+.tks0 10000
+.tkd0 11000
+.tks1 12000
+.tkd1 13000
+.tks2 14000
+.tkd2 15000
+.tks3 16000
+.tkd3 17000
+.tks4 18000
+.tkd4 19000
+.tks5 1A000
+.tkd5 1B000
+.tks6 1C000
+.tkd6 1D000
+.tks7 1E000
+.tkd7 1F000
+
+;; All other sections: handled automatically by linker. No need to
+;; explicitly list them
diff --git a/src/coreclr/nativeaot/Runtime/Full/CMakeLists.txt b/src/coreclr/nativeaot/Runtime/Full/CMakeLists.txt
index 11618fd78edc0a..1d002fb226cce4 100644
--- a/src/coreclr/nativeaot/Runtime/Full/CMakeLists.txt
+++ b/src/coreclr/nativeaot/Runtime/Full/CMakeLists.txt
@@ -6,7 +6,7 @@ project(Runtime)
# Include auto-generated files on include path
set(CMAKE_INCLUDE_CURRENT_DIR ON)
-if (CLR_CMAKE_TARGET_APPLE)
+if (CLR_CMAKE_TARGET_APPLE OR CLR_CMAKE_TARGET_WIN32)
list(APPEND RUNTIME_SOURCES_ARCH_ASM
${ARCH_SOURCES_DIR}/ThunkPoolThunks.${ASM_SUFFIX}
)
diff --git a/src/coreclr/nativeaot/Runtime/i386/ThunkPoolThunks.asm b/src/coreclr/nativeaot/Runtime/i386/ThunkPoolThunks.asm
new file mode 100644
index 00000000000000..c8510d9e47cbed
--- /dev/null
+++ b/src/coreclr/nativeaot/Runtime/i386/ThunkPoolThunks.asm
@@ -0,0 +1,301 @@
+;; Licensed to the .NET Foundation under one or more agreements.
+;; The .NET Foundation licenses this file to you under the MIT license.
+
+ .586
+ .model flat
+ option casemap:none
+ .code
+
+LEAF_ENTRY macro Name, Section
+ Section segment para 'CODE'
+ align 16
+ public Name
+ Name proc
+endm
+
+NAMED_LEAF_ENTRY macro Name, Section, SectionAlias
+ Section segment para alias(SectionAlias) 'CODE'
+ align 16
+ public Name
+ Name proc
+endm
+
+LEAF_END macro Name, Section
+ Name endp
+ Section ends
+endm
+
+NAMED_READONLY_DATA_SECTION macro Section, SectionAlias
+ Section segment alias(SectionAlias) read 'DATA'
+ align 16
+ DQ 0
+ Section ends
+endm
+
+NAMED_READWRITE_DATA_SECTION macro Section, SectionAlias
+ Section segment alias(SectionAlias) read write 'DATA'
+ align 16
+ DQ 0
+ Section ends
+endm
+
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; STUBS & DATA SECTIONS ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+THUNK_CODESIZE equ 0Ch ;; 5-byte lea, 6-byte jmp, 1 byte of nops
+THUNK_DATASIZE equ 08h ;; 2 dwords
+
+THUNK_POOL_NUM_THUNKS_PER_PAGE equ 0155h ;; 341 thunks per page
+
+PAGE_SIZE equ 01000h ;; 4K
+POINTER_SIZE equ 04h
+
+
+LOAD_DATA_ADDRESS macro groupIndex, index, thunkPool
+ ;; set eax to beginning of data page : eax <- [thunkPool] + PAGE_SIZE
+ ;; fix offset of the data : eax <- eax + (THUNK_DATASIZE * current thunk's index)
+ lea eax, [thunkPool + PAGE_SIZE + (groupIndex * THUNK_DATASIZE * 10 + THUNK_DATASIZE * index)]
+endm
+
+JUMP_TO_COMMON macro groupIndex, index, thunkPool
+ ;; jump to the location pointed at by the last qword in the data page
+ jmp dword ptr [thunkPool + PAGE_SIZE + PAGE_SIZE - POINTER_SIZE]
+endm
+
+TenThunks macro groupIndex, thunkPool
+ ;; Each thunk will load the address of its corresponding data (from the page that immediately follows)
+ ;; and call a common stub. The address of the common stub is setup by the caller (first qword
+ ;; in the thunks data section, hence the +8's below) depending on the 'kind' of thunks needed (interop,
+ ;; fat function pointers, etc...)
+
+ ;; Each data block used by a thunk consists of two qword values:
+ ;; - Context: some value given to the thunk as context (passed in r10). Example for fat-fptrs: context = generic dictionary
+ ;; - Target : target code that the thunk eventually jumps to.
+
+ LOAD_DATA_ADDRESS groupIndex,0,thunkPool
+ JUMP_TO_COMMON groupIndex,0,thunkPool
+
+ LOAD_DATA_ADDRESS groupIndex,1,thunkPool
+ JUMP_TO_COMMON groupIndex,1,thunkPool
+
+ LOAD_DATA_ADDRESS groupIndex,2,thunkPool
+ JUMP_TO_COMMON groupIndex,2,thunkPool
+
+ LOAD_DATA_ADDRESS groupIndex,3,thunkPool
+ JUMP_TO_COMMON groupIndex,3,thunkPool
+
+ LOAD_DATA_ADDRESS groupIndex,4,thunkPool
+ JUMP_TO_COMMON groupIndex,4,thunkPool
+
+ LOAD_DATA_ADDRESS groupIndex,5,thunkPool
+ JUMP_TO_COMMON groupIndex,5,thunkPool
+
+ LOAD_DATA_ADDRESS groupIndex,6,thunkPool
+ JUMP_TO_COMMON groupIndex,6,thunkPool
+
+ LOAD_DATA_ADDRESS groupIndex,7,thunkPool
+ JUMP_TO_COMMON groupIndex,7,thunkPool
+
+ LOAD_DATA_ADDRESS groupIndex,8,thunkPool
+ JUMP_TO_COMMON groupIndex,8,thunkPool
+
+ LOAD_DATA_ADDRESS groupIndex,9,thunkPool
+ JUMP_TO_COMMON groupIndex,9,thunkPool
+endm
+
+THUNKS_PAGE_BLOCK macro thunkPool
+ TenThunks 0,thunkPool
+ TenThunks 1,thunkPool
+ TenThunks 2,thunkPool
+ TenThunks 3,thunkPool
+ TenThunks 4,thunkPool
+ TenThunks 5,thunkPool
+ TenThunks 6,thunkPool
+ TenThunks 7,thunkPool
+ TenThunks 8,thunkPool
+ TenThunks 9,thunkPool
+ TenThunks 10,thunkPool
+ TenThunks 11,thunkPool
+ TenThunks 12,thunkPool
+ TenThunks 13,thunkPool
+ TenThunks 14,thunkPool
+ TenThunks 15,thunkPool
+ TenThunks 16,thunkPool
+ TenThunks 17,thunkPool
+ TenThunks 18,thunkPool
+ TenThunks 19,thunkPool
+ TenThunks 20,thunkPool
+ TenThunks 21,thunkPool
+ TenThunks 22,thunkPool
+ TenThunks 23,thunkPool
+ TenThunks 24,thunkPool
+ TenThunks 25,thunkPool
+ TenThunks 26,thunkPool
+ TenThunks 27,thunkPool
+ TenThunks 28,thunkPool
+ TenThunks 29,thunkPool
+ TenThunks 30,thunkPool
+ TenThunks 31,thunkPool
+ TenThunks 32,thunkPool
+ TenThunks 33,thunkPool
+ LOAD_DATA_ADDRESS 34,0,thunkPool
+ JUMP_TO_COMMON 34,0,thunkPool
+endm
+
+;;
+;; The first thunks section should be 64K aligned because it can get
+;; mapped multiple times in memory, and mapping works on allocation
+;; granularity boundaries (we don't want to map more than what we need)
+;;
+;; The easiest way to do so is by having the thunks section at the
+;; first 64K aligned virtual address in the binary. We provide a section
+;; layout file to the linker to tell it how to layout the thunks sections
+;; that we care about. (ndp\rh\src\runtime\DLLs\app\mrt100_app_sectionlayout.txt)
+;;
+;; The PE spec says images cannot have gaps between sections (other
+;; than what is required by the section alignment value in the header),
+;; therefore we need a couple of padding data sections (otherwise the
+;; OS will not load the image).
+;;
+
+NAMED_READONLY_DATA_SECTION PaddingFor64KAlignment0, ".pad0"
+NAMED_READONLY_DATA_SECTION PaddingFor64KAlignment1, ".pad1"
+NAMED_READONLY_DATA_SECTION PaddingFor64KAlignment2, ".pad2"
+NAMED_READONLY_DATA_SECTION PaddingFor64KAlignment3, ".pad3"
+NAMED_READONLY_DATA_SECTION PaddingFor64KAlignment4, ".pad4"
+NAMED_READONLY_DATA_SECTION PaddingFor64KAlignment5, ".pad5"
+NAMED_READONLY_DATA_SECTION PaddingFor64KAlignment6, ".pad6"
+NAMED_READONLY_DATA_SECTION PaddingFor64KAlignment7, ".pad7"
+NAMED_READONLY_DATA_SECTION PaddingFor64KAlignment8, ".pad8"
+NAMED_READONLY_DATA_SECTION PaddingFor64KAlignment9, ".pad9"
+NAMED_READONLY_DATA_SECTION PaddingFor64KAlignment10, ".pad10"
+NAMED_READONLY_DATA_SECTION PaddingFor64KAlignment11, ".pad11"
+NAMED_READONLY_DATA_SECTION PaddingFor64KAlignment12, ".pad12"
+NAMED_READONLY_DATA_SECTION PaddingFor64KAlignment13, ".pad13"
+NAMED_READONLY_DATA_SECTION PaddingFor64KAlignment14, ".pad14"
+
+;;
+;; Thunk Stubs
+;; NOTE: Keep number of blocks in sync with macro/constant named 'NUM_THUNK_BLOCKS' in:
+;; - ndp\FxCore\src\System.Private.CoreLib\System\Runtime\InteropServices\ThunkPool.cs
+;; - ndp\rh\src\tools\rhbind\zapimage.h
+;;
+NAMED_LEAF_ENTRY ThunkPool, TKS0, ".tks0"
+ THUNKS_PAGE_BLOCK ThunkPool
+LEAF_END ThunkPool, TKS0
+
+NAMED_READWRITE_DATA_SECTION ThunkData0, ".tkd0"
+
+NAMED_LEAF_ENTRY ThunkPool1, TKS1, ".tks1"
+ THUNKS_PAGE_BLOCK ThunkPool1
+LEAF_END ThunkPool1, TKS1
+
+NAMED_READWRITE_DATA_SECTION ThunkData1, ".tkd1"
+
+NAMED_LEAF_ENTRY ThunkPool2, TKS2, ".tks2"
+ THUNKS_PAGE_BLOCK ThunkPool2
+LEAF_END ThunkPool2, TKS2
+
+NAMED_READWRITE_DATA_SECTION ThunkData2, ".tkd2"
+
+NAMED_LEAF_ENTRY ThunkPool3, TKS3, ".tks3"
+ THUNKS_PAGE_BLOCK ThunkPool3
+LEAF_END ThunkPool3, TKS3
+
+NAMED_READWRITE_DATA_SECTION ThunkData3, ".tkd3"
+
+NAMED_LEAF_ENTRY ThunkPool4, TKS4, ".tks4"
+ THUNKS_PAGE_BLOCK ThunkPool4
+LEAF_END ThunkPool4, TKS4
+
+NAMED_READWRITE_DATA_SECTION ThunkData4, ".tkd4"
+
+NAMED_LEAF_ENTRY ThunkPool5, TKS5, ".tks5"
+ THUNKS_PAGE_BLOCK ThunkPool5
+LEAF_END ThunkPool5, TKS5
+
+NAMED_READWRITE_DATA_SECTION ThunkData5, ".tkd5"
+
+NAMED_LEAF_ENTRY ThunkPool6, TKS6, ".tks6"
+ THUNKS_PAGE_BLOCK ThunkPool6
+LEAF_END ThunkPool6, TKS6
+
+NAMED_READWRITE_DATA_SECTION ThunkData6, ".tkd6"
+
+NAMED_LEAF_ENTRY ThunkPool7, TKS7, ".tks7"
+ THUNKS_PAGE_BLOCK ThunkPool7
+LEAF_END ThunkPool7, TKS7
+
+NAMED_READWRITE_DATA_SECTION ThunkData7, ".tkd7"
+
+;;
+;; IntPtr RhpGetThunksBase()
+;;
+LEAF_ENTRY RhpGetThunksBase, _TEXT
+ ;; Return the address of the first thunk pool to the caller (this is really the base address)
+ lea eax, [ThunkPool]
+ ret
+LEAF_END RhpGetThunksBase, _TEXT
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; General Helpers ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+;;
+;; int RhpGetNumThunksPerBlock()
+;;
+LEAF_ENTRY RhpGetNumThunksPerBlock, _TEXT
+ mov eax, THUNK_POOL_NUM_THUNKS_PER_PAGE
+ ret
+LEAF_END RhpGetNumThunksPerBlock, _TEXT
+
+;;
+;; int RhpGetThunkSize()
+;;
+LEAF_ENTRY RhpGetThunkSize, _TEXT
+ mov eax, THUNK_CODESIZE
+ ret
+LEAF_END RhpGetThunkSize, _TEXT
+
+;;
+;; int RhpGetNumThunkBlocksPerMapping()
+;;
+LEAF_ENTRY RhpGetNumThunkBlocksPerMapping, _TEXT
+ mov eax, 8
+ ret
+LEAF_END RhpGetNumThunkBlocksPerMapping, _TEXT
+
+;;
+;; int RhpGetThunkBlockSize
+;;
+LEAF_ENTRY RhpGetThunkBlockSize, _TEXT
+ mov eax, PAGE_SIZE * 2
+ ret
+LEAF_END RhpGetThunkBlockSize, _TEXT
+
+;;
+;; IntPtr RhpGetThunkDataBlockAddress(IntPtr thunkStubAddress)
+;;
+LEAF_ENTRY RhpGetThunkDataBlockAddress, _TEXT
+ mov eax, ecx
+ mov ecx, PAGE_SIZE - 1
+ not ecx
+ and eax, ecx
+ add eax, PAGE_SIZE
+ ret
+LEAF_END RhpGetThunkDataBlockAddress, _TEXT
+
+;;
+;; IntPtr RhpGetThunkStubsBlockAddress(IntPtr thunkDataAddress)
+;;
+LEAF_ENTRY RhpGetThunkStubsBlockAddress, _TEXT
+ mov eax, ecx
+ mov ecx, PAGE_SIZE - 1
+ not ecx
+ and eax, ecx
+ sub eax, PAGE_SIZE
+ ret
+LEAF_END RhpGetThunkStubsBlockAddress, _TEXT
+
+
+end
diff --git a/src/coreclr/nativeaot/Runtime/windows/PalRedhawkMinWin.cpp b/src/coreclr/nativeaot/Runtime/windows/PalRedhawkMinWin.cpp
index 844a1080e2def8..53c6be8ad82984 100644
--- a/src/coreclr/nativeaot/Runtime/windows/PalRedhawkMinWin.cpp
+++ b/src/coreclr/nativeaot/Runtime/windows/PalRedhawkMinWin.cpp
@@ -291,9 +291,46 @@ REDHAWK_PALEXPORT UInt32_BOOL REDHAWK_PALAPI PalMarkThunksAsValidCallTargets(
int thunkBlockSize,
int thunkBlocksPerMapping)
{
- // We are using RWX pages so there is no need for this API for now.
- // Once we have a scenario for non-RWX pages we should be able to put the implementation here
- return TRUE;
+ HANDLE hProcess = GetCurrentProcess();
+
+ // Check to see if the process has CFG enabled.
+ // If it doesn't have CFG, there is no need to call SetProcessValidCallTargets
+ // We only call this every 1000-ish thunks so there is no need for caching either
+ PROCESS_MITIGATION_CONTROL_FLOW_GUARD_POLICY cfgPolicy;
+ if (!GetProcessMitigationPolicy(hProcess, (PROCESS_MITIGATION_POLICY) ProcessControlFlowGuardPolicy, (PVOID) &cfgPolicy, sizeof(cfgPolicy)))
+ return FALSE;
+
+ if (cfgPolicy.EnableControlFlowGuard == 0)
+ return TRUE;
+
+ int totalThunks = thunkBlocksPerMapping * thunksPerBlock;
+ int totalSize = thunkBlocksPerMapping * thunkBlockSize;
+ NewArrayHolder pOffsets = new (nothrow) CFG_CALL_TARGET_INFO[totalThunks];
+
+ // fill in offsets to the thunks
+ // Offset is relative to pThunkMap and naturally starts with 0
+ int blockOffset = 0;
+ int thunkOffset = 0;
+
+ CFG_CALL_TARGET_INFO *pCallTargetInfo = pOffsets;
+
+ for (int block = 0; block < thunkBlocksPerMapping; ++block)
+ {
+ thunkOffset = blockOffset;
+
+ for (int thunk = 0; thunk < thunksPerBlock; ++thunk)
+ {
+ pCallTargetInfo->Offset = (ULONG_PTR) thunkOffset;
+ pCallTargetInfo->Flags = CFG_CALL_TARGET_VALID;
+
+ pCallTargetInfo++;
+ thunkOffset += thunkSize;
+ }
+
+ blockOffset += thunkBlockSize;
+ }
+
+ return SetProcessValidCallTargets(hProcess, virtualAddress, totalSize, totalThunks, pOffsets);
}
REDHAWK_PALEXPORT uint32_t REDHAWK_PALAPI PalCompatibleWaitAny(UInt32_BOOL alertable, uint32_t timeout, uint32_t handleCount, HANDLE* pHandles, UInt32_BOOL allowReentrantWait)
diff --git a/src/coreclr/tools/aot/ILCompiler/reproNative/reproNative.vcxproj b/src/coreclr/tools/aot/ILCompiler/reproNative/reproNative.vcxproj
index a6f8e5714ac88f..bb5612c2338b1f 100644
--- a/src/coreclr/tools/aot/ILCompiler/reproNative/reproNative.vcxproj
+++ b/src/coreclr/tools/aot/ILCompiler/reproNative/reproNative.vcxproj
@@ -45,7 +45,7 @@
..\..\..\..\
$(CoreClrSourceRoot)nativeaot\
$(CoreClrSourceRoot)..\..\artifacts\
- advapi32.lib;bcrypt.lib;crypt32.lib;iphlpapi.lib;kernel32.lib;mswsock.lib;ncrypt.lib;normaliz.lib;ntdll.lib;ole32.lib;oleaut32.lib;secur32.lib;user32.lib;version.lib;ws2_32.lib
+ advapi32.lib;bcrypt.lib;crypt32.lib;iphlpapi.lib;kernel32.lib;mswsock.lib;ncrypt.lib;normaliz.lib;ntdll.lib;ole32.lib;oleaut32.lib;secur32.lib;user32.lib;version.lib;ws2_32.lib;WindowsApp.lib
@@ -191,6 +191,7 @@
Console
true
$(ArtifactsRoot)bin\repro\x64\Debug\repro.obj;$(Win32SDKLibs);%(AdditionalDependencies);$(ArtifactsRoot)bin\coreclr\windows.x64.Debug\aotsdk\Runtime.WorkstationGC.lib;$(ArtifactsRoot)bin\coreclr\windows.x64.Debug\aotsdk\System.Globalization.Native.Aot.lib;$(ArtifactsRoot)bin\coreclr\windows.x64.Debug\aotsdk\System.IO.Compression.Native.Aot.lib;$(ArtifactsRoot)bin\coreclr\windows.x64.Debug\aotsdk\eventpipe-disabled.lib;$(ArtifactsRoot)bin\coreclr\windows.x64.Debug\aotsdk\Runtime.VxsortDisabled.lib;$(ArtifactsRoot)bin\coreclr\windows.x64.Debug\aotsdk\standalonegc-disabled.lib;$(ArtifactsRoot)bin\coreclr\windows.x64.Debug\aotsdk\aotminipal.lib
+ /SECTIONLAYOUT:@$(NativeAotSourceRoot)BuildIntegration\sectionlayout.txt %(AdditionalOptions)
@@ -209,6 +210,7 @@
Console
true
$(ArtifactsRoot)bin\repro\Arm64\Debug\repro.obj;$(Win32SDKLibs);%(AdditionalDependencies);$(ArtifactsRoot)bin\coreclr\windows.Arm64.Debug\aotsdk\Runtime.WorkstationGC.lib;$(ArtifactsRoot)bin\coreclr\windows.Arm64.Debug\aotsdk\System.Globalization.Native.Aot.lib;$(ArtifactsRoot)bin\coreclr\windows.Arm64.Debug\aotsdk\System.IO.Compression.Native.Aot.lib;$(ArtifactsRoot)bin\coreclr\windows.Arm64.Debug\aotsdk\eventpipe-disabled.lib;$(ArtifactsRoot)bin\coreclr\windows.Arm64.Debug\aotsdk\standalonegc-disabled.lib;$(ArtifactsRoot)bin\coreclr\windows.Arm64.Debug\aotsdk\aotminipal.lib
+ /SECTIONLAYOUT:@$(NativeAotSourceRoot)BuildIntegration\sectionlayout.txt %(AdditionalOptions)
@@ -228,6 +230,7 @@
Console
true
$(ArtifactsRoot)bin\repro\x86\Debug\repro.obj;$(Win32SDKLibs);%(AdditionalDependencies);$(ArtifactsRoot)bin\coreclr\windows.x86.Debug\aotsdk\Runtime.WorkstationGC.lib;$(ArtifactsRoot)bin\coreclr\windows.x86.Debug\aotsdk\System.Globalization.Native.Aot.lib;$(ArtifactsRoot)bin\coreclr\windows.x86.Debug\aotsdk\System.IO.Compression.Native.Aot.lib;$(ArtifactsRoot)bin\coreclr\windows.x86.Debug\aotsdk\eventpipe-disabled.lib;$(ArtifactsRoot)bin\coreclr\windows.x86.Debug\aotsdk\standalonegc-disabled.lib;$(ArtifactsRoot)bin\coreclr\windows.x86.Debug\aotsdk\aotminipal.lib
+ /SECTIONLAYOUT:@$(NativeAotSourceRoot)BuildIntegration\sectionlayout.txt %(AdditionalOptions)
@@ -248,6 +251,7 @@
true
true
$(ArtifactsRoot)bin\repro\x64\Checked\repro.obj;$(Win32SDKLibs);%(AdditionalDependencies);$(ArtifactsRoot)bin\coreclr\windows.x64.Checked\aotsdk\Runtime.WorkstationGC.lib;$(ArtifactsRoot)bin\coreclr\windows.x64.Checked\aotsdk\System.Globalization.Native.Aot.lib;$(ArtifactsRoot)bin\coreclr\windows.x64.Checked\aotsdk\System.IO.Compression.Native.Aot.lib;$(ArtifactsRoot)bin\coreclr\windows.x64.Checked\aotsdk\eventpipe-disabled.lib;$(ArtifactsRoot)bin\coreclr\windows.x64.Checked\aotsdk\Runtime.VxsortDisabled.lib;$(ArtifactsRoot)bin\coreclr\windows.x64.Checked\aotsdk\standalonegc-disabled.lib;;$(ArtifactsRoot)bin\coreclr\windows.x64.Checked\aotsdk\aotminipal.lib
+ /SECTIONLAYOUT:@$(NativeAotSourceRoot)BuildIntegration\sectionlayout.txt %(AdditionalOptions)
@@ -268,6 +272,7 @@
true
true
$(ArtifactsRoot)bin\repro\Arm64\Checked\repro.obj;$(Win32SDKLibs);%(AdditionalDependencies);$(ArtifactsRoot)bin\coreclr\windows.Arm64.Checked\aotsdk\Runtime.WorkstationGC.lib;$(ArtifactsRoot)bin\coreclr\windows.Arm64.Checked\aotsdk\System.Globalization.Native.Aot.lib;$(ArtifactsRoot)bin\coreclr\windows.Arm64.Checked\aotsdk\System.IO.Compression.Native.Aot.lib;$(ArtifactsRoot)bin\coreclr\windows.Arm64.Checked\aotsdk\eventpipe-disabled.lib;$(ArtifactsRoot)bin\coreclr\windows.Arm64.Checked\aotsdk\standalonegc-disabled.lib;$(ArtifactsRoot)bin\coreclr\windows.Arm64.Checked\aotsdk\aotminipal.lib
+ /SECTIONLAYOUT:@$(NativeAotSourceRoot)BuildIntegration\sectionlayout.txt %(AdditionalOptions)
@@ -289,6 +294,7 @@
true
true
$(ArtifactsRoot)bin\repro\x86\Checked\repro.obj;$(Win32SDKLibs);%(AdditionalDependencies);$(ArtifactsRoot)bin\coreclr\windows.x86.Checked\aotsdk\Runtime.WorkstationGC.lib;$(ArtifactsRoot)bin\coreclr\windows.x86.Checked\aotsdk\System.Globalization.Native.Aot.lib;$(ArtifactsRoot)bin\coreclr\windows.x86.Checked\aotsdk\System.IO.Compression.Native.Aot.lib;$(ArtifactsRoot)bin\coreclr\windows.x86.Checked\aotsdk\eventpipe-disabled.lib;$(ArtifactsRoot)bin\coreclr\windows.x86.Checked\aotsdk\standalonegc-disabled.lib;$(ArtifactsRoot)bin\coreclr\windows.x86.Checked\aotsdk\aotminipal.lib
+ /SECTIONLAYOUT:@$(NativeAotSourceRoot)BuildIntegration\sectionlayout.txt %(AdditionalOptions)
@@ -309,6 +315,7 @@
true
true
$(ArtifactsRoot)bin\repro\x64\Release\repro.obj;$(Win32SDKLibs);%(AdditionalDependencies);$(ArtifactsRoot)bin\coreclr\windows.x64.Release\aotsdk\Runtime.WorkstationGC.lib;$(ArtifactsRoot)bin\coreclr\windows.x64.Release\aotsdk\System.Globalization.Native.Aot.lib;$(ArtifactsRoot)bin\coreclr\windows.x64.Release\aotsdk\System.IO.Compression.Native.Aot.lib;$(ArtifactsRoot)bin\coreclr\windows.x64.Release\aotsdk\eventpipe-disabled.lib;$(ArtifactsRoot)bin\coreclr\windows.x64.Release\aotsdk\Runtime.VxsortDisabled.lib;$(ArtifactsRoot)bin\coreclr\windows.x64.Release\aotsdk\standalonegc-disabled.lib;$(ArtifactsRoot)bin\coreclr\windows.x64.Release\aotsdk\aotminipal.lib
+ /SECTIONLAYOUT:@$(NativeAotSourceRoot)BuildIntegration\sectionlayout.txt %(AdditionalOptions)
@@ -329,6 +336,7 @@
true
true
$(ArtifactsRoot)bin\repro\Arm64\Release\repro.obj;$(Win32SDKLibs);%(AdditionalDependencies);$(ArtifactsRoot)bin\coreclr\windows.Arm64.Release\aotsdk\Runtime.WorkstationGC.lib;$(ArtifactsRoot)bin\coreclr\windows.Arm64.Release\aotsdk\System.Globalization.Native.Aot.lib;$(ArtifactsRoot)bin\coreclr\windows.Arm64.Release\aotsdk\System.IO.Compression.Native.Aot.lib;$(ArtifactsRoot)bin\coreclr\windows.Arm64.Release\aotsdk\eventpipe-disabled.lib;$(ArtifactsRoot)bin\coreclr\windows.Arm64.Release\aotsdk\standalonegc-disabled.lib;$(ArtifactsRoot)bin\coreclr\windows.Arm64.Release\aotsdk\aotminipal.lib
+ /SECTIONLAYOUT:@$(NativeAotSourceRoot)BuildIntegration\sectionlayout.txt %(AdditionalOptions)
@@ -350,6 +358,7 @@
true
true
$(ArtifactsRoot)bin\repro\x86\Release\repro.obj;$(Win32SDKLibs);%(AdditionalDependencies);$(ArtifactsRoot)bin\coreclr\windows.x86.Release\aotsdk\Runtime.WorkstationGC.lib;$(ArtifactsRoot)bin\coreclr\windows.x86.Release\aotsdk\System.Globalization.Native.Aot.lib;$(ArtifactsRoot)bin\coreclr\windows.x86.Release\aotsdk\System.IO.Compression.Native.Aot.lib;$(ArtifactsRoot)bin\coreclr\windows.x86.Release\aotsdk\eventpipe-disabled.lib;$(ArtifactsRoot)bin\coreclr\windows.x86.Release\aotsdk\standalonegc-disabled.lib;$(ArtifactsRoot)bin\coreclr\windows.x86.Release\aotsdk\aotminipal.lib
+ /SECTIONLAYOUT:@$(NativeAotSourceRoot)BuildIntegration\sectionlayout.txt %(AdditionalOptions)