mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-22 13:00:06 +00:00
Remove vDSO support from make-syscall.sh
The auto-generated vDSO call shows some issues: - It requires sync the auto-generated C file with current glibc implementation; - It still uses symbol redirections hacks where libc-symbols.h provide macros that uses compiler builtins (libc_ifunc_redirected for instance); - It does not handle all required compiler handling (inhibit_stack_protector on iFUNC resolver). - No architecure uses it. Checked with a build against all major ABIs. Reviewed-by: Siddhesh Poyarekar <siddhesh@sourceware.org>
This commit is contained in:
parent
bc36727be9
commit
2822aaf4f7
@ -149,14 +149,6 @@ emit_weak_aliases()
|
||||
echo "$calls" |
|
||||
while read file srcfile caller syscall args strong weak; do
|
||||
|
||||
vdso_syscall=
|
||||
case x"$syscall" in
|
||||
*:*@*)
|
||||
vdso_syscall="${syscall#*:}"
|
||||
syscall="${syscall%:*}"
|
||||
;;
|
||||
esac
|
||||
|
||||
case x"$syscall" in
|
||||
x-) callnum=_ ;;
|
||||
*)
|
||||
@ -233,10 +225,9 @@ while read file srcfile caller syscall args strong weak; do
|
||||
if test $shared_only = t; then
|
||||
# The versioned symbols are only in the shared library.
|
||||
echo "shared-only-routines += $file"
|
||||
test -n "$vdso_syscall" || echo "\$(objpfx)${file}.os: \\"
|
||||
echo "\$(objpfx)${file}.os: \\"
|
||||
else
|
||||
object_suffixes='$(object-suffixes)'
|
||||
test -z "$vdso_syscall" || object_suffixes='$(object-suffixes-noshared)'
|
||||
echo "\
|
||||
\$(foreach p,\$(sysd-rules-targets),\
|
||||
\$(foreach o,${object_suffixes},\$(objpfx)\$(patsubst %,\$p,$file)\$o)): \\"
|
||||
@ -268,40 +259,6 @@ while read file srcfile caller syscall args strong weak; do
|
||||
echo ' ) | $(compile-syscall) '"\
|
||||
\$(foreach p,\$(patsubst %$file,%,\$(basename \$(@F))),\$(\$(p)CPPFLAGS))"
|
||||
|
||||
if test -n "$vdso_syscall"; then
|
||||
# In the shared library, we're going to emit an IFUNC using a vDSO function.
|
||||
# $vdso_syscall looks like "name@KERNEL_X.Y" where "name" is the symbol
|
||||
# name in the vDSO and KERNEL_X.Y is its symbol version.
|
||||
vdso_symbol="${vdso_syscall%@*}"
|
||||
vdso_symver="${vdso_syscall#*@}"
|
||||
vdso_symver=`echo "$vdso_symver" | sed 's/\./_/g'`
|
||||
cat <<EOF
|
||||
|
||||
\$(foreach p,\$(sysd-rules-targets),\$(objpfx)\$(patsubst %,\$p,$file).os): \\
|
||||
\$(..)sysdeps/unix/make-syscalls.sh
|
||||
\$(make-target-directory)
|
||||
(echo '#define ${strong} __redirect_${strong}'; \\
|
||||
echo '#include <dl-vdso.h>'; \\
|
||||
echo '#undef ${strong}'; \\
|
||||
echo '#define vdso_ifunc_init()'; \\
|
||||
echo '__ifunc (__redirect_${strong}, ${strong},'; \\
|
||||
echo ' get_vdso_symbol ("${vdso_symbol}"), 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
|
||||
# we can't do it the normal way.
|
||||
cat <<EOF
|
||||
echo 'asm (".globl __GI_${strong}");'; \\
|
||||
echo 'asm ("__GI_${strong} = ${strong}");'; \\
|
||||
EOF
|
||||
emit_weak_aliases
|
||||
cat <<EOF
|
||||
) | \$(compile-stdin.c) \
|
||||
\$(foreach p,\$(patsubst %$file,%,\$(basename \$(@F))),\$(\$(p)CPPFLAGS))
|
||||
EOF
|
||||
fi
|
||||
|
||||
if test $shared_only = t; then
|
||||
# The versioned symbols are only in the shared library.
|
||||
echo endif
|
||||
|
Loading…
Reference in New Issue
Block a user