[UCRT:VCRUNTIME] Add initializer sections

Use #pragma section only for MSVC (and Clang-cl), because Clang doesn't like allocating non-const variables in a read-only section, while GCC doesn't understand these pragmas and ignores them.
This commit is contained in:
Timo Kreuzer 2024-12-02 14:00:35 +02:00
parent 4198ceb83a
commit 9c887efa0e
3 changed files with 25 additions and 0 deletions

View file

@ -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[];

View file

@ -0,0 +1,22 @@
//
// section_markers.c
//
// Copyright (c) 2024 Timo Kreuzer
//
// Markers for CRT initializer sections.
//
// SPDX-License-Identifier: MIT
//
#include <internal_shared.h>
_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")

View file

@ -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")