mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-30 16:50:07 +00:00
130ac68ca2
Remove libc-modules.h from the tree and auto-generate it from soversions.i and the list of modules in the built-modules variable defined in Makeconfig. Macros generated have increasing numbered values, with built-modules having lower values starting from 1, following which a separator value LIBS_BEGIN is added and then finally the library names from soversions.i are appended to the list. This allows us to conveniently differentiate between the versioned libraries and other built modules, which is needed in errno.h and netdb.h to decide whether to use an internal symbol or an external one. Verified that generated code remains unchanged on x86_64. * Makeconfig (built-modules): List non-library modules to be built. (module-cppflags): Include libc-modules.h for everything except shlib-versions.v.i. (CPPFLAGS): Use it. (before-compile): Add libc-modules.h. ($(common-objpfx)libc-modules.h, $(common-objpfx)libc-modules.stmp): New targets. (common-generated): Add libc-modules.h and libc-modules.stmp. ($(common-objpfx)Versions.v.i): Depend on libc-modules.h. * include/libc-symbols.h: Don't include libc-modules.h. * include/libc-modules.h: Remove file. * scripts/gen-libc-modules.awk: New script to generate libc-modules.h. * sysdeps/unix/Makefile ($(common-objpfx)sysd-syscalls): Depend on libc-modules.stmp.
101 lines
3.6 KiB
Makefile
101 lines
3.6 KiB
Makefile
# Copyright (C) 1991-2014 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'`; \
|
|
echo "strong_alias (_no_syscall, __$${call}_$${ver})"; \
|
|
echo "compat_symbol (libc, __$${call}_$${ver}, $$call, $$ver);" \
|
|
;; \
|
|
*) 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
|