zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

libc-symbols.h (32863B) - Raw


      1 /* Support macros for making weak and strong aliases for symbols,
      2    and for using symbol sets and linker warnings with GNU ld.
      3    Copyright (C) 1995-2025 Free Software Foundation, Inc.
      4    This file is part of the GNU C Library.
      5 
      6    The GNU C Library is free software; you can redistribute it and/or
      7    modify it under the terms of the GNU Lesser General Public
      8    License as published by the Free Software Foundation; either
      9    version 2.1 of the License, or (at your option) any later version.
     10 
     11    The GNU C Library is distributed in the hope that it will be useful,
     12    but WITHOUT ANY WARRANTY; without even the implied warranty of
     13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     14    Lesser General Public License for more details.
     15 
     16    You should have received a copy of the GNU Lesser General Public
     17    License along with the GNU C Library; if not, see
     18    <https://www.gnu.org/licenses/>.  */
     19 
     20 #ifndef _LIBC_SYMBOLS_H
     21 #define _LIBC_SYMBOLS_H	1
     22 
     23 /* This file is included implicitly in the compilation of every source file,
     24    using -include.  It includes config.h.  */
     25 
     26 /* Enable declarations of GNU extensions, since we are compiling them.  */
     27 #define _GNU_SOURCE 1
     28 
     29 #ifdef MODULE_NAME
     30 
     31 /* Use `#if IS_IN (module)` to detect what component is being compiled.  */
     32 #define PASTE_NAME1(a,b) a##b
     33 #define PASTE_NAME(a,b)	 PASTE_NAME1 (a,b)
     34 #define IN_MODULE	 PASTE_NAME (MODULE_, MODULE_NAME)
     35 #define IS_IN(lib)	 (IN_MODULE == MODULE_##lib)
     36 
     37 /* True if the current module is a versioned library.  Versioned
     38    library names culled from shlib-versions files are assigned a
     39    MODULE_* value greater than MODULE_LIBS_BEGIN.  */
     40 #define IS_IN_LIB	 (IN_MODULE > MODULE_LIBS_BEGIN)
     41 
     42 /* The testsuite, and some other ancillary code, should be compiled against
     43    as close an approximation to the installed headers as possible.
     44    Defining this symbol disables most internal-use-only declarations
     45    provided by this header, and all those provided by other internal
     46    wrapper headers.  */
     47 #if IS_IN (testsuite) || defined IS_IN_build || defined __cplusplus
     48 # define _ISOMAC 1
     49 #endif
     50 
     51 #else
     52 /* The generation process for a few files created very early in the
     53    build (notably libc-modules.h itself) involves preprocessing this
     54    header without defining MODULE_NAME.  Under these conditions,
     55    internal declarations (especially from config.h) must be visible,
     56    but IS_IN should always evaluate as false.  */
     57 # define IS_IN(lib) 0
     58 # define IS_IN_LIB 0
     59 # define IN_MODULE (-1)
     60 #endif
     61 
     62 #include <libc-misc.h>
     63 
     64 #ifndef _ISOMAC
     65 
     66 /* This is defined for the compilation of all C library code.  features.h
     67    tests this to avoid inclusion of stubs.h while compiling the library,
     68    before stubs.h has been generated.  Some library code that is shared
     69    with other packages also tests this symbol to see if it is being
     70    compiled as part of the C library.  We must define this before including
     71    config.h, because it makes some definitions conditional on whether libc
     72    itself is being compiled, or just some generator program.  */
     73 #define _LIBC	1
     74 
     75 /* Some files must be compiled with optimization on.  */
     76 #if !defined __ASSEMBLER__ && !defined __OPTIMIZE__
     77 # error "glibc cannot be compiled without optimization"
     78 #endif
     79 
     80 /* -ffast-math cannot be applied to the C library, as it alters the ABI.
     81    Some test components that use -ffast-math are currently not part of
     82    IS_IN (testsuite) for technical reasons, so we have a secondary override.  */
     83 #if defined __FAST_MATH__ && !defined TEST_FAST_MATH
     84 # error "glibc must not be compiled with -ffast-math"
     85 #endif
     86 
     87 /* Obtain the definition of symbol_version_reference.  */
     88 #include <libc-symver.h>
     89 
     90 /* When PIC is defined and SHARED isn't defined, we are building PIE
     91    by default.  */
     92 #if defined PIC && !defined SHARED
     93 # define BUILD_PIE_DEFAULT 1
     94 #else
     95 # define BUILD_PIE_DEFAULT 0
     96 #endif
     97 
     98 /* Define this for the benefit of portable GNU code that wants to check it.
     99    Code that checks with #if will not #include <config.h> again, since we've
    100    already done it (and this file is implicitly included in every compile,
    101    via -include).  Code that checks with #ifdef will #include <config.h>,
    102    but that file should always be idempotent (i.e., it's just #define/#undef
    103    and nothing else anywhere should be changing the macro state it touches),
    104    so it's harmless.  */
    105 #define HAVE_CONFIG_H	0
    106 
    107 /* Define these macros for the benefit of portable GNU code that wants to check
    108    them.  Of course, STDC_HEADERS is never false when building libc!  */
    109 #define STDC_HEADERS	1
    110 #define HAVE_MBSTATE_T	1
    111 #define HAVE_MBSRTOWCS	1
    112 #define HAVE_LIBINTL_H	1
    113 #define HAVE_WCTYPE_H	1
    114 #define HAVE_ISWCTYPE	1
    115 #define ENABLE_NLS	1
    116 
    117 /* The symbols in all the user (non-_) macros are C symbols.  */
    118 
    119 #ifndef __SYMBOL_PREFIX
    120 # define __SYMBOL_PREFIX
    121 #endif
    122 
    123 #ifndef C_SYMBOL_NAME
    124 # define C_SYMBOL_NAME(name) name
    125 #endif
    126 
    127 #ifndef ASM_LINE_SEP
    128 # define ASM_LINE_SEP ;
    129 #endif
    130 
    131 #ifndef __attribute_copy__
    132 /* Provide an empty definition when cdefs.h is not included.  */
    133 # define __attribute_copy__(arg)
    134 #endif
    135 
    136 #ifndef __ASSEMBLER__
    137 /* GCC understands weak symbols and aliases; use its interface where
    138    possible, instead of embedded assembly language.  */
    139 
    140 /* Define ALIASNAME as a strong alias for NAME.  */
    141 # define strong_alias(name, aliasname) _strong_alias(name, aliasname)
    142 # define _strong_alias(name, aliasname) \
    143   extern __typeof (name) aliasname __attribute__ ((alias (#name))) \
    144     __attribute_copy__ (name);
    145 
    146 /* This comes between the return type and function name in
    147    a function definition to make that definition weak.  */
    148 # define weak_function __attribute__ ((weak))
    149 # define weak_const_function __attribute__ ((weak, __const__))
    150 
    151 /* Define ALIASNAME as a weak alias for NAME.
    152    If weak aliases are not available, this defines a strong alias.  */
    153 # define weak_alias(name, aliasname) _weak_alias (name, aliasname)
    154 # define _weak_alias(name, aliasname) \
    155   extern __typeof (name) aliasname __attribute__ ((weak, alias (#name))) \
    156     __attribute_copy__ (name);
    157 
    158 /* zig patch: weak_hidden_alias was removed from glibc v2.36 (v2.37?), Zig
    159    needs it for the v2.32 and earlier {f,l,}stat wrappers, so only include
    160    in this header for 2.32 and earlier. */
    161 #if (__GLIBC__ == 2 && __GLIBC_MINOR__ <= 32) || __GLIBC__ < 2
    162 # define weak_hidden_alias(name, aliasname) \
    163   _weak_hidden_alias (name, aliasname)
    164 # define _weak_hidden_alias(name, aliasname) \
    165   extern __typeof (name) aliasname \
    166     __attribute__ ((weak, alias (#name), __visibility__ ("hidden"))) \
    167     __attribute_copy__ (name);
    168 #endif
    169 
    170 /* Declare SYMBOL as weak undefined symbol (resolved to 0 if not defined).  */
    171 # define weak_extern(symbol) _weak_extern (weak symbol)
    172 # define _weak_extern(expr) _Pragma (#expr)
    173 
    174 /* In shared builds, the expression call_function_static_weak
    175    (FUNCTION-SYMBOL, ARGUMENTS) invokes FUNCTION-SYMBOL (an
    176    identifier) unconditionally, with the (potentially empty) argument
    177    list ARGUMENTS.  In static builds, if FUNCTION-SYMBOL has a
    178    definition, the function is invoked as before; if FUNCTION-SYMBOL
    179    is NULL, no call is performed.  */
    180 # ifdef SHARED
    181 #  define call_function_static_weak(func, ...) func (__VA_ARGS__)
    182 # else	/* !SHARED */
    183 #  define call_function_static_weak(func, ...)		\
    184   ({							\
    185     extern __typeof__ (func) func weak_function;	\
    186     (func != NULL ? func (__VA_ARGS__) : (void)0);	\
    187   })
    188 # endif
    189 
    190 #else /* __ASSEMBLER__ */
    191 
    192 # ifdef HAVE_ASM_SET_DIRECTIVE
    193 #  define strong_alias(original, alias)				\
    194   .globl C_SYMBOL_NAME (alias) ASM_LINE_SEP		\
    195   .set C_SYMBOL_NAME (alias),C_SYMBOL_NAME (original)
    196 #  define strong_data_alias(original, alias) strong_alias(original, alias)
    197 # else
    198 #  define strong_alias(original, alias)				\
    199   .globl C_SYMBOL_NAME (alias) ASM_LINE_SEP		\
    200   C_SYMBOL_NAME (alias) = C_SYMBOL_NAME (original)
    201 #  define strong_data_alias(original, alias) strong_alias(original, alias)
    202 # endif
    203 
    204 # define weak_alias(original, alias)					\
    205   .weak C_SYMBOL_NAME (alias) ASM_LINE_SEP				\
    206   C_SYMBOL_NAME (alias) = C_SYMBOL_NAME (original)
    207 
    208 # define weak_extern(symbol)						\
    209   .weak C_SYMBOL_NAME (symbol)
    210 
    211 #endif /* __ASSEMBLER__ */
    212 
    213 /* Determine the return address.  */
    214 #define RETURN_ADDRESS(nr) \
    215   __builtin_extract_return_addr (__builtin_return_address (nr))
    216 
    217 /* When a reference to SYMBOL is encountered, the linker will emit a
    218    warning message MSG.  */
    219 /* We want the .gnu.warning.SYMBOL section to be unallocated.  */
    220 #define __make_section_unallocated(section_string)	\
    221   asm (".section " section_string "\n\t.previous");
    222 
    223 /* Tacking on "\n\t#" to the section name makes gcc put its bogus
    224    section attributes on what looks like a comment to the assembler.  */
    225 #ifdef HAVE_SECTION_QUOTES
    226 # define __sec_comment "\"\n\t#\""
    227 #else
    228 # define __sec_comment "\n\t#"
    229 #endif
    230 #define link_warning(symbol, msg) \
    231   __make_section_unallocated (".gnu.warning." #symbol) \
    232   static const char __evoke_link_warning_##symbol[]	\
    233     __attribute__ ((used, section (".gnu.warning." #symbol __sec_comment))) \
    234     = msg;
    235 
    236 /* A canned warning for sysdeps/stub functions.  */
    237 #define	stub_warning(name) \
    238   __make_section_unallocated (".gnu.glibc-stub." #name) \
    239   link_warning (name, #name " is not implemented and will always fail")
    240 
    241 /* Warning for linking functions calling dlopen into static binaries.  */
    242 #ifdef SHARED
    243 #define static_link_warning(name)
    244 #else
    245 #define static_link_warning(name) static_link_warning1(name)
    246 #define static_link_warning1(name) \
    247   link_warning(name, "Using '" #name "' in statically linked applications \
    248 requires at runtime the shared libraries from the glibc version used \
    249 for linking")
    250 #endif
    251 
    252 /* Declare SYMBOL to be TYPE (`function' or `object') of SIZE bytes
    253    alias to ORIGINAL, when the assembler supports such declarations
    254    (such as in ELF).
    255    This is only necessary when defining something in assembly, or playing
    256    funny alias games where the size should be other than what the compiler
    257    thinks it is.  */
    258 #define declare_object_symbol_alias(symbol, original, size) \
    259   declare_object_symbol_alias_1 (symbol, original, size)
    260 #ifdef __ASSEMBLER__
    261 # define declare_object_symbol_alias_1(symbol, original, s_size) \
    262    strong_alias (original, symbol) ASM_LINE_SEP \
    263    .type C_SYMBOL_NAME (symbol), %object ASM_LINE_SEP \
    264    .size C_SYMBOL_NAME (symbol), s_size ASM_LINE_SEP
    265 #else /* Not __ASSEMBLER__.  */
    266 # ifdef HAVE_ASM_SET_DIRECTIVE
    267 #  define declare_object_symbol_alias_1(symbol, original, size) \
    268      asm (".global " __SYMBOL_PREFIX # symbol "\n" \
    269 	  ".type " __SYMBOL_PREFIX # symbol ", %object\n" \
    270 	  ".set " __SYMBOL_PREFIX #symbol ", " __SYMBOL_PREFIX original "\n" \
    271 	  ".size " __SYMBOL_PREFIX #symbol ", " #size "\n");
    272 # else
    273 #  define declare_object_symbol_alias_1(symbol, original, size) \
    274      asm (".global " __SYMBOL_PREFIX # symbol "\n" \
    275 	  ".type " __SYMBOL_PREFIX # symbol ", %object\n" \
    276 	  __SYMBOL_PREFIX #symbol " = " __SYMBOL_PREFIX original "\n" \
    277 	  ".size " __SYMBOL_PREFIX #symbol ", " #size "\n");
    278 # endif /* HAVE_ASM_SET_DIRECTIVE */
    279 #endif /* __ASSEMBLER__ */
    280 
    281 
    282 /*
    283 
    284 */
    285 
    286 #ifdef HAVE_GNU_RETAIN
    287 # define attribute_used_retain __attribute__ ((__used__, __retain__))
    288 #else
    289 # define attribute_used_retain __attribute__ ((__used__))
    290 #endif
    291 
    292 /* Symbol set support macros.  */
    293 
    294 /* Make SYMBOL, which is in the text segment, an element of SET.  */
    295 #define text_set_element(set, symbol)	_elf_set_element(set, symbol)
    296 /* Make SYMBOL, which is in the data segment, an element of SET.  */
    297 #define data_set_element(set, symbol)	_elf_set_element(set, symbol)
    298 /* Make SYMBOL, which is in the bss segment, an element of SET.  */
    299 #define bss_set_element(set, symbol)	_elf_set_element(set, symbol)
    300 
    301 /* These are all done the same way in ELF.
    302    There is a new section created for each set.  */
    303 #ifdef SHARED
    304 /* When building a shared library, make the set section writable,
    305    because it will need to be relocated at run time anyway.  */
    306 # define _elf_set_element(set, symbol) \
    307     static const void *__elf_set_##set##_element_##symbol##__ \
    308       attribute_used_retain __attribute__ ((section (#set))) = &(symbol)
    309 #else
    310 # define _elf_set_element(set, symbol) \
    311     static const void *const __elf_set_##set##_element_##symbol##__ \
    312       attribute_used_retain __attribute__ ((section (#set))) = &(symbol)
    313 #endif
    314 
    315 /* Define SET as a symbol set.  This may be required (it is in a.out) to
    316    be able to use the set's contents.  */
    317 #define symbol_set_define(set)	symbol_set_declare(set)
    318 
    319 /* Declare SET for use in this module, if defined in another module.
    320    In a shared library, this is always local to that shared object.
    321    For static linking, the set might be wholly absent and so we use
    322    weak references.  */
    323 #define symbol_set_declare(set) \
    324   extern char const __start_##set[] __symbol_set_attribute; \
    325   extern char const __stop_##set[] __symbol_set_attribute;
    326 #ifdef SHARED
    327 # define __symbol_set_attribute attribute_hidden
    328 #else
    329 # define __symbol_set_attribute __attribute__ ((weak))
    330 #endif
    331 
    332 /* Return a pointer (void *const *) to the first element of SET.  */
    333 #define symbol_set_first_element(set)	((void *const *) (&__start_##set))
    334 
    335 /* Return true iff PTR (a void *const *) has been incremented
    336    past the last element in SET.  */
    337 #define symbol_set_end_p(set, ptr) ((ptr) >= (void *const *) &__stop_##set)
    338 
    339 #ifdef SHARED
    340 # define symbol_version(real, name, version) \
    341   symbol_version_reference(real, name, version)
    342 # define default_symbol_version(real, name, version) \
    343      _default_symbol_version(real, name, version)
    344 /* See <libc-symver.h>.  */
    345 # ifdef __ASSEMBLER__
    346 #  define _default_symbol_version(real, name, version) \
    347   _set_symbol_version (real, name@@version)
    348 # else
    349 #  define _default_symbol_version(real, name, version) \
    350   _set_symbol_version (real, #name "@@" #version)
    351 # endif
    352 
    353 /* Evaluates to a string literal for VERSION in LIB.  */
    354 # define symbol_version_string(lib, version) \
    355   _symbol_version_stringify_1 (VERSION_##lib##_##version)
    356 # define _symbol_version_stringify_1(arg) _symbol_version_stringify_2 (arg)
    357 # define _symbol_version_stringify_2(arg) #arg
    358 
    359 #else /* !SHARED */
    360 # define symbol_version(real, name, version)
    361 # define default_symbol_version(real, name, version) \
    362   strong_alias(real, name)
    363 #endif
    364 
    365 #if defined SHARED || defined LIBC_NONSHARED \
    366   || (BUILD_PIE_DEFAULT && IS_IN (libc))
    367 # define attribute_hidden __attribute__ ((visibility ("hidden")))
    368 #else
    369 # define attribute_hidden
    370 #endif
    371 
    372 #define attribute_tls_model_ie __attribute__ ((tls_model ("initial-exec")))
    373 
    374 #define attribute_relro __attribute__ ((section (".data.rel.ro")))
    375 
    376 
    377 /* The following macros are used for PLT bypassing within libc.so
    378    (and if needed other libraries similarly).
    379    First of all, you need to have the function prototyped somewhere,
    380    say in foo/foo.h:
    381 
    382    int foo (int __bar);
    383 
    384    If calls to foo within libc.so should always go to foo defined in libc.so,
    385    then in include/foo.h you add:
    386 
    387    libc_hidden_proto (foo)
    388 
    389    line and after the foo function definition:
    390 
    391    int foo (int __bar)
    392    {
    393      return __bar;
    394    }
    395    libc_hidden_def (foo)
    396 
    397    or
    398 
    399    int foo (int __bar)
    400    {
    401      return __bar;
    402    }
    403    libc_hidden_weak (foo)
    404 
    405    Similarly for global data.  If references to foo within libc.so should
    406    always go to foo defined in libc.so, then in include/foo.h you add:
    407 
    408    libc_hidden_proto (foo)
    409 
    410    line and after foo's definition:
    411 
    412    int foo = INITIAL_FOO_VALUE;
    413    libc_hidden_data_def (foo)
    414 
    415    or
    416 
    417    int foo = INITIAL_FOO_VALUE;
    418    libc_hidden_data_weak (foo)
    419 
    420    If foo is normally just an alias (strong or weak) to some other function,
    421    you should use the normal strong_alias first, then add libc_hidden_def
    422    or libc_hidden_weak:
    423 
    424    int baz (int __bar)
    425    {
    426      return __bar;
    427    }
    428    strong_alias (baz, foo)
    429    libc_hidden_weak (foo)
    430 
    431    If the function should be internal to multiple objects, say ld.so and
    432    libc.so, the best way is to use:
    433 
    434    #if IS_IN (libc) || IS_IN (rtld)
    435    hidden_proto (foo)
    436    #endif
    437 
    438    in include/foo.h and the normal macros at all function definitions
    439    depending on what DSO they belong to.
    440 
    441    If versioned_symbol macro is used to define foo,
    442    libc_hidden_ver macro should be used, as in:
    443 
    444    int __real_foo (int __bar)
    445    {
    446      return __bar;
    447    }
    448    versioned_symbol (libc, __real_foo, foo, GLIBC_2_1);
    449    libc_hidden_ver (__real_foo, foo)  */
    450 
    451 #if defined SHARED && !defined NO_HIDDEN
    452 # ifndef __ASSEMBLER__
    453 #  define __hidden_proto_hiddenattr(attrs...) \
    454   __attribute__ ((visibility ("hidden"), ##attrs))
    455 #  define hidden_proto(name, attrs...) \
    456   __hidden_proto (name, , __GI_##name, ##attrs)
    457 #  define hidden_proto_alias(name, alias, attrs...) \
    458   __hidden_proto_alias (name, , alias, ##attrs)
    459 #  define hidden_tls_proto(name, attrs...) \
    460   __hidden_proto (name, __thread, __GI_##name, ##attrs)
    461 #  define __hidden_proto(name, thread, internal, attrs...)	     \
    462   extern thread __typeof (name) name __asm__ (__hidden_asmname (#internal)) \
    463   __hidden_proto_hiddenattr (attrs);
    464 #  define __hidden_proto_alias(name, thread, internal, attrs...)	     \
    465   extern thread __typeof (name) internal __hidden_proto_hiddenattr (attrs);
    466 #  define __hidden_asmname(name) \
    467   __hidden_asmname1 (__USER_LABEL_PREFIX__, name)
    468 #  define __hidden_asmname1(prefix, name) __hidden_asmname2(prefix, name)
    469 #  define __hidden_asmname2(prefix, name) #prefix name
    470 #  define __hidden_ver1(local, internal, name) \
    471   __hidden_ver2 (, local, internal, name)
    472 #  define __hidden_ver2(thread, local, internal, name)			\
    473   extern thread __typeof (name) __EI_##name \
    474     __asm__(__hidden_asmname (#internal));  \
    475   extern thread __typeof (name) __EI_##name \
    476     __attribute__((alias (__hidden_asmname (#local))))	\
    477     __attribute_copy__ (name)
    478 #  define hidden_ver(local, name)	__hidden_ver1(local, __GI_##name, name);
    479 #  define hidden_def(name)		__hidden_ver1(__GI_##name, name, name);
    480 #  define hidden_def_alias(name, internal) \
    481   strong_alias (name, internal)
    482 #  define hidden_data_def(name)		hidden_def(name)
    483 #  define hidden_data_def_alias(name, alias) hidden_def_alias(name, alias)
    484 #  define hidden_tls_def(name)				\
    485   __hidden_ver2 (__thread, __GI_##name, name, name);
    486 #  define hidden_weak(name) \
    487 	__hidden_ver1(__GI_##name, name, name) __attribute__((weak));
    488 #  define hidden_data_weak(name)	hidden_weak(name)
    489 #  define hidden_nolink(name, lib, version) \
    490   __hidden_nolink1 (__GI_##name, __EI_##name, name, VERSION_##lib##_##version)
    491 #  define __hidden_nolink1(local, internal, name, version) \
    492   __hidden_nolink2 (local, internal, name, version)
    493 #  define __hidden_nolink2(local, internal, name, version) \
    494   extern __typeof (name) internal __attribute__ ((alias (#local)))	\
    495     __attribute_copy__ (name);						\
    496   __hidden_nolink3 (local, internal, #name "@" #version)
    497 #  define __hidden_nolink3(local, internal, vername) \
    498   __asm__ (".symver " #internal ", " vername);
    499 # else
    500 /* For assembly, we need to do the opposite of what we do in C:
    501    in assembly gcc __REDIRECT stuff is not in place, so functions
    502    are defined by its normal name and we need to create the
    503    __GI_* alias to it, in C __REDIRECT causes the function definition
    504    to use __GI_* name and we need to add alias to the real name.
    505    There is no reason to use hidden_weak over hidden_def in assembly,
    506    but we provide it for consistency with the C usage.
    507    hidden_proto doesn't make sense for assembly but the equivalent
    508    is to call via the HIDDEN_JUMPTARGET macro instead of JUMPTARGET.  */
    509 #  define hidden_def(name)	strong_alias (name, __GI_##name)
    510 #  define hidden_def_alias(name, alias) strong_alias (name, alias)
    511 #  define hidden_weak(name)	hidden_def (name)
    512 #  define hidden_ver(local, name) strong_alias (local, __GI_##name)
    513 #  define hidden_data_def(name)	strong_data_alias (name, __GI_##name)
    514 #  define hidden_data_def_alias(name, alias) strong_data_alias (name, alias)
    515 #  define hidden_tls_def(name)	hidden_data_def (name)
    516 #  define hidden_data_weak(name)	hidden_data_def (name)
    517 #  define HIDDEN_JUMPTARGET(name) __GI_##name
    518 # endif
    519 #else
    520 # ifndef __ASSEMBLER__
    521 #  if !defined SHARED && IS_IN (libc) && !defined LIBC_NONSHARED \
    522       && (!defined PIC || !defined NO_HIDDEN_EXTERN_FUNC_IN_PIE) \
    523       && !defined NO_HIDDEN
    524 #   define __hidden_proto_hiddenattr(attrs...) \
    525   __attribute__ ((visibility ("hidden"), ##attrs))
    526 #   define hidden_proto(name, attrs...) \
    527   __hidden_proto (name, , name, ##attrs)
    528 #  define hidden_proto_alias(name, alias, attrs...) \
    529   __hidden_proto_alias (name, , alias, ##attrs)
    530 #   define hidden_tls_proto(name, attrs...) \
    531   __hidden_proto (name, __thread, name, ##attrs)
    532 #  define __hidden_proto(name, thread, internal, attrs...)	     \
    533   extern thread __typeof (name) name __hidden_proto_hiddenattr (attrs);
    534 #  define __hidden_proto_alias(name, thread, internal, attrs...)     \
    535   extern thread __typeof (name) internal __hidden_proto_hiddenattr (attrs);
    536 # else
    537 #   define hidden_proto(name, attrs...)
    538 #   define hidden_proto_alias(name, alias, attrs...)
    539 #   define hidden_tls_proto(name, attrs...)
    540 # endif
    541 # else
    542 #  define HIDDEN_JUMPTARGET(name) JUMPTARGET(name)
    543 # endif /* Not  __ASSEMBLER__ */
    544 # define hidden_weak(name)
    545 # define hidden_def(name)
    546 # define hidden_def_alias(name, alias)
    547 # define hidden_ver(local, name)
    548 # define hidden_data_weak(name)
    549 # define hidden_data_def(name)
    550 # define hidden_data_def_alias(name, alias)
    551 # define hidden_tls_def(name)
    552 # define hidden_nolink(name, lib, version)
    553 #endif
    554 
    555 #if IS_IN (libc)
    556 # define libc_hidden_proto(name, attrs...) hidden_proto (name, ##attrs)
    557 # define libc_hidden_proto_alias(name, alias, attrs...) \
    558    hidden_proto_alias (name, alias, ##attrs)
    559 # define libc_hidden_tls_proto(name, attrs...) hidden_tls_proto (name, ##attrs)
    560 # define libc_hidden_def(name) hidden_def (name)
    561 # define libc_hidden_weak(name) hidden_weak (name)
    562 # define libc_hidden_nolink_sunrpc(name, version) hidden_nolink (name, libc, version)
    563 # define libc_hidden_ver(local, name) hidden_ver (local, name)
    564 # define libc_hidden_data_def(name) hidden_data_def (name)
    565 # define libc_hidden_data_def_alias(name, alias) hidden_data_def_alias (name, alias)
    566 # define libc_hidden_tls_def(name) hidden_tls_def (name)
    567 # define libc_hidden_data_weak(name) hidden_data_weak (name)
    568 #else
    569 # define libc_hidden_proto(name, attrs...)
    570 # define libc_hidden_proto_alias(name, alias, attrs...)
    571 # define libc_hidden_tls_proto(name, attrs...)
    572 # define libc_hidden_def(name)
    573 # define libc_hidden_weak(name)
    574 # define libc_hidden_ver(local, name)
    575 # define libc_hidden_data_def(name)
    576 # define libc_hidden_data_def_alias(name, alias)
    577 # define libc_hidden_tls_def(name)
    578 # define libc_hidden_data_weak(name)
    579 #endif
    580 
    581 #if IS_IN (rtld)
    582 # define rtld_hidden_proto(name, attrs...) hidden_proto (name, ##attrs)
    583 # define rtld_hidden_def(name) hidden_def (name)
    584 # define rtld_hidden_weak(name) hidden_weak (name)
    585 # define rtld_hidden_data_def(name) hidden_data_def (name)
    586 #else
    587 # define rtld_hidden_proto(name, attrs...)
    588 # define rtld_hidden_def(name)
    589 # define rtld_hidden_weak(name)
    590 # define rtld_hidden_data_def(name)
    591 #endif
    592 
    593 #if IS_IN (libm)
    594 # define libm_hidden_proto(name, attrs...) hidden_proto (name, ##attrs)
    595 # define libm_hidden_def(name) hidden_def (name)
    596 # define libm_hidden_weak(name) hidden_weak (name)
    597 # define libm_hidden_ver(local, name) hidden_ver (local, name)
    598 #else
    599 # define libm_hidden_proto(name, attrs...)
    600 # define libm_hidden_def(name)
    601 # define libm_hidden_weak(name)
    602 # define libm_hidden_ver(local, name)
    603 #endif
    604 
    605 #if IS_IN (libmvec)
    606 # define libmvec_hidden_proto(name, attrs...) hidden_proto (name, ##attrs)
    607 # define libmvec_hidden_def(name) hidden_def (name)
    608 #else
    609 # define libmvec_hidden_proto(name, attrs...)
    610 # define libmvec_hidden_def(name)
    611 #endif
    612 
    613 #if IS_IN (libresolv)
    614 # define libresolv_hidden_proto(name, attrs...) hidden_proto (name, ##attrs)
    615 # define libresolv_hidden_def(name) hidden_def (name)
    616 # define libresolv_hidden_data_def(name) hidden_data_def (name)
    617 #else
    618 # define libresolv_hidden_proto(name, attrs...)
    619 # define libresolv_hidden_def(name)
    620 # define libresolv_hidden_data_def(name)
    621 #endif
    622 
    623 #if IS_IN (libpthread)
    624 # define libpthread_hidden_proto(name, attrs...) hidden_proto (name, ##attrs)
    625 # define libpthread_hidden_def(name) hidden_def (name)
    626 #else
    627 # define libpthread_hidden_proto(name, attrs...)
    628 # define libpthread_hidden_def(name)
    629 #endif
    630 
    631 #if IS_IN (librt)
    632 # define librt_hidden_proto(name, attrs...) hidden_proto (name, ##attrs)
    633 # define librt_hidden_ver(local, name) hidden_ver (local, name)
    634 #else
    635 # define librt_hidden_proto(name, attrs...)
    636 # define librt_hidden_ver(local, name)
    637 #endif
    638 
    639 #if IS_IN (libnsl)
    640 # define libnsl_hidden_proto(name, attrs...) hidden_proto (name, ##attrs)
    641 # define libnsl_hidden_nolink_def(name, version) hidden_nolink (name, libnsl, version)
    642 #else
    643 # define libnsl_hidden_proto(name, attrs...)
    644 #endif
    645 
    646 #define libc_hidden_builtin_proto(name, attrs...) libc_hidden_proto (name, ##attrs)
    647 #define libc_hidden_builtin_def(name) libc_hidden_def (name)
    648 
    649 #define libc_hidden_ldbl_proto(name, attrs...) libc_hidden_proto (name, ##attrs)
    650 #ifdef __ASSEMBLER__
    651 # define HIDDEN_BUILTIN_JUMPTARGET(name) HIDDEN_JUMPTARGET(name)
    652 #endif
    653 
    654 #if IS_IN (libanl)
    655 # define libanl_hidden_proto(name, attrs...) hidden_proto (name, ##attrs)
    656 #else
    657 # define libanl_hidden_proto(name, attrs...)
    658 #endif
    659 
    660 /* Get some dirty hacks.  */
    661 #include <symbol-hacks.h>
    662 
    663 /* Move compatibility symbols out of the way by placing them all in a
    664    special section.  */
    665 #ifndef __ASSEMBLER__
    666 # define attribute_compat_text_section \
    667     __attribute__ ((section (".text.compat")))
    668 #else
    669 # define compat_text_section .section ".text.compat", "ax";
    670 #endif
    671 
    672 /* Helper / base  macros for indirect function symbols.  */
    673 #define __ifunc_resolver(type_name, name, expr, init, classifier, ...)	\
    674   classifier inhibit_stack_protector					\
    675   __typeof (type_name) *name##_ifunc (__VA_ARGS__)			\
    676   {									\
    677     init ();								\
    678     __typeof (type_name) *res = expr;					\
    679     return res;								\
    680   }
    681 
    682 #ifdef HAVE_GCC_IFUNC
    683 # define __ifunc_args(type_name, name, expr, init, ...)			\
    684   extern __typeof (type_name) name __attribute__			\
    685 			      ((ifunc (#name "_ifunc")));		\
    686   __ifunc_resolver (type_name, name, expr, init, static, __VA_ARGS__)
    687 
    688 # define __ifunc_args_hidden(type_name, name, expr, init, ...)		\
    689   __ifunc_args (type_name, name, expr, init, __VA_ARGS__)
    690 #else
    691 /* Gcc does not support __attribute__ ((ifunc (...))).  Use the old behaviour
    692    as fallback.  But keep in mind that the debug information for the ifunc
    693    resolver functions is not correct.  It contains the ifunc'ed function as
    694    DW_AT_linkage_name.  E.g. lldb uses this field and an inferior function
    695    call of the ifunc'ed function will fail due to "no matching function for
    696    call to ..." because the ifunc'ed function and the resolver function have
    697    different signatures.  (Gcc support is disabled at least on a ppc64le
    698    Ubuntu 14.04 system.)  */
    699 
    700 # define __ifunc_args(type_name, name, expr, init, ...)			\
    701   extern __typeof (type_name) name;					\
    702   __typeof (type_name) *name##_ifunc (__VA_ARGS__) __asm__ (#name);	\
    703   __ifunc_resolver (type_name, name, expr, init, , __VA_ARGS__)		\
    704  __asm__ (".type " #name ", %gnu_indirect_function");
    705 
    706 # define __ifunc_args_hidden(type_name, name, expr, init, ...)		\
    707   extern __typeof (type_name) __libc_##name;				\
    708   __ifunc (type_name, __libc_##name, expr, __VA_ARGS__, init)		\
    709   strong_alias (__libc_##name, name);
    710 #endif /* !HAVE_GCC_IFUNC  */
    711 
    712 #define __ifunc(type_name, name, expr, arg, init)			\
    713   __ifunc_args (type_name, name, expr, init, arg)
    714 
    715 #define __ifunc_hidden(type_name, name, expr, arg, init)		\
    716   __ifunc_args_hidden (type_name, name, expr, init, arg)
    717 
    718 /* The following macros are used for indirect function symbols in libc.so.
    719    First of all, you need to have the function prototyped somewhere,
    720    say in foo.h:
    721 
    722    int foo (int __bar);
    723 
    724    If you have an implementation for foo which e.g. uses a special hardware
    725    feature which isn't available on all machines where this libc.so will be
    726    used but decidable if available at runtime e.g. via hwcaps, you can provide
    727    two or multiple implementations of foo:
    728 
    729    int __foo_default (int __bar)
    730    {
    731      return __bar;
    732    }
    733 
    734    int __foo_special (int __bar)
    735    {
    736      return __bar;
    737    }
    738 
    739    If your function foo has no libc_hidden_proto (foo) defined for PLT
    740    bypassing, you can use:
    741 
    742    #define INIT_ARCH() unsigned long int hwcap = __GLRO(dl_hwcap);
    743 
    744    libc_ifunc (foo, (hwcap & HWCAP_SPECIAL) ? __foo_special : __foo_default);
    745 
    746    This will define a resolver function for foo which returns __foo_special or
    747    __foo_default depending on your specified expression.  Please note that you
    748    have to define a macro function INIT_ARCH before using libc_ifunc macro as
    749    it is called by the resolver function before evaluating the specified
    750    expression.  In this example it is used to prepare the hwcap variable.
    751    The resolver function is assigned to an ifunc'ed symbol foo.  Calls to foo
    752    from inside or outside of libc.so will be indirected by a PLT call.
    753 
    754    If your function foo has a libc_hidden_proto (foo) defined for PLT bypassing
    755    and calls to foo within libc.so should always go to one specific
    756    implementation of foo e.g. __foo_default then you have to add:
    757 
    758    __hidden_ver1 (__foo_default, __GI_foo, __foo_default);
    759 
    760    or a tweaked definition of libc_hidden_def macro after the __foo_default
    761    function definition.  Calls to foo within libc.so will always go directly to
    762    __foo_default.  Calls to foo from outside libc.so will be indirected by a
    763    PLT call to ifunc'ed symbol foo which you have to define in a separate
    764    compile unit:
    765 
    766    #define foo __redirect_foo
    767    #include <foo.h>
    768    #undef foo
    769 
    770    extern __typeof (__redirect_foo) __foo_default attribute_hidden;
    771    extern __typeof (__redirect_foo) __foo_special attribute_hidden;
    772 
    773    libc_ifunc_redirected (__redirect_foo, foo,
    774 			  (hwcap & HWCAP_SPECIAL)
    775 			  ? __foo_special
    776 			  : __foo_default);
    777 
    778    This will define the ifunc'ed symbol foo like above.  The redirection of foo
    779    in header file is needed to omit an additional definition of __GI_foo which
    780    would end in a linker error while linking libc.so.  You have to specify
    781    __redirect_foo as first parameter which is used within libc_ifunc_redirected
    782    macro in conjunction with typeof to define the ifunc'ed symbol foo.
    783 
    784    If your function foo has a libc_hidden_proto (foo) defined and calls to foo
    785    within or from outside libc.so should go via ifunc'ed symbol, then you have
    786    to use:
    787 
    788    libc_ifunc_hidden (foo, foo,
    789 		      (hwcap & HWCAP_SPECIAL)
    790 		      ? __foo_special
    791 		      : __foo_default);
    792    libc_hidden_def (foo)
    793 
    794    The first parameter foo of libc_ifunc_hidden macro is used in the same way
    795    as for libc_ifunc_redirected macro.  */
    796 
    797 #define libc_ifunc(name, expr) __ifunc (name, name, expr, void, INIT_ARCH)
    798 
    799 #define libc_ifunc_redirected(redirected_name, name, expr)	\
    800   __ifunc (redirected_name, name, expr, void, INIT_ARCH)
    801 
    802 #define libc_ifunc_hidden(redirected_name, name, expr)			\
    803   __ifunc_hidden (redirected_name, name, expr, void, INIT_ARCH)
    804 
    805 /* The body of the function is supposed to use __get_cpu_features
    806    which will, if necessary, initialize the data first.  */
    807 #define libm_ifunc_init()
    808 #define libm_ifunc(name, expr)				\
    809   __ifunc (name, name, expr, void, libm_ifunc_init)
    810 
    811 /* These macros facilitate sharing source files with gnulib.
    812 
    813    They are here instead of sys/cdefs.h because they should not be
    814    used in public header files.
    815 
    816    Their definitions should be kept consistent with the definitions in
    817    gnulib-common.m4, but it is not necessary to cater to old non-GCC
    818    compilers, since they will only be used while building glibc itself.
    819    (Note that _GNUC_PREREQ cannot be used in this file.)  */
    820 
    821 /* Define as a marker that can be attached to declarations that might not
    822     be used.  This helps to reduce warnings, such as from
    823     GCC -Wunused-parameter.  */
    824 #if __GNUC__ >= 3 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7)
    825 # define _GL_UNUSED __attribute__ ((__unused__))
    826 #else
    827 # define _GL_UNUSED
    828 #endif
    829 
    830 /* gcc supports the "unused" attribute on possibly unused labels, and
    831    g++ has since version 4.5.  Note to support C++ as well as C,
    832    _GL_UNUSED_LABEL should be used with a trailing ;  */
    833 #if !defined __cplusplus || __GNUC__ > 4 \
    834     || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5)
    835 # define _GL_UNUSED_LABEL _GL_UNUSED
    836 #else
    837 # define _GL_UNUSED_LABEL
    838 #endif
    839 
    840 /* The __pure__ attribute was added in gcc 2.96.  */
    841 #if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96)
    842 # define _GL_ATTRIBUTE_PURE __attribute__ ((__pure__))
    843 #else
    844 # define _GL_ATTRIBUTE_PURE /* empty */
    845 #endif
    846 
    847 /* The __const__ attribute was added in gcc 2.95.  */
    848 #if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 95)
    849 # define _GL_ATTRIBUTE_CONST __attribute__ ((__const__))
    850 #else
    851 # define _GL_ATTRIBUTE_CONST /* empty */
    852 #endif
    853 
    854 #endif /* !_ISOMAC */
    855 #endif /* libc-symbols.h */