Blame include/shlib-compat.h

Packit Service 82fcde
/* Macros for managing ABI-compatibility definitions using ELF symbol versions.
Packit Service 82fcde
   Copyright (C) 2000-2018 Free Software Foundation, Inc.
Packit Service 82fcde
   This file is part of the GNU C Library.
Packit Service 82fcde
Packit Service 82fcde
   The GNU C Library is free software; you can redistribute it and/or
Packit Service 82fcde
   modify it under the terms of the GNU Lesser General Public
Packit Service 82fcde
   License as published by the Free Software Foundation; either
Packit Service 82fcde
   version 2.1 of the License, or (at your option) any later version.
Packit Service 82fcde
Packit Service 82fcde
   The GNU C Library is distributed in the hope that it will be useful,
Packit Service 82fcde
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 82fcde
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Service 82fcde
   Lesser General Public License for more details.
Packit Service 82fcde
Packit Service 82fcde
   You should have received a copy of the GNU Lesser General Public
Packit Service 82fcde
   License along with the GNU C Library; if not, see
Packit Service 82fcde
   <http://www.gnu.org/licenses/>.  */
Packit Service 82fcde
Packit Service 82fcde
#ifndef _SHLIB_COMPAT_H
Packit Service 82fcde
#define _SHLIB_COMPAT_H	1
Packit Service 82fcde
Packit Service 82fcde
# include <abi-versions.h>
Packit Service 82fcde
Packit Service 82fcde
#ifdef SHARED
Packit Service 82fcde
Packit Service 82fcde
/* The file abi-versions.h (generated by scripts/abi-versions.awk) defines
Packit Service 82fcde
   symbols like `ABI_libm_GLIBC_2_0' for each version set in the source
Packit Service 82fcde
   code for each library.  For a version set that is subsumed by a later
Packit Service 82fcde
   version set, the definition gives the subsuming set, i.e. if GLIBC_2_0
Packit Service 82fcde
   is subsumed by GLIBC_2_1, then ABI_libm_GLIBC_2_0 == ABI_libm_GLIBC_2_1.
Packit Service 82fcde
   Each version set that is to be distinctly defined in the output has an
Packit Service 82fcde
   unique positive integer value, increasing with newer versions.  Thus,
Packit Service 82fcde
   evaluating two ABI_* symbols reduces to integer values that differ only
Packit Service 82fcde
   when the two version sets named are in fact two different ABIs we are
Packit Service 82fcde
   supporting.  If these do not differ, then there is no need to compile in
Packit Service 82fcde
   extra code to support this version set where it has been superseded by a
Packit Service 82fcde
   newer version.  The compatibility code should be conditionalized with
Packit Service 82fcde
   e.g. `#if SHLIB_COMPAT (libm, GLIBC_2_0, GLIBC_2_2)' for code introduced
Packit Service 82fcde
   in the GLIBC_2.0 version and obsoleted in the GLIBC_2.2 version.  */
Packit Service 82fcde
Packit Service 82fcde
# define SHLIB_COMPAT(lib, introduced, obsoleted)			      \
Packit Service 82fcde
  _SHLIB_COMPAT (lib, introduced, obsoleted)
