mirror of
https://sourceware.org/git/glibc.git
synced 2025-01-11 03:40:06 +00:00
eed3e1eb79
Various Linux kernel syscalls have become obsolete over time. Specifically, the following are obsolete in all kernel versions supported by glibc, are not present for architectures more recently added to the kernel, and as such, the wrapper functions for them should be compat symbols, not in static libc and not available for new links with shared libc. * bdflush: in Linux 2.6, does nothing if present. * create_module get_kernel_syms query_module: Linux 2.4 module interface, syscalls not present in Linux 2.6. * uselib: part of the mechanism for loading a.out shared libraries, irrelevant with ELF. This patch adds support for syscalls.list to list syscall aliases of the form NAME@VERSION:OBSOLETED, with SHLIB_COMPAT conditionals being generated for such aliases. Those five syscalls are then made into compat symbols (obsoleted in glibc 2.23, so future ports won't have these symbols at all), with the header <sys/kdaemon.h> declaring bdflush being removed. When we move to 3.2 as minimum kernel version, the same can be done for nfsservctl (removed in Linux 3.1) as well. Tested for x86_64 and x86 (testsuite, as well as checking that the symbols in question indeed become compat symbols, that they are indeed omitted from static libc, and that the generated SHLIB_COMPAT conditionals look right). [BZ #18472] * sysdeps/unix/Makefile ($(objpfx)stub-syscalls.c): Handle entries for the form NAME@VERSION:OBSOLETED and generate SHLIB_COMPAT conditionals for them. * sysdeps/unix/make-syscalls.sh (emit_weak_aliases): Likewise. * sysdeps/unix/sysv/linux/sys/kdaemon.h: Remove file. * sysdeps/unix/sysv/linux/Makefile (sysdep_headers): Remove sys/kdaemon.h. * sysdeps/unix/sysv/linux/syscalls.list (bdflush): Make into compat-only syscall, obsoleted in glibc 2.23. (create_module): Likewise. (get_kernel_syms): Likewise. (query_module): Likewise. (uselib): Likewise. * manual/sysinfo.texi (System Parameters): Do not mention bdflush.
113 lines
3.9 KiB
Makefile
113 lines
3.9 KiB
Makefile
# Copyright (C) 1991-2015 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
|