[10/14,v6] De-PLTize __stack_chk_fail internal calls within libc.so.
Commit Message
From: Adhemerval Zanella <adhemerval.zanella@linaro.org>
We use the same assembler-macro trick we use to de-PLTize
compiler-generated libcalls to memcpy and memset to redirect
__stack_chk_fail to __stack_chk_fail_local.
v5: New.
v6: Only do it within the shared library: with __stack_chk_fail_local
in libc_pic.a now we don't need to worry about calls from inside
other routines in libc_nonshared.a any more.
* sysdeps/generic/symbol-hacks.h (__stack_chk_fail): Add internal
alias.
---
sysdeps/generic/symbol-hacks.h | 6 ++++++
1 file changed, 6 insertions(+)
Comments
On 06/07/2016 01:06 PM, Nix wrote:
> --- a/sysdeps/generic/symbol-hacks.h
> +++ b/sysdeps/generic/symbol-hacks.h
> @@ -5,3 +5,9 @@ asm ("memmove = __GI_memmove");
> asm ("memset = __GI_memset");
> asm ("memcpy = __GI_memcpy");
> #endif
> +
> +/* -fstack-protector generates calls to __stack_chk_fail, which need
> + similar adjustments to avoid going through the PLT. */
> +#if !defined __ASSEMBLER__ && IS_IN (libc) && defined SHARED
> +asm ("__stack_chk_fail = __stack_chk_fail_local");
> +#endif
The condition can be merged with the previous block, I think.
Otherwise, looks reasonable.
Thanks,
Florian
@@ -5,3 +5,9 @@ asm ("memmove = __GI_memmove");
asm ("memset = __GI_memset");
asm ("memcpy = __GI_memcpy");
#endif
+
+/* -fstack-protector generates calls to __stack_chk_fail, which need
+ similar adjustments to avoid going through the PLT. */
+#if !defined __ASSEMBLER__ && IS_IN (libc) && defined SHARED
+asm ("__stack_chk_fail = __stack_chk_fail_local");
+#endif