Blame include/shlib-compat.h

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