1# Copyright (C) 1991-2021 Free Software Foundation, Inc. 2# This file is part of the GNU C Library. 3 4# The GNU C Library is free software; you can redistribute it and/or 5# modify it under the terms of the GNU Lesser General Public 6# License as published by the Free Software Foundation; either 7# version 2.1 of the License, or (at your option) any later version. 8 9# The GNU C Library is distributed in the hope that it will be useful, 10# but WITHOUT ANY WARRANTY; without even the implied warranty of 11# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12# Lesser General Public License for more details. 13 14# You should have received a copy of the GNU Lesser General Public 15# License along with the GNU C Library; if not, see 16# <https://www.gnu.org/licenses/>. 17 18ifndef inhibit-unix-syscalls 19 20# Sysdep dirs unix/... can contain a file syscalls.list, 21# which specifies objects to be compiled as simple Unix system calls. 22 23-include $(common-objpfx)sysd-syscalls 24 25ifeq (misc,$(subdir)) 26sysdep_routines += $(unix-extra-syscalls) 27 28ifdef unix-stub-syscalls 29# The system call entry points in this list are supposed to be additional 30# functions not overriding any other sysdeps/.../call.c implementation, but 31# their system call numbers are unavailable in the kernel headers we're 32# using. Instead of a system call stub, these get a function that fails 33# with ENOSYS. We just generate a single module defining one function and 34# making all these entry point names aliases for it. 35sysdep_routines += stub-syscalls 36$(objpfx)stub-syscalls.c: $(common-objpfx)sysd-syscalls \ 37 $(..)sysdeps/unix/Makefile 38 $(make-target-directory) 39 (for call in $(unix-stub-syscalls); do \ 40 call=$${call%%@*}; \ 41 echo "#define $$call RENAMED_$$call"; \ 42 done; \ 43 echo '#include <errno.h>'; \ 44 echo '#include <shlib-compat.h>'; \ 45 for call in $(unix-stub-syscalls); do \ 46 call=$${call%%@*}; \ 47 echo "#undef $$call"; \ 48 done; \ 49 echo 'long int _no_syscall (void)'; \ 50 echo '{ __set_errno (ENOSYS); return -1L; }'; \ 51 for call in $(unix-stub-syscalls); do \ 52 case $$call in \ 53 *@@*) \ 54 ver=$${call##*@}; call=$${call%%@*}; \ 55 ver=`echo "$$ver" | sed 's/\./_/g'`; \ 56 echo "strong_alias (_no_syscall, __$${call}_$${ver})"; \ 57 echo "versioned_symbol (libc, __$${call}_$${ver}, $$call, $$ver);"\ 58 ;; \ 59 *@*) \ 60 ver=$${call##*@}; call=$${call%%@*}; \ 61 ver=`echo "$$ver" | sed 's/\./_/g'`; \ 62 case $$ver in \ 63 *:*) \ 64 compat_ver=$${ver#*:}; \ 65 ver=$${ver%%:*}; \ 66 compat_cond="SHLIB_COMPAT (libc, $$ver, $$compat_ver)"; \ 67 ;; \ 68 *) \ 69 compat_cond=""; \ 70 ;; \ 71 esac; \ 72 if [ -n "$$compat_cond" ]; then echo "#if $$compat_cond"; fi; \ 73 echo "strong_alias (_no_syscall, __$${call}_$${ver})"; \ 74 echo "compat_symbol (libc, __$${call}_$${ver}, $$call, $$ver);"; \ 75 if [ -n "$$compat_cond" ]; then echo "#endif"; fi; \ 76 ;; \ 77 *) echo "weak_alias (_no_syscall, $$call)"; \ 78 echo "stub_warning ($$call)"; \ 79 echo "weak_alias (_no_syscall, __GI_$$call)" ;; \ 80 esac; \ 81 done) > $@T 82 mv -f $@T $@ 83generated += stub-syscalls.c 84endif 85endif 86 87# This is the end of the pipeline for compiling the syscall stubs. 88# The stdin is assembler with cpp using sysdep.h macros. 89compile-syscall = $(COMPILE.S) -o $@ -x assembler-with-cpp - \ 90 $(compile-mkdep-flags) 91 92ifndef avoid-generated 93$(common-objpfx)sysd-syscalls: $(..)sysdeps/unix/make-syscalls.sh \ 94 $(wildcard $(+sysdep_dirs:%=%/syscalls.list)) \ 95 $(wildcard $(+sysdep_dirs:%=%/arch-syscall.h)) \ 96 $(common-objpfx)libc-modules.stmp 97 for dir in $(+sysdep_dirs); do \ 98 test -f $$dir/syscalls.list && \ 99 { sysdirs='$(sysdirs)' \ 100 asm_CPP='$(COMPILE.S) -E -x assembler-with-cpp' \ 101 $(SHELL) $(dir $<)$(notdir $<) $$dir || exit 1; }; \ 102 test $$dir = $(..)sysdeps/unix && break; \ 103 done > $@T 104 mv -f $@T $@ 105endif 106 107postclean-generated += sysd-syscalls 108 109endif 110