aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoseph Myers <joseph@codesourcery.com>2017-09-26 21:21:01 +0000
committerJoseph Myers <joseph@codesourcery.com>2017-09-26 21:21:01 +0000
commitbfb0deb3554204cbba10d61d96cad355e4ca5623 (patch)
tree2cc48e4715e8f184b9a1c149c9e8187521f6a1b6
parentcebcb9f864d4ca29e155363e71b7de6826d13cf1 (diff)
downloadglibc-bfb0deb3554204cbba10d61d96cad355e4ca5623.tar
glibc-bfb0deb3554204cbba10d61d96cad355e4ca5623.tar.gz
glibc-bfb0deb3554204cbba10d61d96cad355e4ca5623.tar.bz2
glibc-bfb0deb3554204cbba10d61d96cad355e4ca5623.zip
Fix make-syscalls.sh VDSO support for GCC 8.
sysdeps/unix/make-syscalls.sh has support, used only by x32, for generating IFUNCs for kernel VDSO symbols. This support creates IFUNCs by setting symbol types manually, which is bad for debug info and does not work with current GCC mainline because it results in errors from the checks on types of function aliases. This patch fixes it to use the common __ifunc macro, which uses the ifunc attribute when available and so works with GCC mainline. Note however that the original error resulted from an indirect inclusion of a header declaring __gettimeofday from the generated sources, and using __ifunc now relies on such an indirect inclusion remaining as it means use of __typeof to determine the correct types. If glibc's headers change in such a way as to remove that indirect inclusion, it will become necessary to change the syscalls.list syntax for VDSO syscalls so the name of the header to include can be specified. Tested (compilation only) with build-many-glibcs.py that this fixes the build for x32 with GCC mainline. * sysdeps/unix/make-syscalls.sh: Use __ifunc to define symbols using VDSO.
-rw-r--r--ChangeLog5
-rw-r--r--sysdeps/unix/make-syscalls.sh18
2 files changed, 13 insertions, 10 deletions
diff --git a/ChangeLog b/ChangeLog
index 0426d63690..91c77515db 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2017-09-26 Joseph Myers <joseph@codesourcery.com>
+
+ * sysdeps/unix/make-syscalls.sh: Use __ifunc to define symbols
+ using VDSO.
+
2017-09-26 Alexey Makhalov <amakhalov@vmware.com>
* 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 <dl-vdso.h>'; \\
- 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 <dl-vdso.h>'; \\
+ 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