Packit Service 82fcde
# define _SHLIB_COMPAT(lib, introduced, obsoleted)			      \
Packit Service 82fcde
  (IS_IN (lib)								      \
Packit Service 82fcde
   && (!(ABI_##lib##_##obsoleted - 0)					      \
Packit Service 82fcde
       || ((ABI_##lib##_##introduced - 0) < (ABI_##lib##_##obsoleted - 0))))
Packit Service 82fcde
Packit Service 82fcde
/* That header also defines symbols like `VERSION_libm_GLIBC_2_1' to
Packit Service 82fcde
   the version set name to use for e.g. symbols first introduced into
Packit Service 82fcde
   libm in the GLIBC_2.1 version.  Definitions of symbols with explicit
Packit Service 82fcde
   versions should look like:
Packit Service 82fcde
	versioned_symbol (libm, new_foo, foo, GLIBC_2_1);
Packit Service 82fcde
   This will define the symbol `foo' with the appropriate default version,
Packit Service 82fcde
   i.e. either GLIBC_2.1 or the "earliest version" specified in
Packit Service 82fcde
   shlib-versions if that is newer.  */
Packit Service 82fcde
Packit Service 82fcde
# define versioned_symbol(lib, local, symbol, version) \
Packit Service 82fcde
  versioned_symbol_1 (lib, local, symbol, version)
Packit Service 82fcde
# define versioned_symbol_1(lib, local, symbol, version) \
Packit Service 82fcde
  versioned_symbol_2 (local, symbol, VERSION_##lib##_##version)
Packit Service 82fcde
# define versioned_symbol_2(local, symbol, name) \
Packit Service 82fcde
  default_symbol_version (local, symbol, name)
Packit Service 82fcde
Packit Service 82fcde
# define compat_symbol(lib, local, symbol, version) \
Packit Service 82fcde
  compat_symbol_reference (lib, local, symbol, version)
Packit Service 82fcde
Packit Service 82fcde
#else
Packit Service 82fcde
Packit Service 82fcde
/* Not compiling ELF shared libraries at all, so never any old versions.  */
Packit Service 82fcde
# define SHLIB_COMPAT(lib, introduced, obsoleted)	0
Packit Service 82fcde
Packit Service 82fcde
/* No versions to worry about, just make this the global definition.  */
Packit Service 82fcde
# define versioned_symbol(lib, local, symbol, version) \
Packit Service 82fcde
  weak_alias (local, symbol)
Packit Service 82fcde
Packit Service 82fcde
/* This should not appear outside `#if SHLIB_COMPAT (...)'.  */
Packit Service 82fcde
# define compat_symbol(lib, local, symbol, version) ...
Packit Service 82fcde
Packit Service 82fcde
#endif
Packit Service 82fcde
Packit Service 82fcde
/* Use compat_symbol_reference for a reference *or* definition of a
Packit Service 82fcde
   specific version of a symbol.  Definitions are primarily used to
Packit Service 82fcde
   ensure tests reference the exact compat symbol required, or define an
Packit Service 82fcde
   interposing symbol of the right version e.g. __malloc_initialize_hook
Packit Service 82fcde
   in mcheck-init.c.  Use compat_symbol to define such a symbol within
Packit Service 82fcde
   the shared libraries that are built for users.  */
Packit Service 82fcde
#define compat_symbol_reference(lib, local, symbol, version) \
Packit Service 82fcde
  compat_symbol_reference_1 (lib, local, symbol, version)
Packit Service 82fcde
#define compat_symbol_reference_1(lib, local, symbol, version) \
Packit Service 82fcde
  compat_symbol_reference_2 (local, symbol, VERSION_##lib##_##version)
Packit Service 82fcde
#define compat_symbol_reference_2(local, symbol, name) \
Packit Service 82fcde
  symbol_version_reference (local, symbol, name)
Packit Service 82fcde
Packit Service 82fcde
# ifdef LINK_OBSOLETE_RPC
Packit Service 82fcde
/* Export the symbol for both static and dynamic linking.  */
Packit Service 82fcde
#  define libc_sunrpc_symbol(name, aliasname, version) \
Packit Service 82fcde
  strong_alias (name, aliasname)
Packit Service 82fcde
# else
Packit Service 82fcde
/* Export the symbol only for shared-library compatibility.  */
Packit Service 82fcde
#  define libc_sunrpc_symbol(name, aliasname, version) \
Packit Service 82fcde
  compat_symbol (libc, name, aliasname, version);
Packit Service 82fcde
# endif
Packit Service 82fcde
Packit Service 82fcde
/* The TEST_COMPAT macro acts just like the SHLIB_COMPAT macro except
Packit Service 82fcde
   that it does not check IS_IN.  It is used by tests that are testing
Packit Service 82fcde
   functionality that is only available in specific GLIBC versions.  */
Packit Service 82fcde
Packit Service 82fcde
# define TEST_COMPAT(lib, introduced, obsoleted)			      \
Packit Service 82fcde
  _TEST_COMPAT (lib, introduced, obsoleted)
Packit Service 82fcde
# define _TEST_COMPAT(lib, introduced, obsoleted)			      \
Packit Service 82fcde
   (!(ABI_##lib##_##obsoleted - 0)					      \
Packit Service 82fcde
       || ((ABI_##lib##_##introduced - 0) < (ABI_##lib##_##obsoleted - 0)))
Packit Service 82fcde
Packit Service 82fcde
#endif	/* shlib-compat.h */