| # Copyright (C) 1991-2018 Free Software Foundation, Inc. |
| # This file is part of the GNU C Library. |
| |
| # The GNU C Library is free software; you can redistribute it and/or |
| # modify it under the terms of the GNU Lesser General Public |
| # License as published by the Free Software Foundation; either |
| # version 2.1 of the License, or (at your option) any later version. |
| |
| # The GNU C Library is distributed in the hope that it will be useful, |
| # but WITHOUT ANY WARRANTY; without even the implied warranty of |
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| # Lesser General Public License for more details. |
| |
| # You should have received a copy of the GNU Lesser General Public |
| # License along with the GNU C Library; if not, see |
| # <http://www.gnu.org/licenses/>. |
| |
| ifndef inhibit-unix-syscalls |
| |
| # Sysdep dirs unix/... can contain a file syscalls.list, |
| # which specifies objects to be compiled as simple Unix system calls. |
| |
| -include $(common-objpfx)sysd-syscalls |
| |
| ifeq (misc,$(subdir)) |
| sysdep_routines += $(unix-extra-syscalls) |
| |
| ifdef unix-stub-syscalls |
| # The system call entry points in this list are supposed to be additional |
| # functions not overriding any other sysdeps/.../call.c implementation, but |
| # their system call numbers are unavailable in the kernel headers we're |
| # using. Instead of a system call stub, these get a function that fails |
| # with ENOSYS. We just generate a single module defining one function and |
| # making all these entry point names aliases for it. |
| sysdep_routines += stub-syscalls |
| $(objpfx)stub-syscalls.c: $(common-objpfx)sysd-syscalls \ |
| $(..)sysdeps/unix/Makefile |
| $(make-target-directory) |
| (for call in $(unix-stub-syscalls); do \ |
| call=$${call%%@*}; \ |
| echo "#define $$call RENAMED_$$call"; \ |
| done; \ |
| echo '#include <errno.h>'; \ |
| echo '#include <shlib-compat.h>'; \ |
| for call in $(unix-stub-syscalls); do \ |
| call=$${call%%@*}; \ |
| echo "#undef $$call"; \ |
| done; \ |
| echo 'long int _no_syscall (void)'; \ |
| echo '{ __set_errno (ENOSYS); return -1L; }'; \ |
| for call in $(unix-stub-syscalls); do \ |
| case $$call in \ |
| *@@*) \ |
| ver=$${call##*@}; call=$${call%%@*}; \ |
| ver=`echo "$$ver" | sed 's/\./_/g'`; \ |
| echo "strong_alias (_no_syscall, __$${call}_$${ver})"; \ |
| echo "versioned_symbol (libc, __$${call}_$${ver}, $$call, $$ver);"\ |
| ;; \ |
| *@*) \ |
| ver=$${call##*@}; call=$${call%%@*}; \ |
| ver=`echo "$$ver" | sed 's/\./_/g'`; \ |
| case $$ver in \ |
| *:*) \ |
| compat_ver=$${ver#*:}; \ |
| ver=$${ver%%:*}; \ |
| compat_cond="SHLIB_COMPAT (libc, $$ver, $$compat_ver)"; \ |
| ;; \ |
| *) \ |
| compat_cond=""; \ |
| ;; \ |
| esac; \ |
| if [ -n "$$compat_cond" ]; then echo "#if $$compat_cond"; fi; \ |
| echo "strong_alias (_no_syscall, __$${call}_$${ver})"; \ |
| echo "compat_symbol (libc, __$${call}_$${ver}, $$call, $$ver);"; \ |
| if [ -n "$$compat_cond" ]; then echo "#endif"; fi; \ |
| ;; \ |
| *) echo "weak_alias (_no_syscall, $$call)"; \ |
| echo "stub_warning ($$call)"; \ |
| echo "weak_alias (_no_syscall, __GI_$$call)" ;; \ |
| esac; \ |
| done) > $@T |
| mv -f $@T $@ |
| generated += stub-syscalls.c |
| endif |
| endif |
| |
| # This is the end of the pipeline for compiling the syscall stubs. |
| # The stdin is assembler with cpp using sysdep.h macros. |
| compile-syscall = $(COMPILE.S) -o $@ -x assembler-with-cpp - \ |
| $(compile-mkdep-flags) |
| |
| ifndef avoid-generated |
| $(common-objpfx)sysd-syscalls: $(..)sysdeps/unix/make-syscalls.sh \ |
| $(wildcard $(+sysdep_dirs:%=%/syscalls.list)) \ |
| $(common-objpfx)libc-modules.stmp |
| for dir in $(+sysdep_dirs); do \ |
| test -f $$dir/syscalls.list && \ |
| { sysdirs='$(sysdirs)' \ |
| asm_CPP='$(COMPILE.S) -E -x assembler-with-cpp' \ |
| $(SHELL) $(dir $<)$(notdir $<) $$dir || exit 1; }; \ |
| test $$dir = $(..)sysdeps/unix && break; \ |
| done > $@T |
| mv -f $@T $@ |
| endif |
| |
| $(common-objpfx)s-%.d: $(..)sysdeps/unix/s-%.S \ |
| $(wildcard $(+sysdep_dirs:%=%/syscalls.list)) |
| $(+make-deps) |
| |
| postclean-generated += sysd-syscalls |
| |
| endif |