libsanitizer: On aarch64 use hint #34 in prologue of libsanitizer functions
Checks
Commit Message
Hi!
When gcc is built with -mbranch-protection=standard, running sanitized
programs doesn't work properly on bti enabled kernels.
This has been fixed upstream with
https://github.com/llvm/llvm-project/pull/84061
The following patch cherry picks that from upstream, ok for trunk/14.3?
For trunk we should eventually do a full merge from upstream, but I'm hoping
they will first fix up the _BitInt libubsan support mess.
2024-09-05 Jakub Jelinek <jakub@redhat.com>
* sanitizer_common/sanitizer_asm.h: Cherry-pick llvm-project revision
1c792d24e0a228ad49cc004a1c26bbd7cd87f030.
* interception/interception.h: Likewise.
Jakub
Comments
Jakub Jelinek <jakub@redhat.com> writes:
> Hi!
>
> When gcc is built with -mbranch-protection=standard, running sanitized
> programs doesn't work properly on bti enabled kernels.
>
> This has been fixed upstream with
> https://github.com/llvm/llvm-project/pull/84061
>
> The following patch cherry picks that from upstream, ok for trunk/14.3?
Yes, thanks!
Richard
> For trunk we should eventually do a full merge from upstream, but I'm hoping
> they will first fix up the _BitInt libubsan support mess.
>
> 2024-09-05 Jakub Jelinek <jakub@redhat.com>
>
> * sanitizer_common/sanitizer_asm.h: Cherry-pick llvm-project revision
> 1c792d24e0a228ad49cc004a1c26bbd7cd87f030.
> * interception/interception.h: Likewise.
>
> --- libsanitizer/sanitizer_common/sanitizer_asm.h
> +++ libsanitizer/sanitizer_common/sanitizer_asm.h
> @@ -42,6 +42,16 @@
> # define CFI_RESTORE(reg)
> #endif
>
> +#if defined(__aarch64__) && defined(__ARM_FEATURE_BTI_DEFAULT)
> +# define ASM_STARTPROC CFI_STARTPROC; hint #34
> +# define C_ASM_STARTPROC SANITIZER_STRINGIFY(CFI_STARTPROC) "\nhint #34"
> +#else
> +# define ASM_STARTPROC CFI_STARTPROC
> +# define C_ASM_STARTPROC SANITIZER_STRINGIFY(CFI_STARTPROC)
> +#endif
> +#define ASM_ENDPROC CFI_ENDPROC
> +#define C_ASM_ENDPROC SANITIZER_STRINGIFY(CFI_ENDPROC)
> +
> #if defined(__x86_64__) || defined(__i386__) || defined(__sparc__)
> # define ASM_TAIL_CALL jmp
> #elif defined(__arm__) || defined(__aarch64__) || defined(__mips__) || \
> @@ -114,9 +124,9 @@
> .globl __interceptor_trampoline_##name; \
> ASM_TYPE_FUNCTION(__interceptor_trampoline_##name); \
> __interceptor_trampoline_##name: \
> - CFI_STARTPROC; \
> + ASM_STARTPROC; \
> ASM_TAIL_CALL ASM_PREEMPTIBLE_SYM(__interceptor_##name); \
> - CFI_ENDPROC; \
> + ASM_ENDPROC; \
> ASM_SIZE(__interceptor_trampoline_##name)
> # define ASM_INTERCEPTOR_TRAMPOLINE_SUPPORT 1
> # endif // Architecture supports interceptor trampoline
> --- libsanitizer/interception/interception.h
> +++ libsanitizer/interception/interception.h
> @@ -204,11 +204,11 @@ const interpose_substitution substitution_##func_name[] \
> ".type " SANITIZER_STRINGIFY(TRAMPOLINE(func)) ", " \
> ASM_TYPE_FUNCTION_STR "\n" \
> SANITIZER_STRINGIFY(TRAMPOLINE(func)) ":\n" \
> - SANITIZER_STRINGIFY(CFI_STARTPROC) "\n" \
> + C_ASM_STARTPROC "\n" \
> C_ASM_TAIL_CALL(SANITIZER_STRINGIFY(TRAMPOLINE(func)), \
> "__interceptor_" \
> SANITIZER_STRINGIFY(ASM_PREEMPTIBLE_SYM(func))) "\n" \
> - SANITIZER_STRINGIFY(CFI_ENDPROC) "\n" \
> + C_ASM_ENDPROC "\n" \
> ".size " SANITIZER_STRINGIFY(TRAMPOLINE(func)) ", " \
> ".-" SANITIZER_STRINGIFY(TRAMPOLINE(func)) "\n" \
> );
>
> Jakub
@@ -42,6 +42,16 @@
# define CFI_RESTORE(reg)
#endif
+#if defined(__aarch64__) && defined(__ARM_FEATURE_BTI_DEFAULT)
+# define ASM_STARTPROC CFI_STARTPROC; hint #34
+# define C_ASM_STARTPROC SANITIZER_STRINGIFY(CFI_STARTPROC) "\nhint #34"
+#else
+# define ASM_STARTPROC CFI_STARTPROC
+# define C_ASM_STARTPROC SANITIZER_STRINGIFY(CFI_STARTPROC)
+#endif
+#define ASM_ENDPROC CFI_ENDPROC
+#define C_ASM_ENDPROC SANITIZER_STRINGIFY(CFI_ENDPROC)
+
#if defined(__x86_64__) || defined(__i386__) || defined(__sparc__)
# define ASM_TAIL_CALL jmp
#elif defined(__arm__) || defined(__aarch64__) || defined(__mips__) || \
@@ -114,9 +124,9 @@
.globl __interceptor_trampoline_##name; \
ASM_TYPE_FUNCTION(__interceptor_trampoline_##name); \
__interceptor_trampoline_##name: \
- CFI_STARTPROC; \
+ ASM_STARTPROC; \
ASM_TAIL_CALL ASM_PREEMPTIBLE_SYM(__interceptor_##name); \
- CFI_ENDPROC; \
+ ASM_ENDPROC; \
ASM_SIZE(__interceptor_trampoline_##name)
# define ASM_INTERCEPTOR_TRAMPOLINE_SUPPORT 1
# endif // Architecture supports interceptor trampoline
@@ -204,11 +204,11 @@ const interpose_substitution substitution_##func_name[] \
".type " SANITIZER_STRINGIFY(TRAMPOLINE(func)) ", " \
ASM_TYPE_FUNCTION_STR "\n" \
SANITIZER_STRINGIFY(TRAMPOLINE(func)) ":\n" \
- SANITIZER_STRINGIFY(CFI_STARTPROC) "\n" \
+ C_ASM_STARTPROC "\n" \
C_ASM_TAIL_CALL(SANITIZER_STRINGIFY(TRAMPOLINE(func)), \
"__interceptor_" \
SANITIZER_STRINGIFY(ASM_PREEMPTIBLE_SYM(func))) "\n" \
- SANITIZER_STRINGIFY(CFI_ENDPROC) "\n" \
+ C_ASM_ENDPROC "\n" \
".size " SANITIZER_STRINGIFY(TRAMPOLINE(func)) ", " \
".-" SANITIZER_STRINGIFY(TRAMPOLINE(func)) "\n" \
);