@@ -54,22 +54,33 @@ static void __attribute__((used)) __do_init(void) {
5454}
5555
5656#ifdef CRT_HAS_INITFINI_ARRAY
57- #if __has_feature (ptrauth_init_fini )
57+ # if __has_feature (ptrauth_init_fini )
5858// TODO: use __ptrauth-qualified pointers when they are supported on clang side
59- #if __has_feature (ptrauth_init_fini_address_discrimination )
59+ # if __has_feature (ptrauth_init_fini_address_discrimination )
6060__attribute__((section (".init_array" ), used )) static void * __init =
6161 ptrauth_sign_constant (& __do_init , ptrauth_key_init_fini_pointer ,
6262 ptrauth_blend_discriminator (
6363 & __init , __ptrauth_init_fini_discriminator ));
64- #else
64+ # else
6565__attribute__((section (".init_array" ), used )) static void * __init =
6666 ptrauth_sign_constant (& __do_init , ptrauth_key_init_fini_pointer ,
6767 __ptrauth_init_fini_discriminator );
68- #endif
69- #else
68+ # endif
69+ # elif __has_feature (ptrauth_calls )
70+ # ifdef __aarch64__
71+ // If ptrauth_init_fini feature is not present, compiler emits raw unsigned
72+ // pointers in .init_array. Use inline assembly to avoid implicit signing of
73+ // __do_init function pointer with ptrauth_calls enabled.
74+ __asm__(".pushsection .init_array,\"aw\",@init_array\n\t"
75+ ".xword __do_init\n\t"
76+ ".popsection" );
77+ # else
78+ # error "ptrauth_calls is only supported for AArch64"
79+ # endif
80+ # else
7081__attribute__((section (".init_array" ),
7182 used )) static void (* __init )(void ) = __do_init ;
72- #endif
83+ # endif
7384#elif defined(__i386__ ) || defined(__x86_64__ )
7485__asm__(".pushsection .init,\"ax\",@progbits\n\t"
7586 "call __do_init\n\t"
@@ -125,22 +136,33 @@ static void __attribute__((used)) __do_fini(void) {
125136}
126137
127138#ifdef CRT_HAS_INITFINI_ARRAY
128- #if __has_feature (ptrauth_init_fini )
139+ # if __has_feature (ptrauth_init_fini )
129140// TODO: use __ptrauth-qualified pointers when they are supported on clang side
130- #if __has_feature (ptrauth_init_fini_address_discrimination )
141+ # if __has_feature (ptrauth_init_fini_address_discrimination )
131142__attribute__((section (".fini_array" ), used )) static void * __fini =
132143 ptrauth_sign_constant (& __do_fini , ptrauth_key_init_fini_pointer ,
133144 ptrauth_blend_discriminator (
134145 & __fini , __ptrauth_init_fini_discriminator ));
135- #else
146+ # else
136147__attribute__((section (".fini_array" ), used )) static void * __fini =
137148 ptrauth_sign_constant (& __do_fini , ptrauth_key_init_fini_pointer ,
138149 __ptrauth_init_fini_discriminator );
139- #endif
140- #else
150+ # endif
151+ # elif __has_feature (ptrauth_calls )
152+ # ifdef __aarch64__
153+ // If ptrauth_init_fini feature is not present, compiler emits raw unsigned
154+ // pointers in .fini_array. Use inline assembly to avoid implicit signing of
155+ // __do_fini function pointer with ptrauth_calls enabled.
156+ __asm__(".pushsection .fini_array,\"aw\",@fini_array\n\t"
157+ ".xword __do_fini\n\t"
158+ ".popsection" );
159+ # else
160+ # error "ptrauth_calls is only supported for AArch64"
161+ # endif
162+ # else
141163__attribute__((section (".fini_array" ),
142164 used )) static void (* __fini )(void ) = __do_fini ;
143- #endif
165+ # endif
144166#elif defined(__i386__ ) || defined(__x86_64__ )
145167__asm__(".pushsection .fini,\"ax\",@progbits\n\t"
146168 "call __do_fini\n\t"
0 commit comments