Blame include/libc-symbols.h

Packit 6c4009
/* Support macros for making weak and strong aliases for symbols,
Packit 6c4009
   and for using symbol sets and linker warnings with GNU ld.
Packit 6c4009
   Copyright (C) 1995-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 _LIBC_SYMBOLS_H
Packit 6c4009
#define _LIBC_SYMBOLS_H	1
Packit 6c4009
Packit 6c4009
/* This file is included implicitly in the compilation of every source file,
Packit 6c4009
   using -include.  It includes config.h.  */
Packit 6c4009
Packit 6c4009
/* Enable declarations of GNU extensions, since we are compiling them.  */
Packit 6c4009
#define _GNU_SOURCE 1
Packit 6c4009
Packit 6c4009
#ifdef MODULE_NAME
Packit 6c4009
Packit 6c4009
/* Use `#if IS_IN (module)` to detect what component is being compiled.  */
Packit 6c4009
#define PASTE_NAME1(a,b) a##b
Packit 6c4009
#define PASTE_NAME(a,b)	 PASTE_NAME1 (a,b)
Packit 6c4009
#define IN_MODULE	 PASTE_NAME (MODULE_, MODULE_NAME)
Packit 6c4009
#define IS_IN(lib)	 (IN_MODULE == MODULE_##lib)
Packit 6c4009
Packit 6c4009
/* True if the current module is a versioned library.  Versioned
Packit 6c4009
   library names culled from shlib-versions files are assigned a
Packit 6c4009
   MODULE_* value greater than MODULE_LIBS_BEGIN.  */
Packit 6c4009
#define IS_IN_LIB	 (IN_MODULE > MODULE_LIBS_BEGIN)
Packit 6c4009
Packit 6c4009
/* The testsuite, and some other ancillary code, should be compiled against
Packit 6c4009
   as close an approximation to the installed headers as possible.
Packit 6c4009
   Defining this symbol disables most internal-use-only declarations
Packit 6c4009
   provided by this header, and all those provided by other internal
Packit 6c4009
   wrapper headers.  */
Packit 6c4009
#if IS_IN (testsuite) || defined IS_IN_build || defined __cplusplus
Packit 6c4009
# define _ISOMAC 1
Packit 6c4009
#endif
Packit 6c4009
Packit 6c4009
#else
Packit 6c4009
/* The generation process for a few files created very early in the
Packit 6c4009
   build (notably libc-modules.h itself) involves preprocessing this
Packit 6c4009
   header without defining MODULE_NAME.  Under these conditions,
Packit 6c4009
   internal declarations (especially from config.h) must be visible,
Packit 6c4009
   but IS_IN should always evaluate as false.  */
Packit 6c4009
# define IS_IN(lib) 0
Packit 6c4009
# define IS_IN_LIB 0
Packit 6c4009
# define IN_MODULE (-1)
Packit 6c4009
#endif
Packit 6c4009
Packit 6c4009
#ifndef _ISOMAC
Packit 6c4009
Packit 6c4009
/* This is defined for the compilation of all C library code.  features.h
Packit 6c4009
   tests this to avoid inclusion of stubs.h while compiling the library,
Packit 6c4009
   before stubs.h has been generated.  Some library code that is shared
Packit 6c4009
   with other packages also tests this symbol to see if it is being
Packit 6c4009
   compiled as part of the C library.  We must define this before including
Packit 6c4009
   config.h, because it makes some definitions conditional on whether libc
Packit 6c4009
   itself is being compiled, or just some generator program.  */
Packit 6c4009
#define _LIBC	1
Packit 6c4009
Packit 6c4009
/* Some files must be compiled with optimization on.  */
Packit 6c4009
#if !defined __ASSEMBLER__ && !defined __OPTIMIZE__
Packit 6c4009
# error "glibc cannot be compiled without optimization"
Packit 6c4009
#endif
Packit 6c4009
Packit 6c4009
/* -ffast-math cannot be applied to the C library, as it alters the ABI.
Packit 6c4009
   Some test components that use -ffast-math are currently not part of
Packit 6c4009
   IS_IN (testsuite) for technical reasons, so we have a secondary override.  */
Packit 6c4009
#if defined __FAST_MATH__ && !defined TEST_FAST_MATH
Packit 6c4009
# error "glibc must not be compiled with -ffast-math"
Packit 6c4009
#endif
Packit 6c4009
Packit 6c4009
#include <config.h>
Packit 6c4009
Packit 6c4009
/* When PIC is defined and SHARED isn't defined, we are building PIE
Packit 6c4009
   by default.  */
Packit 6c4009
#if defined PIC && !defined SHARED
Packit 6c4009
# define BUILD_PIE_DEFAULT 1
Packit 6c4009
#else
Packit 6c4009
# define BUILD_PIE_DEFAULT 0
Packit 6c4009
#endif
Packit 6c4009
Packit 6c4009
/* Define this for the benefit of portable GNU code that wants to check it.
Packit 6c4009
   Code that checks with #if will not #include <config.h> again, since we've
Packit 6c4009
   already done it (and this file is implicitly included in every compile,
Packit 6c4009
   via -include).  Code that checks with #ifdef will #include <config.h>,
Packit 6c4009
   but that file should always be idempotent (i.e., it's just #define/#undef
Packit 6c4009
   and nothing else anywhere should be changing the macro state it touches),
Packit 6c4009
   so it's harmless.  */
Packit 6c4009
#define HAVE_CONFIG_H	0
Packit 6c4009
Packit 6c4009
/* Define these macros for the benefit of portable GNU code that wants to check
Packit 6c4009
   them.  Of course, STDC_HEADERS is never false when building libc!  */
Packit 6c4009
#define STDC_HEADERS	1
Packit 6c4009
#define HAVE_MBSTATE_T	1
Packit 6c4009
#define HAVE_MBSRTOWCS	1
Packit 6c4009
#define HAVE_LIBINTL_H	1
Packit 6c4009
#define HAVE_WCTYPE_H	1
Packit 6c4009
#define HAVE_ISWCTYPE	1
Packit 6c4009
#define ENABLE_NLS	1
Packit 6c4009
Packit 6c4009
/* The symbols in all the user (non-_) macros are C symbols.  */
Packit 6c4009
Packit 6c4009
#ifndef __SYMBOL_PREFIX
Packit 6c4009
# define __SYMBOL_PREFIX
Packit 6c4009
#endif
Packit 6c4009
Packit 6c4009
#ifndef C_SYMBOL_NAME
Packit 6c4009
# define C_SYMBOL_NAME(name) name
Packit 6c4009
#endif
Packit 6c4009
Packit 6c4009
#ifndef ASM_LINE_SEP
Packit 6c4009
# define ASM_LINE_SEP ;
Packit 6c4009
#endif
Packit 6c4009
Packit 6c4009
#ifndef __ASSEMBLER__
Packit 6c4009
/* GCC understands weak symbols and aliases; use its interface where
Packit 6c4009
   possible, instead of embedded assembly language.  */
