diff --git a/ChangeLog b/ChangeLog index 0426d63690..91c77515db 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2017-09-26 Joseph Myers + + * sysdeps/unix/make-syscalls.sh: Use __ifunc to define symbols + using VDSO. + 2017-09-26 Alexey Makhalov * elf/dl-tunables.c (do_tunable_update_val): Range checking fix. diff --git a/sysdeps/unix/make-syscalls.sh b/sysdeps/unix/make-syscalls.sh index 042cfacfd2..874ad691cd 100644 --- a/sysdeps/unix/make-syscalls.sh +++ b/sysdeps/unix/make-syscalls.sh @@ -280,16 +280,14 @@ while read file srcfile caller syscall args strong weak; do \$(foreach p,\$(sysd-rules-targets),\$(objpfx)\$(patsubst %,\$p,$file).os): \\ \$(..)sysdeps/unix/make-syscalls.sh \$(make-target-directory) - (echo '#include '; \\ - echo 'extern void *${strong}_ifunc (void) __asm ("${strong}");'; \\ - echo 'void *'; \\ - echo 'inhibit_stack_protector'; \\ - echo '${strong}_ifunc (void)'; \\ - echo '{'; \\ - echo ' PREPARE_VERSION_KNOWN (symver, ${vdso_symver});'; \\ - echo ' return _dl_vdso_vsym ("${vdso_symbol}", &symver);'; \\ - echo '}'; \\ - echo 'asm (".type ${strong}, %gnu_indirect_function");'; \\ + (echo '#define ${strong} __redirect_${strong}'; \\ + echo '#include '; \\ + echo '#undef ${strong}'; \\ + echo '#define vdso_ifunc_init() \\'; \\ + echo ' PREPARE_VERSION_KNOWN (symver, ${vdso_symver})'; \\ + echo '__ifunc (__redirect_${strong}, ${strong},'; \\ + echo ' _dl_vdso_vsym ("${vdso_symbol}", &symver), void,'; \\ + echo ' vdso_ifunc_init)'; \\ EOF # This is doing "hidden_def (${strong})", but the compiler # doesn't know that we've defined ${strong} in the same file, so