diff --git a/sdk/lib/ucrt/inc/internal_shared.h b/sdk/lib/ucrt/inc/internal_shared.h index a0f1a5a841e..340407bed96 100644 --- a/sdk/lib/ucrt/inc/internal_shared.h +++ b/sdk/lib/ucrt/inc/internal_shared.h @@ -27,6 +27,7 @@ extern "C" { #define _CRTALLOC(x) __attribute__((section(x))) #endif +#ifdef _MSC_VER #pragma section(".CRT$XIC", long, read) #pragma section(".CRT$XPX", long, read) #pragma section(".CRT$XPXA", long, read) @@ -39,6 +40,7 @@ extern "C" { #pragma section(".CRT$XPZ", long, read) #pragma section(".CRT$XTA", long, read) #pragma section(".CRT$XTZ", long, read) +#endif extern _PIFV __xi_a[]; extern _PIFV __xi_z[]; diff --git a/sdk/lib/ucrt/vcruntime/initializers.cpp b/sdk/lib/ucrt/vcruntime/initializers.cpp new file mode 100644 index 00000000000..f93e918bdc7 --- /dev/null +++ b/sdk/lib/ucrt/vcruntime/initializers.cpp @@ -0,0 +1,22 @@ +// +// section_markers.c +// +// Copyright (c) 2024 Timo Kreuzer +// +// Markers for CRT initializer sections. +// +// SPDX-License-Identifier: MIT +// + +#include + +_CRTALLOC(".CRT$XIA") _PIFV __xi_a[] = { 0 }; +_CRTALLOC(".CRT$XIZ") _PIFV __xi_z[] = { 0 }; +_CRTALLOC(".CRT$XCA") _PVFV __xc_a[] = { 0 }; +_CRTALLOC(".CRT$XCZ") _PVFV __xc_z[] = { 0 }; +_CRTALLOC(".CRT$XPA") _PVFV __xp_a[] = { 0 }; +_CRTALLOC(".CRT$XPZ") _PVFV __xp_z[] = { 0 }; +_CRTALLOC(".CRT$XTA") _PVFV __xt_a[] = { 0 }; +_CRTALLOC(".CRT$XTZ") _PVFV __xt_z[] = { 0 }; + +#pragma comment(linker, "/merge:.CRT=.rdata") diff --git a/sdk/lib/ucrt/vcruntime/vcruntime.cmake b/sdk/lib/ucrt/vcruntime/vcruntime.cmake index feb4a44d66d..2c3ab680910 100644 --- a/sdk/lib/ucrt/vcruntime/vcruntime.cmake +++ b/sdk/lib/ucrt/vcruntime/vcruntime.cmake @@ -4,6 +4,7 @@ list(APPEND UCRT_VCRUNTIME_SOURCES vcruntime/__report_rangecheckfailure.c vcruntime/__security_init_cookie.c vcruntime/__vcrt_init.c + vcruntime/initializers.cpp ) if(${ARCH} STREQUAL "i386")