Packit 6c4009
Packit 6c4009
/* Define ALIASNAME as a strong alias for NAME.  */
Packit 6c4009
# define strong_alias(name, aliasname) _strong_alias(name, aliasname)
Packit 6c4009
# define _strong_alias(name, aliasname) \
Packit 6c4009
  extern __typeof (name) aliasname __attribute__ ((alias (#name)));
Packit 6c4009
Packit 6c4009
/* This comes between the return type and function name in
Packit 6c4009
   a function definition to make that definition weak.  */
Packit 6c4009
# define weak_function __attribute__ ((weak))
Packit 6c4009
# define weak_const_function __attribute__ ((weak, __const__))
Packit 6c4009
Packit 6c4009
/* Define ALIASNAME as a weak alias for NAME.
Packit 6c4009
   If weak aliases are not available, this defines a strong alias.  */
Packit 6c4009
# define weak_alias(name, aliasname) _weak_alias (name, aliasname)
Packit 6c4009
# define _weak_alias(name, aliasname) \
Packit 6c4009
  extern __typeof (name) aliasname __attribute__ ((weak, alias (#name)));
Packit 6c4009
Packit 6c4009
/* Same as WEAK_ALIAS, but mark symbol as hidden.  */
Packit 6c4009
# define weak_hidden_alias(name, aliasname) \
Packit 6c4009
  _weak_hidden_alias (name, aliasname)
Packit 6c4009
# define _weak_hidden_alias(name, aliasname) \
Packit 6c4009
  extern __typeof (name) aliasname \
Packit 6c4009
    __attribute__ ((weak, alias (#name), __visibility__ ("hidden")));
Packit 6c4009
Packit 6c4009
/* Declare SYMBOL as weak undefined symbol (resolved to 0 if not defined).  */
Packit 6c4009
# define weak_extern(symbol) _weak_extern (weak symbol)
Packit 6c4009
# define _weak_extern(expr) _Pragma (#expr)
Packit 6c4009
Packit 6c4009
/* In shared builds, the expression call_function_static_weak
Packit 6c4009
   (FUNCTION-SYMBOL, ARGUMENTS) invokes FUNCTION-SYMBOL (an
Packit 6c4009
   identifier) unconditionally, with the (potentially empty) argument
Packit 6c4009
   list ARGUMENTS.  In static builds, if FUNCTION-SYMBOL has a
Packit 6c4009
   definition, the function is invoked as before; if FUNCTION-SYMBOL
Packit 6c4009
   is NULL, no call is performed.  */
Packit 6c4009
# ifdef SHARED
Packit 6c4009
#  define call_function_static_weak(func, ...) func (__VA_ARGS__)
Packit 6c4009
# else	/* !SHARED */
Packit 6c4009
#  define call_function_static_weak(func, ...)		\
Packit 6c4009
  ({							\
Packit 6c4009
    extern __typeof__ (func) func weak_function;	\
Packit 6c4009
    (func != NULL ? func (__VA_ARGS__) : (void)0);	\
Packit 6c4009
  })
Packit 6c4009
# endif
Packit 6c4009
Packit 6c4009
#else /* __ASSEMBLER__ */
Packit 6c4009
Packit 6c4009
# ifdef HAVE_ASM_SET_DIRECTIVE
Packit 6c4009
#  define strong_alias(original, alias)				\
Packit 6c4009
  .globl C_SYMBOL_NAME (alias) ASM_LINE_SEP		\
Packit 6c4009
  .set C_SYMBOL_NAME (alias),C_SYMBOL_NAME (original)
Packit 6c4009
#  define strong_data_alias(original, alias) strong_alias(original, alias)
Packit 6c4009
# else
Packit 6c4009
#  define strong_alias(original, alias)				\
Packit 6c4009
  .globl C_SYMBOL_NAME (alias) ASM_LINE_SEP		\
Packit 6c4009
  C_SYMBOL_NAME (alias) = C_SYMBOL_NAME (original)
Packit 6c4009
#  define strong_data_alias(original, alias) strong_alias(original, alias)
Packit 6c4009
# endif
Packit 6c4009
Packit 6c4009
# define weak_alias(original, alias)					\
Packit 6c4009
  .weak C_SYMBOL_NAME (alias) ASM_LINE_SEP				\
Packit 6c4009
  C_SYMBOL_NAME (alias) = C_SYMBOL_NAME (original)
Packit 6c4009
Packit 6c4009
# define weak_extern(symbol)						\
Packit 6c4009
  .weak C_SYMBOL_NAME (symbol)
Packit 6c4009
Packit 6c4009
#endif /* __ASSEMBLER__ */
Packit 6c4009
Packit 6c4009
/* Determine the return address.  */
Packit 6c4009
#define RETURN_ADDRESS(nr) \
Packit 6c4009
  __builtin_extract_return_addr (__builtin_return_address (nr))
Packit 6c4009
Packit 6c4009
/* When a reference to SYMBOL is encountered, the linker will emit a
Packit 6c4009
   warning message MSG.  */
Packit 6c4009
/* We want the .gnu.warning.SYMBOL section to be unallocated.  */
Packit 6c4009
#define __make_section_unallocated(section_string)	\
Packit 6c4009
  asm (".section " section_string "\n\t.previous");
Packit 6c4009
Packit 6c4009
/* Tacking on "\n\t#" to the section name makes gcc put it's bogus
Packit 6c4009
   section attributes on what looks like a comment to the assembler.  */
Packit 6c4009
#ifdef HAVE_SECTION_QUOTES
Packit 6c4009
# define __sec_comment "\"\n\t#\""
Packit 6c4009
#else
Packit 6c4009
# define __sec_comment "\n\t#"
Packit 6c4009
#endif
Packit 6c4009
#define link_warning(symbol, msg) \
Packit 6c4009
  __make_section_unallocated (".gnu.warning." #symbol) \
Packit 6c4009
  static const char __evoke_link_warning_##symbol[]	\
Packit 6c4009
    __attribute__ ((used, section (".gnu.warning." #symbol __sec_comment))) \
Packit 6c4009
    = msg;
Packit 6c4009
Packit 6c4009
/* A canned warning for sysdeps/stub functions.  */
Packit 6c4009
#define	stub_warning(name) \
Packit 6c4009
  __make_section_unallocated (".gnu.glibc-stub." #name) \
Packit 6c4009
  link_warning (name, #name " is not implemented and will always fail")
Packit 6c4009
Packit 6c4009
/* Warning for linking functions calling dlopen into static binaries.  */
Packit 6c4009
#ifdef SHARED
Packit 6c4009
#define static_link_warning(name)
Packit 6c4009
#else
Packit 6c4009
#define static_link_warning(name) static_link_warning1(name)
Packit 6c4009
#define static_link_warning1(name) \
Packit 6c4009
  link_warning(name, "Using '" #name "' in statically linked applications \
Packit 6c4009
requires at runtime the shared libraries from the glibc version used \
Packit 6c4009
for linking")
Packit 6c4009
#endif
Packit 6c4009
Packit 6c4009
/* Resource Freeing Hooks:
Packit 6c4009
Packit 6c4009
   Normally a process exits and the OS cleans up any allocated
Packit 6c4009
   memory.  However, when tooling like mtrace or valgrind is monitoring
Packit 6c4009
   the process we need to free all resources that are part of the
Packit 6c4009
   process in order to provide the consistency required to track
Packit 6c4009
   memory leaks.
Packit 6c4009
Packit 6c4009
   A single public API exists and is __libc_freeres(), and this is used
Packit 6c4009
   by applications like valgrind to freee resouces.
Packit 6c4009
Packit 6c4009
   There are 3 cases:
Packit 6c4009
Packit 6c4009
   (a) __libc_freeres
Packit 6c4009
Packit 6c4009
	In this case all you need to do is define the freeing routine:
Packit 6c4009
Packit 6c4009
	foo.c:
Packit 6c4009
	libfoo_freeres_fn (foo_freeres)
Packit 6c4009
	{
Packit 6c4009
	  complex_free (mem);
Packit 6c4009
	}
Packit 6c4009
Packit 6c4009
	This ensures the function is called at the right point to free
Packit 6c4009
	resources.
Packit 6c4009
Packit 6c4009
   (b) __libc_freeres_ptr
Packit 6c4009
Packit 6c4009
	The framework for (a) iterates over the list of pointers-to-free
Packit 6c4009
	in (b) and frees them.
Packit 6c4009
Packit 6c4009
	foo.c:
Packit 6c4009
	libc_freeres_ptr (static char *foo_buffer);
Packit 6c4009
Packit 6c4009
	Freeing these resources alaways happens last and is equivalent
Packit 6c4009
	to registering a function that does 'free (foo_buffer)'.
Packit 6c4009
Packit 6c4009
   (c) Explicit lists of free routines to call or objects to free.
Packit 6c4009
Packit 6c4009
	It is the intended goal to remove (a) and (b) which have some
Packit 6c4009
	non-determinism based on link order, and instead use explicit
Packit 6c4009
	lists of functions and frees to resolve cleanup ordering issues
Packit 6c4009
	and make it easy to debug and maintain.
Packit 6c4009
Packit 6c4009
	As of today the following subsystems use (c):
Packit 6c4009
Packit 6c4009
	Per-thread cleanup:
Packit 6c4009
	* malloc/thread-freeres.c
Packit 6c4009
Packit 6c4009
	libdl cleanup:
Packit 6c4009
	* dlfcn/dlfreeres.c
Packit 6c4009
Packit 6c4009
	libpthread cleanup:
Packit 6c4009
	* nptl/nptlfreeres.c
Packit 6c4009
Packit 6c4009
	So if you need any shutdown routines to run you should add them
Packit 6c4009
	directly to the appropriate subsystem's shutdown list.  */
Packit 6c4009
Packit 6c4009
/* Resource pointers to free in libc.so.  */
Packit 6c4009
#define libc_freeres_ptr(decl) \
Packit 6c4009
  __make_section_unallocated ("__libc_freeres_ptrs, \"aw\", %nobits") \
Packit 6c4009
  decl __attribute__ ((section ("__libc_freeres_ptrs" __sec_comment)))
Packit 6c4009
Packit 6c4009
/* Resource freeing functions from libc.so go in this section.  */
Packit 6c4009
#define __libc_freeres_fn_section \
Packit 6c4009
  __attribute__ ((section ("__libc_freeres_fn")))
Packit 6c4009
Packit 6c4009
/* Resource freeing functions for libc.so.  */
Packit 6c4009
#define libc_freeres_fn(name) \
Packit 6c4009
  static void name (void) __attribute_used__ __libc_freeres_fn_section;	\
Packit 6c4009
  text_set_element (__libc_subfreeres, name);				\
Packit 6c4009
  static void name (void)
Packit 6c4009
Packit 6c4009
/* Declare SYMBOL to be TYPE (`function' or `object') of SIZE bytes
Packit 6c4009
   alias to ORIGINAL, when the assembler supports such declarations
Packit 6c4009
   (such as in ELF).
Packit 6c4009
   This is only necessary when defining something in assembly, or playing
Packit 6c4009
   funny alias games where the size should be other than what the compiler
Packit 6c4009
   thinks it is.  */
Packit 6c4009
#define declare_symbol_alias(symbol, original, type, size) \
Packit 6c4009
  declare_symbol_alias_1 (symbol, original, type, size)
Packit 6c4009
#ifdef __ASSEMBLER__
Packit 6c4009
# define declare_symbol_alias_1(symbol, original, type, size) \
Packit 6c4009
   strong_alias (original, symbol); \
Packit 6c4009
   .type C_SYMBOL_NAME (symbol), %##type; \
Packit 6c4009
   .size C_SYMBOL_NAME (symbol), size
Packit 6c4009
#else /* Not __ASSEMBLER__.  */
Packit 6c4009
# define declare_symbol_alias_1(symbol, original, type, size) \
Packit 6c4009
   asm (".globl " __SYMBOL_PREFIX #symbol \
Packit 6c4009
	"\n\t" declare_symbol_alias_1_alias (symbol, original) \
Packit 6c4009
	"\n\t.type " __SYMBOL_PREFIX #symbol ", " \
Packit 6c4009
	"%" #type \
Packit 6c4009
	"\n\t.size " __SYMBOL_PREFIX #symbol ", " #size);
Packit 6c4009
# ifdef HAVE_ASM_SET_DIRECTIVE
Packit 6c4009
#  define declare_symbol_alias_1_alias(symbol, original) \
Packit 6c4009
     ".set " __SYMBOL_PREFIX #symbol ", " __SYMBOL_PREFIX #original
Packit 6c4009
# else
Packit 6c4009
#  define declare_symbol_alias_1_alias(symbol, original) \
Packit 6c4009
     __SYMBOL_PREFIX #symbol " = " __SYMBOL_PREFIX #original
Packit 6c4009
# endif /* HAVE_ASM_SET_DIRECTIVE */
Packit 6c4009
#endif /* __ASSEMBLER__ */
Packit 6c4009
Packit 6c4009
Packit 6c4009
/*
Packit 6c4009

Packit 6c4009
*/
Packit 6c4009
Packit 6c4009
/* Symbol set support macros.  */
Packit 6c4009
Packit 6c4009
/* Make SYMBOL, which is in the text segment, an element of SET.  */
Packit 6c4009
#define text_set_element(set, symbol)	_elf_set_element(set, symbol)
Packit 6c4009
/* Make SYMBOL, which is in the data segment, an element of SET.  */
Packit 6c4009
#define data_set_element(set, symbol)	_elf_set_element(set, symbol)
Packit 6c4009
/* Make SYMBOL, which is in the bss segment, an element of SET.  */
Packit 6c4009
#define bss_set_element(set, symbol)	_elf_set_element(set, symbol)
Packit 6c4009
Packit 6c4009
/* These are all done the same way in ELF.
Packit 6c4009
   There is a new section created for each set.  */
Packit 6c4009
#ifdef SHARED
Packit 6c4009
/* When building a shared library, make the set section writable,
Packit 6c4009
   because it will need to be relocated at run time anyway.  */
Packit 6c4009
# define _elf_set_element(set, symbol) \
Packit 6c4009
  static const void *__elf_set_##set##_element_##symbol##__ \
Packit 6c4009
    __attribute__ ((used, section (#set))) = &(symbol)
Packit 6c4009
#else
Packit 6c4009
# define _elf_set_element(set, symbol) \
Packit 6c4009
  static const void *const __elf_set_##set##_element_##symbol##__ \
Packit 6c4009
    __attribute__ ((used, section (#set))) = &(symbol)
Packit 6c4009
#endif
Packit 6c4009
Packit 6c4009
/* Define SET as a symbol set.  This may be required (it is in a.out) to
Packit 6c4009
   be able to use the set's contents.  */
Packit 6c4009
#define symbol_set_define(set)	symbol_set_declare(set)
Packit 6c4009
Packit 6c4009
/* Declare SET for use in this module, if defined in another module.
Packit 6c4009
   In a shared library, this is always local to that shared object.
Packit 6c4009
   For static linking, the set might be wholly absent and so we use
Packit 6c4009
   weak references.  */
Packit 6c4009
#define symbol_set_declare(set) \
Packit 6c4009
  extern char const __start_##set[] __symbol_set_attribute; \
Packit 6c4009
  extern char const __stop_##set[] __symbol_set_attribute;
Packit 6c4009
#ifdef SHARED
Packit 6c4009
# define __symbol_set_attribute attribute_hidden
Packit 6c4009
#else
Packit 6c4009
# define __symbol_set_attribute __attribute__ ((weak))
Packit 6c4009
#endif
Packit 6c4009
Packit 6c4009
/* Return a pointer (void *const *) to the first element of SET.  */
Packit 6c4009
#define symbol_set_first_element(set)	((void *const *) (&__start_##set))
Packit 6c4009
Packit 6c4009
/* Return true iff PTR (a void *const *) has been incremented
Packit 6c4009
   past the last element in SET.  */
Packit 6c4009
#define symbol_set_end_p(set, ptr) ((ptr) >= (void *const *) &__stop_##set)
Packit 6c4009
Packit 6c4009
/* Use symbol_version_reference to specify the version a symbol
Packit 6c4009
   reference should link to.  Use symbol_version or
Packit 6c4009
   default_symbol_version for the definition of a versioned symbol.
Packit 6c4009
   The difference is that the latter is a no-op in non-shared
Packit 6c4009
   builds.  */
Packit 6c4009
#ifdef __ASSEMBLER__
Packit 6c4009
# define symbol_version_reference(real, name, version) \
Packit 6c4009
     .symver real, name##@##version
Packit 6c4009
#else  /* !__ASSEMBLER__ */
Packit 6c4009
# define symbol_version_reference(real, name, version) \
Packit 6c4009
  __asm__ (".symver " #real "," #name "@" #version)
Packit 6c4009
#endif
Packit 6c4009
Packit 6c4009
#ifdef SHARED
Packit 6c4009
# define symbol_version(real, name, version) \
Packit 6c4009
  symbol_version_reference(real, name, version)
Packit 6c4009
# define default_symbol_version(real, name, version) \
Packit 6c4009
     _default_symbol_version(real, name, version)
Packit 6c4009
# ifdef __ASSEMBLER__
Packit 6c4009
#  define _default_symbol_version(real, name, version) \
Packit 6c4009
     .symver real, name##@##@##version
Packit 6c4009
# else
Packit 6c4009
#  define _default_symbol_version(real, name, version) \
Packit 6c4009
     __asm__ (".symver " #real "," #name "@@" #version)
Packit 6c4009
# endif
Packit 6c4009
#else
Packit 6c4009
# define symbol_version(real, name, version)
Packit 6c4009
# define default_symbol_version(real, name, version) \
Packit 6c4009
  strong_alias(real, name)
Packit 6c4009
#endif
Packit 6c4009
Packit 6c4009
#if defined SHARED || defined LIBC_NONSHARED \
Packit 6c4009
  || (BUILD_PIE_DEFAULT && IS_IN (libc))
Packit 6c4009
# define attribute_hidden __attribute__ ((visibility ("hidden")))
Packit 6c4009
#else
Packit 6c4009
# define attribute_hidden
Packit 6c4009
#endif
Packit 6c4009
Packit 6c4009
#define attribute_tls_model_ie __attribute__ ((tls_model ("initial-exec")))
Packit 6c4009
Packit 6c4009
#define attribute_relro __attribute__ ((section (".data.rel.ro")))
Packit 6c4009
Packit 6c4009
Packit 6c4009
/* Used to disable stack protection in sensitive places, like ifunc
Packit 6c4009
   resolvers and early static TLS init.  */
Packit 6c4009
#ifdef HAVE_CC_NO_STACK_PROTECTOR
Packit 6c4009
# define inhibit_stack_protector \
Packit 6c4009
    __attribute__ ((__optimize__ ("-fno-stack-protector")))
Packit 6c4009
#else
Packit 6c4009
# define inhibit_stack_protector
Packit 6c4009
#endif
Packit 6c4009
Packit 6c4009
/* The following macros are used for PLT bypassing within libc.so
Packit 6c4009
   (and if needed other libraries similarly).
Packit 6c4009
   First of all, you need to have the function prototyped somewhere,
Packit 6c4009
   say in foo/foo.h:
Packit 6c4009
Packit 6c4009
   int foo (int __bar);
Packit 6c4009
Packit 6c4009
   If calls to foo within libc.so should always go to foo defined in libc.so,
Packit 6c4009
   then in include/foo.h you add:
Packit 6c4009
Packit 6c4009
   libc_hidden_proto (foo)
Packit 6c4009
Packit 6c4009
   line and after the foo function definition:
Packit 6c4009
Packit 6c4009
   int foo (int __bar)
Packit 6c4009
   {
Packit 6c4009
     return __bar;
Packit 6c4009
   }
Packit 6c4009
   libc_hidden_def (foo)
Packit 6c4009
Packit 6c4009
   or
Packit 6c4009
Packit 6c4009
   int foo (int __bar)
Packit 6c4009
   {
Packit 6c4009
     return __bar;
Packit 6c4009
   }
Packit 6c4009
   libc_hidden_weak (foo)
Packit 6c4009
Packit 6c4009
   Similarly for global data.  If references to foo within libc.so should
Packit 6c4009
   always go to foo defined in libc.so, then in include/foo.h you add:
Packit 6c4009
Packit 6c4009
   libc_hidden_proto (foo)
Packit 6c4009
Packit 6c4009
   line and after foo's definition:
Packit 6c4009
Packit 6c4009
   int foo = INITIAL_FOO_VALUE;
Packit 6c4009
   libc_hidden_data_def (foo)
Packit 6c4009
Packit 6c4009
   or
Packit 6c4009
Packit 6c4009
   int foo = INITIAL_FOO_VALUE;
Packit 6c4009
   libc_hidden_data_weak (foo)
Packit 6c4009
Packit 6c4009
   If foo is normally just an alias (strong or weak) to some other function,
Packit 6c4009
   you should use the normal strong_alias first, then add libc_hidden_def
Packit 6c4009
   or libc_hidden_weak:
Packit 6c4009
Packit 6c4009
   int baz (int __bar)
Packit 6c4009
   {
Packit 6c4009
     return __bar;
Packit 6c4009
   }
Packit 6c4009
   strong_alias (baz, foo)
Packit 6c4009
   libc_hidden_weak (foo)
Packit 6c4009
Packit 6c4009
   If the function should be internal to multiple objects, say ld.so and
Packit 6c4009
   libc.so, the best way is to use:
Packit 6c4009
Packit 6c4009
   #if IS_IN (libc) || IS_IN (rtld)
Packit 6c4009
   hidden_proto (foo)
Packit 6c4009
   #endif
Packit 6c4009
Packit 6c4009
   in include/foo.h and the normal macros at all function definitions
Packit 6c4009
   depending on what DSO they belong to.
Packit 6c4009
Packit 6c4009
   If versioned_symbol macro is used to define foo,
Packit 6c4009
   libc_hidden_ver macro should be used, as in:
Packit 6c4009
Packit 6c4009
   int __real_foo (int __bar)
Packit 6c4009
   {
Packit 6c4009
     return __bar;
Packit 6c4009
   }
Packit 6c4009
   versioned_symbol (libc, __real_foo, foo, GLIBC_2_1);
Packit 6c4009
   libc_hidden_ver (__real_foo, foo)  */
Packit 6c4009
Packit 6c4009
#if defined SHARED && !defined NO_HIDDEN
Packit 6c4009
# ifndef __ASSEMBLER__
Packit 6c4009
#  define __hidden_proto_hiddenattr(attrs...) \
Packit 6c4009
  __attribute__ ((visibility ("hidden"), ##attrs))
Packit 6c4009
#  define hidden_proto(name, attrs...) \
Packit 6c4009
  __hidden_proto (name, , __GI_##name, ##attrs)
Packit 6c4009
#  define hidden_tls_proto(name, attrs...) \
Packit 6c4009
  __hidden_proto (name, __thread, __GI_##name, ##attrs)
Packit 6c4009
#  define __hidden_proto(name, thread, internal, attrs...)	     \
Packit 6c4009
  extern thread __typeof (name) name __asm__ (__hidden_asmname (#internal)) \
Packit 6c4009
  __hidden_proto_hiddenattr (attrs);
Packit 6c4009
#  define __hidden_asmname(name) \
Packit 6c4009
  __hidden_asmname1 (__USER_LABEL_PREFIX__, name)
Packit 6c4009
#  define __hidden_asmname1(prefix, name) __hidden_asmname2(prefix, name)
Packit 6c4009
#  define __hidden_asmname2(prefix, name) #prefix name
Packit 6c4009
#  define __hidden_ver1(local, internal, name) \
Packit 6c4009
  extern __typeof (name) __EI_##name __asm__(__hidden_asmname (#internal)); \
Packit 6c4009
  extern __typeof (name) __EI_##name \
Packit 6c4009
	__attribute__((alias (__hidden_asmname (#local))))
Packit 6c4009
#  define hidden_ver(local, name)	__hidden_ver1(local, __GI_##name, name);
Packit 6c4009
#  define hidden_data_ver(local, name)	hidden_ver(local, name)
Packit 6c4009
#  define hidden_def(name)		__hidden_ver1(__GI_##name, name, name);
Packit 6c4009
#  define hidden_data_def(name)		hidden_def(name)
Packit 6c4009
#  define hidden_weak(name) \
Packit 6c4009
	__hidden_ver1(__GI_##name, name, name) __attribute__((weak));
Packit 6c4009
#  define hidden_data_weak(name)	hidden_weak(name)
Packit 6c4009
#  define hidden_nolink(name, lib, version) \
Packit 6c4009
  __hidden_nolink1 (__GI_##name, __EI_##name, name, VERSION_##lib##_##version)
Packit 6c4009
#  define __hidden_nolink1(local, internal, name, version) \
Packit 6c4009
  __hidden_nolink2 (local, internal, name, version)
Packit 6c4009
#  define __hidden_nolink2(local, internal, name, version) \
Packit 6c4009
  extern __typeof (name) internal __attribute__ ((alias (#local))); \
Packit 6c4009
  __hidden_nolink3 (local, internal, #name "@" #version)
Packit 6c4009
#  define __hidden_nolink3(local, internal, vername) \
Packit 6c4009
  __asm__ (".symver " #internal ", " vername);
Packit 6c4009
# else
Packit 6c4009
/* For assembly, we need to do the opposite of what we do in C:
Packit 6c4009
   in assembly gcc __REDIRECT stuff is not in place, so functions
Packit 6c4009
   are defined by its normal name and we need to create the
Packit 6c4009
   __GI_* alias to it, in C __REDIRECT causes the function definition
Packit 6c4009
   to use __GI_* name and we need to add alias to the real name.
Packit 6c4009
   There is no reason to use hidden_weak over hidden_def in assembly,
Packit 6c4009
   but we provide it for consistency with the C usage.
Packit 6c4009
   hidden_proto doesn't make sense for assembly but the equivalent
Packit 6c4009
   is to call via the HIDDEN_JUMPTARGET macro instead of JUMPTARGET.  */
Packit 6c4009
#  define hidden_def(name)	strong_alias (name, __GI_##name)
Packit 6c4009
#  define hidden_weak(name)	hidden_def (name)
Packit 6c4009
#  define hidden_ver(local, name) strong_alias (local, __GI_##name)
Packit 6c4009
#  define hidden_data_def(name)	strong_data_alias (name, __GI_##name)
Packit 6c4009
#  define hidden_data_weak(name)	hidden_data_def (name)
Packit 6c4009
#  define hidden_data_ver(local, name) strong_data_alias (local, __GI_##name)
Packit 6c4009
#  define HIDDEN_JUMPTARGET(name) __GI_##name
Packit 6c4009
# endif
Packit 6c4009
#else
Packit 6c4009
# ifndef __ASSEMBLER__
Packit 6c4009
#  if !defined SHARED && IS_IN (libc) && !defined LIBC_NONSHARED \
Packit 6c4009
      && (!defined PIC || !defined NO_HIDDEN_EXTERN_FUNC_IN_PIE) \
Packit 6c4009
      && !defined NO_HIDDEN
Packit 6c4009
#   define __hidden_proto_hiddenattr(attrs...) \
Packit 6c4009
  __attribute__ ((visibility ("hidden"), ##attrs))
Packit 6c4009
#   define hidden_proto(name, attrs...) \
Packit 6c4009
  __hidden_proto (name, , name, ##attrs)
Packit 6c4009
#   define hidden_tls_proto(name, attrs...) \
Packit 6c4009
  __hidden_proto (name, __thread, name, ##attrs)
Packit 6c4009
#  define __hidden_proto(name, thread, internal, attrs...)	     \
Packit 6c4009
  extern thread __typeof (name) name __hidden_proto_hiddenattr (attrs);
Packit 6c4009
# else
Packit 6c4009
#   define hidden_proto(name, attrs...)
Packit 6c4009
#   define hidden_tls_proto(name, attrs...)
Packit 6c4009
# endif
Packit 6c4009
# else
Packit 6c4009
#  define HIDDEN_JUMPTARGET(name) JUMPTARGET(name)
Packit 6c4009
# endif /* Not  __ASSEMBLER__ */
Packit 6c4009
# define hidden_weak(name)
Packit 6c4009
# define hidden_def(name)
Packit 6c4009
# define hidden_ver(local, name)
Packit 6c4009
# define hidden_data_weak(name)
Packit 6c4009
# define hidden_data_def(name)
Packit 6c4009
# define hidden_data_ver(local, name)
Packit 6c4009
# define hidden_nolink(name, lib, version)
Packit 6c4009
#endif
Packit 6c4009
Packit 6c4009
#if IS_IN (libc)
Packit 6c4009
# define libc_hidden_proto(name, attrs...) hidden_proto (name, ##attrs)
Packit 6c4009
# define libc_hidden_tls_proto(name, attrs...) hidden_tls_proto (name, ##attrs)
Packit 6c4009
# define libc_hidden_def(name) hidden_def (name)
Packit 6c4009
# define libc_hidden_weak(name) hidden_weak (name)
Packit 6c4009
# ifdef LINK_OBSOLETE_RPC
Packit 6c4009
   /* libc_hidden_nolink_sunrpc should only get used in sunrpc code.  */
Packit 6c4009
#  define libc_hidden_nolink_sunrpc(name, version) hidden_def (name)
Packit 6c4009
# else
Packit 6c4009
#  define libc_hidden_nolink_sunrpc(name, version) hidden_nolink (name, libc, version)
Packit 6c4009
# endif
Packit 6c4009
# define libc_hidden_ver(local, name) hidden_ver (local, name)
Packit 6c4009
# define libc_hidden_data_def(name) hidden_data_def (name)
Packit 6c4009
# define libc_hidden_data_weak(name) hidden_data_weak (name)
Packit 6c4009
# define libc_hidden_data_ver(local, name) hidden_data_ver (local, name)
Packit 6c4009
#else
Packit 6c4009
# define libc_hidden_proto(name, attrs...)
Packit 6c4009
# define libc_hidden_tls_proto(name, attrs...)
Packit 6c4009
# define libc_hidden_def(name)
Packit 6c4009
# define libc_hidden_weak(name)
Packit 6c4009
# define libc_hidden_ver(local, name)
Packit 6c4009
# define libc_hidden_data_def(name)
Packit 6c4009
# define libc_hidden_data_weak(name)
Packit 6c4009
# define libc_hidden_data_ver(local, name)
Packit 6c4009
#endif
Packit 6c4009
Packit 6c4009
#if IS_IN (rtld) && !defined NO_RTLD_HIDDEN
Packit 6c4009
# define rtld_hidden_proto(name, attrs...) hidden_proto (name, ##attrs)
Packit 6c4009
# define rtld_hidden_tls_proto(name, attrs...) hidden_tls_proto (name, ##attrs)
Packit 6c4009
# define rtld_hidden_def(name) hidden_def (name)
Packit 6c4009
# define rtld_hidden_weak(name) hidden_weak (name)
Packit 6c4009
# define rtld_hidden_ver(local, name) hidden_ver (local, name)
Packit 6c4009
# define rtld_hidden_data_def(name) hidden_data_def (name)
Packit 6c4009
# define rtld_hidden_data_weak(name) hidden_data_weak (name)
Packit 6c4009
# define rtld_hidden_data_ver(local, name) hidden_data_ver (local, name)
Packit 6c4009
#else
Packit 6c4009
# define rtld_hidden_proto(name, attrs...)
Packit 6c4009
# define rtld_hidden_tls_proto(name, attrs...)
Packit 6c4009
# define rtld_hidden_def(name)
Packit 6c4009
# define rtld_hidden_weak(name)
Packit 6c4009
# define rtld_hidden_ver(local, name)
Packit 6c4009
# define rtld_hidden_data_def(name)
Packit 6c4009
# define rtld_hidden_data_weak(name)
Packit 6c4009
# define rtld_hidden_data_ver(local, name)
Packit 6c4009
#endif
Packit 6c4009
Packit 6c4009
#if IS_IN (libm)
Packit 6c4009
# define libm_hidden_proto(name, attrs...) hidden_proto (name, ##attrs)
Packit 6c4009
# define libm_hidden_tls_proto(name, attrs...) hidden_tls_proto (name, ##attrs)
Packit 6c4009
# define libm_hidden_def(name) hidden_def (name)
Packit 6c4009
# define libm_hidden_weak(name) hidden_weak (name)
Packit 6c4009
# define libm_hidden_ver(local, name) hidden_ver (local, name)
Packit 6c4009
# define libm_hidden_data_def(name) hidden_data_def (name)
Packit 6c4009
# define libm_hidden_data_weak(name) hidden_data_weak (name)
Packit 6c4009
# define libm_hidden_data_ver(local, name) hidden_data_ver (local, name)
Packit 6c4009
#else
Packit 6c4009
# define libm_hidden_proto(name, attrs...)
Packit 6c4009
# define libm_hidden_tls_proto(name, attrs...)
Packit 6c4009
# define libm_hidden_def(name)
Packit 6c4009
# define libm_hidden_weak(name)
Packit 6c4009
# define libm_hidden_ver(local, name)
Packit 6c4009
# define libm_hidden_data_def(name)
Packit 6c4009
# define libm_hidden_data_weak(name)
Packit 6c4009
# define libm_hidden_data_ver(local, name)
Packit 6c4009
#endif
Packit 6c4009
Packit 6c4009
#if IS_IN (libmvec)
Packit 6c4009
# define libmvec_hidden_proto(name, attrs...) hidden_proto (name, ##attrs)
Packit 6c4009
# define libmvec_hidden_tls_proto(name, attrs...) hidden_tls_proto (name, ##attrs)
Packit 6c4009
# define libmvec_hidden_def(name) hidden_def (name)
Packit 6c4009
# define libmvec_hidden_weak(name) hidden_weak (name)
Packit 6c4009
# define libmvec_hidden_ver(local, name) hidden_ver (local, name)
Packit 6c4009
# define libmvec_hidden_data_def(name) hidden_data_def (name)
Packit 6c4009
# define libmvec_hidden_data_weak(name) hidden_data_weak (name)
Packit 6c4009
# define libmvec_hidden_data_ver(local, name) hidden_data_ver (local, name)
Packit 6c4009
#else
Packit 6c4009
# define libmvec_hidden_proto(name, attrs...)
Packit 6c4009
# define libmvec_hidden_tls_proto(name, attrs...)
Packit 6c4009
# define libmvec_hidden_def(name)
Packit 6c4009
# define libmvec_hidden_weak(name)
Packit 6c4009
# define libmvec_hidden_ver(local, name)
Packit 6c4009
# define libmvec_hidden_data_def(name)
Packit 6c4009
# define libmvec_hidden_data_weak(name)
Packit 6c4009
# define libmvec_hidden_data_ver(local, name)
Packit 6c4009
#endif
Packit 6c4009
Packit 6c4009
#if IS_IN (libresolv)
Packit 6c4009
# define libresolv_hidden_proto(name, attrs...) hidden_proto (name, ##attrs)
Packit 6c4009
# define libresolv_hidden_tls_proto(name, attrs...) \
Packit 6c4009
  hidden_tls_proto (name, ##attrs)
Packit 6c4009
# define libresolv_hidden_def(name) hidden_def (name)
Packit 6c4009
# define libresolv_hidden_weak(name) hidden_weak (name)
Packit 6c4009
# define libresolv_hidden_ver(local, name) hidden_ver (local, name)
Packit 6c4009
# define libresolv_hidden_data_def(name) hidden_data_def (name)
Packit 6c4009
# define libresolv_hidden_data_weak(name) hidden_data_weak (name)
Packit 6c4009
# define libresolv_hidden_data_ver(local, name) hidden_data_ver (local, name)
Packit 6c4009
#else
Packit 6c4009
# define libresolv_hidden_proto(name, attrs...)
Packit 6c4009
# define libresolv_hidden_tls_proto(name, attrs...)
Packit 6c4009
# define libresolv_hidden_def(name)
Packit 6c4009
# define libresolv_hidden_weak(name)
Packit 6c4009
# define libresolv_hidden_ver(local, name)
Packit 6c4009
# define libresolv_hidden_data_def(name)
Packit 6c4009
# define libresolv_hidden_data_weak(name)
Packit 6c4009
# define libresolv_hidden_data_ver(local, name)
Packit 6c4009
#endif
Packit 6c4009
Packit 6c4009
#if IS_IN (librt)
Packit 6c4009
# define librt_hidden_proto(name, attrs...) hidden_proto (name, ##attrs)
Packit 6c4009
# define librt_hidden_tls_proto(name, attrs...) \
Packit 6c4009
  hidden_tls_proto (name, ##attrs)
Packit 6c4009
# define librt_hidden_def(name) hidden_def (name)
Packit 6c4009
# define librt_hidden_weak(name) hidden_weak (name)
Packit 6c4009
# define librt_hidden_ver(local, name) hidden_ver (local, name)
Packit 6c4009
# define librt_hidden_data_def(name) hidden_data_def (name)
Packit 6c4009
# define librt_hidden_data_weak(name) hidden_data_weak (name)
Packit 6c4009
# define librt_hidden_data_ver(local, name) hidden_data_ver (local, name)
Packit 6c4009
#else
Packit 6c4009
# define librt_hidden_proto(name, attrs...)
Packit 6c4009
# define librt_hidden_tls_proto(name, attrs...)
Packit 6c4009
# define librt_hidden_def(name)
Packit 6c4009
# define librt_hidden_weak(name)
Packit 6c4009
# define librt_hidden_ver(local, name)
Packit 6c4009
# define librt_hidden_data_def(name)
Packit 6c4009
# define librt_hidden_data_weak(name)
Packit 6c4009
# define librt_hidden_data_ver(local, name)
Packit 6c4009
#endif
Packit 6c4009
Packit 6c4009
#if IS_IN (libdl)
Packit 6c4009
# define libdl_hidden_proto(name, attrs...) hidden_proto (name, ##attrs)
Packit 6c4009
# define libdl_hidden_tls_proto(name, attrs...) \
Packit 6c4009
  hidden_tls_proto (name, ##attrs)
Packit 6c4009
# define libdl_hidden_def(name) hidden_def (name)
Packit 6c4009
# define libdl_hidden_weak(name) hidden_weak (name)
Packit 6c4009
# define libdl_hidden_ver(local, name) hidden_ver (local, name)
Packit 6c4009
# define libdl_hidden_data_def(name) hidden_data_def (name)
Packit 6c4009
# define libdl_hidden_data_weak(name) hidden_data_weak (name)
Packit 6c4009
# define libdl_hidden_data_ver(local, name) hidden_data_ver (local, name)
Packit 6c4009
#else
Packit 6c4009
# define libdl_hidden_proto(name, attrs...)
Packit 6c4009
# define libdl_hidden_tls_proto(name, attrs...)
Packit 6c4009
# define libdl_hidden_def(name)
Packit 6c4009
# define libdl_hidden_weak(name)
Packit 6c4009
# define libdl_hidden_ver(local, name)
Packit 6c4009
# define libdl_hidden_data_def(name)
Packit 6c4009
# define libdl_hidden_data_weak(name)
Packit 6c4009
# define libdl_hidden_data_ver(local, name)
Packit 6c4009
#endif
Packit 6c4009
Packit 6c4009
#if IS_IN (libnss_files)
Packit 6c4009
# define libnss_files_hidden_proto(name, attrs...) hidden_proto (name, ##attrs)
Packit 6c4009
# define libnss_files_hidden_tls_proto(name, attrs...) \
Packit 6c4009
  hidden_tls_proto (name, ##attrs)
Packit 6c4009
# define libnss_files_hidden_def(name) hidden_def (name)
Packit 6c4009
# define libnss_files_hidden_weak(name) hidden_weak (name)
Packit 6c4009
# define libnss_files_hidden_ver(local, name) hidden_ver (local, name)
Packit 6c4009
# define libnss_files_hidden_data_def(name) hidden_data_def (name)
Packit 6c4009
# define libnss_files_hidden_data_weak(name) hidden_data_weak (name)
Packit 6c4009
# define libnss_files_hidden_data_ver(local, name) hidden_data_ver(local, name)
Packit 6c4009
#else
Packit 6c4009
# define libnss_files_hidden_proto(name, attrs...)
Packit 6c4009
# define libnss_files_hidden_tls_proto(name, attrs...)
Packit 6c4009
# define libnss_files_hidden_def(name)
Packit 6c4009
# define libnss_files_hidden_weak(name)
Packit 6c4009
# define libnss_files_hidden_ver(local, name)
Packit 6c4009
# define libnss_files_hidden_data_def(name)
Packit 6c4009
# define libnss_files_hidden_data_weak(name)
Packit 6c4009
# define libnss_files_hidden_data_ver(local, name)
Packit 6c4009
#endif
Packit 6c4009
Packit 6c4009
#if IS_IN (libnsl)
Packit 6c4009
# define libnsl_hidden_proto(name, attrs...) hidden_proto (name, ##attrs)
Packit 6c4009
# define libnsl_hidden_tls_proto(name, attrs...) \
Packit 6c4009
  hidden_tls_proto (name, ##attrs)
Packit 6c4009
# ifdef LINK_OBSOLETE_NSL
Packit 6c4009
   /* libnsl_hidden_nolink should only get used in libnsl code.  */
Packit 6c4009
#  define libnsl_hidden_nolink_def(name, version) libnsl_hidden_def (name)
Packit 6c4009
# else
Packit 6c4009
#  define libnsl_hidden_nolink_def(name, version) hidden_nolink (name, libnsl, version)
Packit 6c4009
# endif
Packit 6c4009
# define libnsl_hidden_def(name) hidden_def (name)
Packit 6c4009
# define libnsl_hidden_weak(name) hidden_weak (name)
Packit 6c4009
# define libnsl_hidden_ver(local, name) hidden_ver (local, name)
Packit 6c4009
# define libnsl_hidden_data_def(name) hidden_data_def (name)
Packit 6c4009
# define libnsl_hidden_data_weak(name) hidden_data_weak (name)
Packit 6c4009
# define libnsl_hidden_data_ver(local, name) hidden_data_ver (local, name)
Packit 6c4009
#else
Packit 6c4009
# define libnsl_hidden_proto(name, attrs...)
Packit 6c4009
# define libnsl_hidden_tls_proto(name, attrs...)
Packit 6c4009
# define libnsl_hidden_def(name)
Packit 6c4009
# define libnsl_hidden_weak(name)
Packit 6c4009
# define libnsl_hidden_ver(local, name)
Packit 6c4009
# define libnsl_hidden_data_def(name)
Packit 6c4009
# define libnsl_hidden_data_weak(name)
Packit 6c4009
# define libnsl_hidden_data_ver(local, name)
Packit 6c4009
#endif
Packit 6c4009
Packit 6c4009
#if IS_IN (libnss_nisplus)
Packit 6c4009
# define libnss_nisplus_hidden_proto(name, attrs...) hidden_proto (name, ##attrs)
Packit 6c4009
# define libnss_nisplus_hidden_tls_proto(name, attrs...) \
Packit 6c4009
  hidden_tls_proto (name, ##attrs)
Packit 6c4009
# define libnss_nisplus_hidden_def(name) hidden_def (name)
Packit 6c4009
# define libnss_nisplus_hidden_weak(name) hidden_weak (name)
Packit 6c4009
# define libnss_nisplus_hidden_ver(local, name) hidden_ver (local, name)
Packit 6c4009
# define libnss_nisplus_hidden_data_def(name) hidden_data_def (name)
Packit 6c4009
# define libnss_nisplus_hidden_data_weak(name) hidden_data_weak (name)
Packit 6c4009
# define libnss_nisplus_hidden_data_ver(local, name) hidden_data_ver (local, name)
Packit 6c4009
#else
Packit 6c4009
# define libnss_nisplus_hidden_proto(name, attrs...)
Packit 6c4009
# define libnss_nisplus_hidden_tls_proto(name, attrs...)
Packit 6c4009
# define libnss_nisplus_hidden_def(name)
Packit 6c4009
# define libnss_nisplus_hidden_weak(name)
Packit 6c4009
# define libnss_nisplus_hidden_ver(local, name)
Packit 6c4009
# define libnss_nisplus_hidden_data_def(name)
Packit 6c4009
# define libnss_nisplus_hidden_data_weak(name)
Packit 6c4009
# define libnss_nisplus_hidden_data_ver(local, name)
Packit 6c4009
#endif
Packit 6c4009
Packit 6c4009
#define libc_hidden_builtin_proto(name, attrs...) libc_hidden_proto (name, ##attrs)
Packit 6c4009
#define libc_hidden_builtin_def(name) libc_hidden_def (name)
Packit 6c4009
#define libc_hidden_builtin_weak(name) libc_hidden_weak (name)
Packit 6c4009
#define libc_hidden_builtin_ver(local, name) libc_hidden_ver (local, name)
Packit 6c4009
#ifdef __ASSEMBLER__
Packit 6c4009
# define HIDDEN_BUILTIN_JUMPTARGET(name) HIDDEN_JUMPTARGET(name)
Packit 6c4009
#endif
Packit 6c4009
Packit 6c4009
#if IS_IN (libutil)
Packit 6c4009
# define libutil_hidden_proto(name, attrs...) hidden_proto (name, ##attrs)
Packit 6c4009
# define libutil_hidden_tls_proto(name, attrs...) \
Packit 6c4009
  hidden_tls_proto (name, ##attrs)
Packit 6c4009
# define libutil_hidden_def(name) hidden_def (name)
Packit 6c4009
# define libutil_hidden_weak(name) hidden_weak (name)
Packit 6c4009
# define libutil_hidden_ver(local, name) hidden_ver (local, name)
Packit 6c4009
# define libutil_hidden_data_def(name) hidden_data_def (name)
Packit 6c4009
# define libutil_hidden_data_weak(name) hidden_data_weak (name)
Packit 6c4009
# define libutil_hidden_data_ver(local, name) hidden_data_ver (local, name)
Packit 6c4009
#else
Packit 6c4009
# define libutil_hidden_proto(name, attrs...)
Packit 6c4009
# define libutil_hidden_tls_proto(name, attrs...)
Packit 6c4009
# define libutil_hidden_def(name)
Packit 6c4009
# define libutil_hidden_weak(name)
Packit 6c4009
# define libutil_hidden_ver(local, name)
Packit 6c4009
# define libutil_hidden_data_def(name)
Packit 6c4009
# define libutil_hidden_data_weak(name)
Packit 6c4009
# define libutil_hidden_data_ver(local, name)
Packit 6c4009
#endif
Packit 6c4009
Packit 6c4009
/* Get some dirty hacks.  */
Packit 6c4009
#include <symbol-hacks.h>
Packit 6c4009
Packit 6c4009
/* Move compatibility symbols out of the way by placing them all in a
Packit 6c4009
   special section.  */
Packit 6c4009
#ifndef __ASSEMBLER__
Packit 6c4009
# define attribute_compat_text_section \
Packit 6c4009
    __attribute__ ((section (".text.compat")))
Packit 6c4009
# define attribute_compat_data_section \
Packit 6c4009
    __attribute__ ((section (".data.compat")))
Packit 6c4009
#else
Packit 6c4009
# define compat_text_section .section ".text.compat", "ax";
Packit 6c4009
# define compat_data_section .section ".data.compat", "aw";
Packit 6c4009
#endif
Packit 6c4009
Packit 6c4009
/* Helper / base  macros for indirect function symbols.  */
Packit 6c4009
#define __ifunc_resolver(type_name, name, expr, arg, init, classifier)	\
Packit 6c4009
  classifier inhibit_stack_protector					\
Packit 6c4009
  __typeof (type_name) *name##_ifunc (arg)				\
Packit 6c4009
  {									\
Packit 6c4009
    init ();								\
Packit 6c4009
    __typeof (type_name) *res = expr;					\
Packit 6c4009
    return res;								\
Packit 6c4009
  }
Packit 6c4009
Packit 6c4009
#ifdef HAVE_GCC_IFUNC
Packit 6c4009
# define __ifunc(type_name, name, expr, arg, init)			\
Packit 6c4009
  extern __typeof (type_name) name __attribute__			\
Packit 6c4009
			      ((ifunc (#name "_ifunc")));		\
Packit 6c4009
  __ifunc_resolver (type_name, name, expr, arg, init, static)
Packit 6c4009
Packit 6c4009
# define __ifunc_hidden(type_name, name, expr, arg, init)	\
Packit 6c4009
  __ifunc (type_name, name, expr, arg, init)
Packit 6c4009
#else
Packit 6c4009
/* Gcc does not support __attribute__ ((ifunc (...))).  Use the old behaviour
Packit 6c4009
   as fallback.  But keep in mind that the debug information for the ifunc
Packit 6c4009
   resolver functions is not correct.  It contains the ifunc'ed function as
Packit 6c4009
   DW_AT_linkage_name.  E.g. lldb uses this field and an inferior function
Packit 6c4009
   call of the ifunc'ed function will fail due to "no matching function for
Packit 6c4009
   call to ..." because the ifunc'ed function and the resolver function have
Packit 6c4009
   different signatures.  (Gcc support is disabled at least on a ppc64le
Packit 6c4009
   Ubuntu 14.04 system.)  */
Packit 6c4009
Packit 6c4009
# define __ifunc(type_name, name, expr, arg, init)			\
Packit 6c4009
  extern __typeof (type_name) name;					\
Packit 6c4009
  __typeof (type_name) *name##_ifunc (arg) __asm__ (#name);		\
Packit 6c4009
  __ifunc_resolver (type_name, name, expr, arg, init,)			\
Packit 6c4009
 __asm__ (".type " #name ", %gnu_indirect_function");
Packit 6c4009
Packit 6c4009
# define __ifunc_hidden(type_name, name, expr, arg, init)		\
Packit 6c4009
  extern __typeof (type_name) __libc_##name;				\
Packit 6c4009
  __ifunc (type_name, __libc_##name, expr, arg, init)			\
Packit 6c4009
  strong_alias (__libc_##name, name);
Packit 6c4009
#endif /* !HAVE_GCC_IFUNC  */
Packit 6c4009
Packit 6c4009
/* The following macros are used for indirect function symbols in libc.so.
Packit 6c4009
   First of all, you need to have the function prototyped somewhere,
Packit 6c4009
   say in foo.h:
Packit 6c4009
Packit 6c4009
   int foo (int __bar);
Packit 6c4009
Packit 6c4009
   If you have an implementation for foo which e.g. uses a special hardware
Packit 6c4009
   feature which isn't available on all machines where this libc.so will be
Packit 6c4009
   used but decideable if available at runtime e.g. via hwcaps, you can provide
Packit 6c4009
   two or multiple implementations of foo:
Packit 6c4009
Packit 6c4009
   int __foo_default (int __bar)
Packit 6c4009
   {
Packit 6c4009
     return __bar;
Packit 6c4009
   }
Packit 6c4009
Packit 6c4009
   int __foo_special (int __bar)
Packit 6c4009
   {
Packit 6c4009
     return __bar;
Packit 6c4009
   }
Packit 6c4009
Packit 6c4009
   If your function foo has no libc_hidden_proto (foo) defined for PLT
Packit 6c4009
   bypassing, you can use:
Packit 6c4009
Packit 6c4009
   #define INIT_ARCH() unsigned long int hwcap = __GLRO(dl_hwcap);
Packit 6c4009
Packit 6c4009
   libc_ifunc (foo, (hwcap & HWCAP_SPECIAL) ? __foo_special : __foo_default);
Packit 6c4009
Packit 6c4009
   This will define a resolver function for foo which returns __foo_special or
Packit 6c4009
   __foo_default depending on your specified expression.  Please note that you
Packit 6c4009
   have to define a macro function INIT_ARCH before using libc_ifunc macro as
Packit 6c4009
   it is called by the resolver function before evaluating the specified
Packit 6c4009
   expression.  In this example it is used to prepare the hwcap variable.
Packit 6c4009
   The resolver function is assigned to an ifunc'ed symbol foo.  Calls to foo
Packit 6c4009
   from inside or outside of libc.so will be indirected by a PLT call.
Packit 6c4009
Packit 6c4009
   If your function foo has a libc_hidden_proto (foo) defined for PLT bypassing
Packit 6c4009
   and calls to foo within libc.so should always go to one specific
Packit 6c4009
   implementation of foo e.g. __foo_default then you have to add:
Packit 6c4009
Packit 6c4009
   __hidden_ver1 (__foo_default, __GI_foo, __foo_default);
Packit 6c4009
Packit 6c4009
   or a tweaked definition of libc_hidden_def macro after the __foo_default
Packit 6c4009
   function definition.  Calls to foo within libc.so will always go directly to
Packit 6c4009
   __foo_default.  Calls to foo from outside libc.so will be indirected by a
Packit 6c4009
   PLT call to ifunc'ed symbol foo which you have to define in a separate
Packit 6c4009
   compile unit:
Packit 6c4009
Packit 6c4009
   #define foo __redirect_foo
Packit 6c4009
   #include <foo.h>
Packit 6c4009
   #undef foo
Packit 6c4009
Packit 6c4009
   extern __typeof (__redirect_foo) __foo_default attribute_hidden;
Packit 6c4009
   extern __typeof (__redirect_foo) __foo_special attribute_hidden;
Packit 6c4009
Packit 6c4009
   libc_ifunc_redirected (__redirect_foo, foo,
Packit 6c4009
			  (hwcap & HWCAP_SPECIAL)
Packit 6c4009
			  ? __foo_special
Packit 6c4009
			  : __foo_default);
Packit 6c4009
Packit 6c4009
   This will define the ifunc'ed symbol foo like above.  The redirection of foo
Packit 6c4009
   in header file is needed to omit an additional defintion of __GI_foo which
Packit 6c4009
   would end in a linker error while linking libc.so.  You have to specify
Packit 6c4009
   __redirect_foo as first parameter which is used within libc_ifunc_redirected
Packit 6c4009
   macro in conjunction with typeof to define the ifunc'ed symbol foo.
Packit 6c4009
Packit 6c4009
   If your function foo has a libc_hidden_proto (foo) defined and calls to foo
Packit 6c4009
   within or from outside libc.so should go via ifunc'ed symbol, then you have
Packit 6c4009
   to use:
Packit 6c4009
Packit 6c4009
   libc_ifunc_hidden (foo, foo,
Packit 6c4009
		      (hwcap & HWCAP_SPECIAL)
Packit 6c4009
		      ? __foo_special
Packit 6c4009
		      : __foo_default);
Packit 6c4009
   libc_hidden_def (foo)
Packit 6c4009
Packit 6c4009
   The first parameter foo of libc_ifunc_hidden macro is used in the same way
Packit 6c4009
   as for libc_ifunc_redirected macro.  */
Packit 6c4009
Packit 6c4009
#define libc_ifunc(name, expr) __ifunc (name, name, expr, void, INIT_ARCH)
Packit 6c4009
Packit 6c4009
#define libc_ifunc_redirected(redirected_name, name, expr)	\
Packit 6c4009
  __ifunc (redirected_name, name, expr, void, INIT_ARCH)
Packit 6c4009
Packit 6c4009
#define libc_ifunc_hidden(redirected_name, name, expr)			\
Packit 6c4009
  __ifunc_hidden (redirected_name, name, expr, void, INIT_ARCH)
Packit 6c4009
Packit 6c4009
/* The body of the function is supposed to use __get_cpu_features
Packit 6c4009
   which will, if necessary, initialize the data first.  */
Packit 6c4009
#define libm_ifunc_init()
Packit 6c4009
#define libm_ifunc(name, expr)				\
Packit 6c4009
  __ifunc (name, name, expr, void, libm_ifunc_init)
Packit 6c4009
Packit 6c4009
/* Add the compiler optimization to inhibit loop transformation to library
Packit 6c4009
   calls.  This is used to avoid recursive calls in memset and memmove
Packit 6c4009
   default implementations.  */
Packit 6c4009
#ifdef HAVE_CC_INHIBIT_LOOP_TO_LIBCALL
Packit 6c4009
# define inhibit_loop_to_libcall \
Packit 6c4009
    __attribute__ ((__optimize__ ("-fno-tree-loop-distribute-patterns")))
Packit 6c4009
#else
Packit 6c4009
# define inhibit_loop_to_libcall
Packit 6c4009
#endif
Packit 6c4009

Packit 6c4009
/* These macros facilitate sharing source files with gnulib.
Packit 6c4009
Packit 6c4009
   They are here instead of sys/cdefs.h because they should not be
Packit 6c4009
   used in public header files.
Packit 6c4009
Packit 6c4009
   Their definitions should be kept consistent with the definitions in
Packit 6c4009
   gnulib-common.m4, but it is not necessary to cater to old non-GCC
Packit 6c4009
   compilers, since they will only be used while building glibc itself.
Packit 6c4009
   (Note that _GNUC_PREREQ cannot be used in this file.)  */
Packit 6c4009
Packit 6c4009
/* Define as a marker that can be attached to declarations that might not
Packit 6c4009
    be used.  This helps to reduce warnings, such as from
Packit 6c4009
    GCC -Wunused-parameter.  */
Packit 6c4009
#if __GNUC__ >= 3 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7)
Packit 6c4009
# define _GL_UNUSED __attribute__ ((__unused__))
Packit 6c4009
#else
Packit 6c4009
# define _GL_UNUSED
Packit 6c4009
#endif
Packit 6c4009
Packit 6c4009
/* gcc supports the "unused" attribute on possibly unused labels, and
Packit 6c4009
   g++ has since version 4.5.  Note to support C++ as well as C,
Packit 6c4009
   _GL_UNUSED_LABEL should be used with a trailing ;  */
Packit 6c4009
#if !defined __cplusplus || __GNUC__ > 4 \
Packit 6c4009
    || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5)
Packit 6c4009
# define _GL_UNUSED_LABEL _GL_UNUSED
Packit 6c4009
#else
Packit 6c4009
# define _GL_UNUSED_LABEL
Packit 6c4009
#endif
Packit 6c4009
Packit 6c4009
/* The __pure__ attribute was added in gcc 2.96.  */
Packit 6c4009
#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96)
Packit 6c4009
# define _GL_ATTRIBUTE_PURE __attribute__ ((__pure__))
Packit 6c4009
#else
Packit 6c4009
# define _GL_ATTRIBUTE_PURE /* empty */
Packit 6c4009
#endif
Packit 6c4009
Packit 6c4009
/* The __const__ attribute was added in gcc 2.95.  */
Packit 6c4009
#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 95)
Packit 6c4009
# define _GL_ATTRIBUTE_CONST __attribute__ ((__const__))
Packit 6c4009
#else
Packit 6c4009
# define _GL_ATTRIBUTE_CONST /* empty */
Packit 6c4009
#endif
Packit 6c4009
Packit 6c4009
#endif /* !_ISOMAC */
Packit 6c4009
#endif /* libc-symbols.h */