summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2007-01-12 14:37:24 +0000
committerJakub Jelinek <jakub@redhat.com>2007-01-12 14:37:24 +0000
commit00e3dec8025c93ccde8ed810657e7f2115ddc8cb (patch)
tree30b8f6bdb08d364b986ae3ec3ec7664c520f0ad9 /include
parentd6220e9ee38c1c9285221b023346201ec5f511b3 (diff)
* nis/nis_table.c (nis_list): If __follow_path fails in the new
code, make sure the nis_freeresult call doesn't crash and that the result is reported correctly. * nis/nis_table.c (nis_list): Handle FOLLOW_PATH | ALL_RESULTS when callback is NULL. * nis/Versions (libnss_nisplus): Add _nss_nisplus_initgroups_dyn@@GLIBC_PRIVATE. * nis/Makefile (libnss_nisplus-routines): Add nisplus-initgroups. * nis/nss_nisplus/nisplus-grp.c (tablename_val, tablename_len, _nss_create_tablename): Rename to... (grp_tablename_val, grp_tablename_len, _nss_grp_create_tablename): ... these. No longer static. (internal_setgrent): Adjust users. (_nss_nisplus_getgrnam_r, _nss_nisplus_getgrgid_r): Likewise. Don't use locking around _nss_grp_create_tablename call. * nis/nss_nisplus/nisplus-initgroups.c: New file.
Diffstat (limited to 'include')
-rw-r--r--include/atomic.h371
-rw-r--r--include/dlfcn.h3
-rw-r--r--include/errno.h2
-rw-r--r--include/features.h2
-rw-r--r--include/libc-symbols.h75
-rw-r--r--include/link.h16
-rw-r--r--include/shlib-compat.h16
-rw-r--r--include/stdio.h1
-rw-r--r--include/tls.h3
9 files changed, 147 insertions, 342 deletions
diff --git a/include/atomic.h b/include/atomic.h
index 2ad8b5fcb7..a1598e3850 100644
--- a/include/atomic.h
+++ b/include/atomic.h
@@ -21,31 +21,6 @@
#ifndef _ATOMIC_H
#define _ATOMIC_H 1
-/* This header defines three types of macros:
-
- - atomic arithmetic and logic operation on memory. They all
- have the prefix "atomic_".
-
- - conditionally atomic operations of the same kinds. These
- always behave identical but can be faster when atomicity
- is not really needed since only one thread has access to
- the memory location. In that case the code is slower in
- the multi-thread case. The interfaces have the prefix
- "catomic_".
-
- - support functions like barriers. They also have the preifx
- "atomic_".
-
- Architectures must provide a few lowlevel macros (the compare
- and exchange definitions). All others are optional. They
- should only be provided if the architecture has specific
- support for the operation.
-
- As <atomic.h> macros are usually heavily nested and often use local
- variables to make sure side-effects are evaluated properly, use for
- macro local variables a per-macro unique prefix. This file uses
- __atgN_ prefix where N is different in each macro. */
-
#include <stdlib.h>
#include <bits/atomic.h>
@@ -55,33 +30,33 @@
and following args. */
#define __atomic_val_bysize(pre, post, mem, ...) \
({ \
- __typeof (*mem) __atg1_result; \
+ __typeof (*mem) __result; \
if (sizeof (*mem) == 1) \
- __atg1_result = pre##_8_##post (mem, __VA_ARGS__); \
+ __result = pre##_8_##post (mem, __VA_ARGS__); \
else if (sizeof (*mem) == 2) \
- __atg1_result = pre##_16_##post (mem, __VA_ARGS__); \
+ __result = pre##_16_##post (mem, __VA_ARGS__); \
else if (sizeof (*mem) == 4) \
- __atg1_result = pre##_32_##post (mem, __VA_ARGS__); \
+ __result = pre##_32_##post (mem, __VA_ARGS__); \
else if (sizeof (*mem) == 8) \
- __atg1_result = pre##_64_##post (mem, __VA_ARGS__); \
+ __result = pre##_64_##post (mem, __VA_ARGS__); \
else \
abort (); \
- __atg1_result; \
+ __result; \
})
#define __atomic_bool_bysize(pre, post, mem, ...) \
({ \
- int __atg2_result; \
+ int __result; \
if (sizeof (*mem) == 1) \
- __atg2_result = pre##_8_##post (mem, __VA_ARGS__); \
+ __result = pre##_8_##post (mem, __VA_ARGS__); \
else if (sizeof (*mem) == 2) \
- __atg2_result = pre##_16_##post (mem, __VA_ARGS__); \
+ __result = pre##_16_##post (mem, __VA_ARGS__); \
else if (sizeof (*mem) == 4) \
- __atg2_result = pre##_32_##post (mem, __VA_ARGS__); \
+ __result = pre##_32_##post (mem, __VA_ARGS__); \
else if (sizeof (*mem) == 8) \
- __atg2_result = pre##_64_##post (mem, __VA_ARGS__); \
+ __result = pre##_64_##post (mem, __VA_ARGS__); \
else \
abort (); \
- __atg2_result; \
+ __result; \
})
@@ -95,29 +70,12 @@
#endif
-#if !defined catomic_compare_and_exchange_val_acq \
- && defined __arch_c_compare_and_exchange_val_32_acq
-# define catomic_compare_and_exchange_val_acq(mem, newval, oldval) \
- __atomic_val_bysize (__arch_c_compare_and_exchange_val,acq, \
- mem, newval, oldval)
-#else
-# define catomic_compare_and_exchange_val_acq(mem, newval, oldval) \
- atomic_compare_and_exchange_val_acq (mem, newval, oldval)
-#endif
-
-
#ifndef atomic_compare_and_exchange_val_rel
# define atomic_compare_and_exchange_val_rel(mem, newval, oldval) \
atomic_compare_and_exchange_val_acq (mem, newval, oldval)
#endif
-#ifndef catomic_compare_and_exchange_val_rel
-# define catomic_compare_and_exchange_val_rel(mem, newval, oldval) \
- atomic_compare_and_exchange_val_acq (mem, newval, oldval)
-#endif
-
-
/* Atomically store NEWVAL in *MEM if *MEM is equal to OLDVAL.
Return zero if *MEM was changed or non-zero if no exchange happened. */
#ifndef atomic_compare_and_exchange_bool_acq
@@ -129,26 +87,8 @@
# define atomic_compare_and_exchange_bool_acq(mem, newval, oldval) \
({ /* Cannot use __oldval here, because macros later in this file might \
call this macro with __oldval argument. */ \
- __typeof (oldval) __atg3_old = (oldval); \
- atomic_compare_and_exchange_val_acq (mem, newval, __atg3_old) \
- != __atg3_old; \
- })
-# endif
-#endif
-
-
-#ifndef catomic_compare_and_exchange_bool_acq
-# ifdef __arch_c_compare_and_exchange_bool_32_acq
-# define catomic_compare_and_exchange_bool_acq(mem, newval, oldval) \
- __atomic_bool_bysize (__arch_c_compare_and_exchange_bool,acq, \
- mem, newval, oldval)
-# else
-# define catomic_compare_and_exchange_bool_acq(mem, newval, oldval) \
- ({ /* Cannot use __oldval here, because macros later in this file might \
- call this macro with __oldval argument. */ \
- __typeof (oldval) __atg4_old = (oldval); \
- catomic_compare_and_exchange_val_acq (mem, newval, __atg4_old) \
- != __atg4_old; \
+ __typeof (oldval) __old = (oldval); \
+ atomic_compare_and_exchange_val_acq (mem, newval, __old) != __old; \
})
# endif
#endif
@@ -160,26 +100,21 @@
#endif
-#ifndef catomic_compare_and_exchange_bool_rel
-# define catomic_compare_and_exchange_bool_rel(mem, newval, oldval) \
- catomic_compare_and_exchange_bool_acq (mem, newval, oldval)
-#endif
-
-
/* Store NEWVALUE in *MEM and return the old value. */
#ifndef atomic_exchange_acq
# define atomic_exchange_acq(mem, newvalue) \
- ({ __typeof (*(mem)) __atg5_oldval; \
- __typeof (mem) __atg5_memp = (mem); \
- __typeof (*(mem)) __atg5_value = (newvalue); \
+ ({ __typeof (*(mem)) __oldval; \
+ __typeof (mem) __memp = (mem); \
+ __typeof (*(mem)) __value = (newvalue); \
\
do \
- __atg5_oldval = *__atg5_memp; \
- while (__builtin_expect \
- (atomic_compare_and_exchange_bool_acq (__atg5_memp, __atg5_value, \
- __atg5_oldval), 0)); \
+ __oldval = *__memp; \
+ while (__builtin_expect (atomic_compare_and_exchange_bool_acq (__memp, \
+ __value, \
+ __oldval),\
+ 0)); \
\
- __atg5_oldval; })
+ __oldval; })
#endif
#ifndef atomic_exchange_rel
@@ -190,124 +125,72 @@
/* Add VALUE to *MEM and return the old value of *MEM. */
#ifndef atomic_exchange_and_add
# define atomic_exchange_and_add(mem, value) \
- ({ __typeof (*(mem)) __atg6_oldval; \
- __typeof (mem) __atg6_memp = (mem); \
- __typeof (*(mem)) __atg6_value = (value); \
+ ({ __typeof (*(mem)) __oldval; \
+ __typeof (mem) __memp = (mem); \
+ __typeof (*(mem)) __value = (value); \
\
do \
- __atg6_oldval = *__atg6_memp; \
- while (__builtin_expect \
- (atomic_compare_and_exchange_bool_acq (__atg6_memp, \
- __atg6_oldval \
- + __atg6_value, \
- __atg6_oldval), 0)); \
+ __oldval = *__memp; \
+ while (__builtin_expect (atomic_compare_and_exchange_bool_acq (__memp, \
+ __oldval \
+ + __value,\
+ __oldval),\
+ 0)); \
\
- __atg6_oldval; })
+ __oldval; })
#endif
-#ifndef catomic_exchange_and_add
-# define catomic_exchange_and_add(mem, value) \
- ({ __typeof (*(mem)) __atg7_oldv; \
- __typeof (mem) __atg7_memp = (mem); \
- __typeof (*(mem)) __atg7_value = (value); \
- \
- do \
- __atg7_oldv = *__atg7_memp; \
- while (__builtin_expect \
- (catomic_compare_and_exchange_bool_acq (__atg7_memp, \
- __atg7_oldv \
- + __atg7_value, \
- __atg7_oldv), 0)); \
- \
- __atg7_oldv; })
-#endif
-
#ifndef atomic_max
# define atomic_max(mem, value) \
do { \
- __typeof (*(mem)) __atg8_oldval; \
- __typeof (mem) __atg8_memp = (mem); \
- __typeof (*(mem)) __atg8_value = (value); \
- do { \
- __atg8_oldval = *__atg8_memp; \
- if (__atg8_oldval >= __atg8_value) \
- break; \
- } while (__builtin_expect \
- (atomic_compare_and_exchange_bool_acq (__atg8_memp, __atg8_value,\
- __atg8_oldval), 0)); \
- } while (0)
-#endif
-
-
-#ifndef catomic_max
-# define catomic_max(mem, value) \
- do { \
- __typeof (*(mem)) __atg9_oldv; \
- __typeof (mem) __atg9_memp = (mem); \
- __typeof (*(mem)) __atg9_value = (value); \
+ __typeof (*(mem)) __oldval; \
+ __typeof (mem) __memp = (mem); \
+ __typeof (*(mem)) __value = (value); \
do { \
- __atg9_oldv = *__atg9_memp; \
- if (__atg9_oldv >= __atg9_value) \
+ __oldval = *__memp; \
+ if (__oldval >= __value) \
break; \
- } while (__builtin_expect \
- (catomic_compare_and_exchange_bool_acq (__atg9_memp, \
- __atg9_value, \
- __atg9_oldv), 0)); \
+ } while (__builtin_expect (atomic_compare_and_exchange_bool_acq (__memp, \
+ __value, \
+ __oldval),\
+ 0)); \
} while (0)
#endif
-
#ifndef atomic_min
# define atomic_min(mem, value) \
do { \
- __typeof (*(mem)) __atg10_oldval; \
- __typeof (mem) __atg10_memp = (mem); \
- __typeof (*(mem)) __atg10_value = (value); \
+ __typeof (*(mem)) __oldval; \
+ __typeof (mem) __memp = (mem); \
+ __typeof (*(mem)) __value = (value); \
do { \
- __atg10_oldval = *__atg10_memp; \
- if (__atg10_oldval <= __atg10_value) \
+ __oldval = *__memp; \
+ if (__oldval <= __value) \
break; \
- } while (__builtin_expect \
- (atomic_compare_and_exchange_bool_acq (__atg10_memp, \
- __atg10_value, \
- __atg10_oldval), 0)); \
+ } while (__builtin_expect (atomic_compare_and_exchange_bool_acq (__memp, \
+ __value, \
+ __oldval),\
+ 0)); \
} while (0)
#endif
-
#ifndef atomic_add
# define atomic_add(mem, value) (void) atomic_exchange_and_add ((mem), (value))
#endif
-#ifndef catomic_add
-# define catomic_add(mem, value) \
- (void) catomic_exchange_and_add ((mem), (value))
-#endif
-
-
#ifndef atomic_increment
# define atomic_increment(mem) atomic_add ((mem), 1)
#endif
-#ifndef catomic_increment
-# define catomic_increment(mem) catomic_add ((mem), 1)
-#endif
-
-
#ifndef atomic_increment_val
# define atomic_increment_val(mem) (atomic_exchange_and_add ((mem), 1) + 1)
#endif
-#ifndef catomic_increment_val
-# define catomic_increment_val(mem) (catomic_exchange_and_add ((mem), 1) + 1)
-#endif
-
-
/* Add one to *MEM and return true iff it's now zero. */
#ifndef atomic_increment_and_test
# define atomic_increment_and_test(mem) \
@@ -320,21 +203,11 @@
#endif
-#ifndef catomic_decrement
-# define catomic_decrement(mem) catomic_add ((mem), -1)
-#endif
-
-
#ifndef atomic_decrement_val
# define atomic_decrement_val(mem) (atomic_exchange_and_add ((mem), -1) - 1)
#endif
-#ifndef catomic_decrement_val
-# define catomic_decrement_val(mem) (catomic_exchange_and_add ((mem), -1) - 1)
-#endif
-
-
/* Subtract 1 from *MEM and return true iff it's now zero. */
#ifndef atomic_decrement_and_test
# define atomic_decrement_and_test(mem) \
@@ -345,34 +218,35 @@
/* Decrement *MEM if it is > 0, and return the old value. */
#ifndef atomic_decrement_if_positive
# define atomic_decrement_if_positive(mem) \
- ({ __typeof (*(mem)) __atg11_oldval; \
- __typeof (mem) __atg11_memp = (mem); \
+ ({ __typeof (*(mem)) __oldval; \
+ __typeof (mem) __memp = (mem); \
\
do \
{ \
- __atg11_oldval = *__atg11_memp; \
- if (__builtin_expect (__atg11_oldval <= 0, 0)) \
+ __oldval = *__memp; \
+ if (__builtin_expect (__oldval <= 0, 0)) \
break; \
} \
- while (__builtin_expect \
- (atomic_compare_and_exchange_bool_acq (__atg11_memp, \
- __atg11_oldval - 1, \
- __atg11_oldval), 0)); \
- __atg11_oldval; })
+ while (__builtin_expect (atomic_compare_and_exchange_bool_acq (__memp, \
+ __oldval \
+ - 1, \
+ __oldval),\
+ 0));\
+ __oldval; })
#endif
#ifndef atomic_add_negative
# define atomic_add_negative(mem, value) \
- ({ __typeof (value) __atg12_value = (value); \
- atomic_exchange_and_add (mem, __atg12_value) < -__atg12_value; })
+ ({ __typeof (value) __aan_value = (value); \
+ atomic_exchange_and_add (mem, __aan_value) < -__aan_value; })
#endif
#ifndef atomic_add_zero
# define atomic_add_zero(mem, value) \
- ({ __typeof (value) __atg13_value = (value); \
- atomic_exchange_and_add (mem, __atg13_value) == -__atg13_value; })
+ ({ __typeof (value) __aaz_value = (value); \
+ atomic_exchange_and_add (mem, __aaz_value) == -__aaz_value; })
#endif
@@ -384,102 +258,55 @@
#ifndef atomic_bit_test_set
# define atomic_bit_test_set(mem, bit) \
- ({ __typeof (*(mem)) __atg14_old; \
- __typeof (mem) __atg14_memp = (mem); \
- __typeof (*(mem)) __atg14_mask = ((__typeof (*(mem))) 1 << (bit)); \
+ ({ __typeof (*(mem)) __oldval; \
+ __typeof (mem) __memp = (mem); \
+ __typeof (*(mem)) __mask = ((__typeof (*(mem))) 1 << (bit)); \
\
do \
- __atg14_old = (*__atg14_memp); \
- while (__builtin_expect \
- (atomic_compare_and_exchange_bool_acq (__atg14_memp, \
- __atg14_old | __atg14_mask,\
- __atg14_old), 0)); \
+ __oldval = (*__memp); \
+ while (__builtin_expect (atomic_compare_and_exchange_bool_acq (__memp, \
+ __oldval \
+ | __mask, \
+ __oldval),\
+ 0)); \
\
- __atg14_old & __atg14_mask; })
+ __oldval & __mask; })
#endif
-/* Atomically *mem &= mask. */
+/* Atomically *mem &= mask and return the old value of *mem. */
#ifndef atomic_and
# define atomic_and(mem, mask) \
- do { \
- __typeof (*(mem)) __atg15_old; \
- __typeof (mem) __atg15_memp = (mem); \
- __typeof (*(mem)) __atg15_mask = (mask); \
- \
- do \
- __atg15_old = (*__atg15_memp); \
- while (__builtin_expect \
- (atomic_compare_and_exchange_bool_acq (__atg15_memp, \
- __atg15_old & __atg15_mask, \
- __atg15_old), 0)); \
- } while (0)
-#endif
-
-/* Atomically *mem &= mask and return the old value of *mem. */
-#ifndef atomic_and_val
-# define atomic_and_val(mem, mask) \
- ({ __typeof (*(mem)) __atg16_old; \
- __typeof (mem) __atg16_memp = (mem); \
- __typeof (*(mem)) __atg16_mask = (mask); \
+ ({ __typeof (*(mem)) __oldval; \
+ __typeof (mem) __memp = (mem); \
+ __typeof (*(mem)) __mask = (mask); \
\
do \
- __atg16_old = (*__atg16_memp); \
- while (__builtin_expect \
- (atomic_compare_and_exchange_bool_acq (__atg16_memp, \
- __atg16_old & __atg16_mask,\
- __atg16_old), 0)); \
+ __oldval = (*__memp); \
+ while (__builtin_expect (atomic_compare_and_exchange_bool_acq (__memp, \
+ __oldval \
+ & __mask, \
+ __oldval),\
+ 0)); \
\
- __atg16_old; })
+ __oldval; })
#endif
/* Atomically *mem |= mask and return the old value of *mem. */
#ifndef atomic_or
# define atomic_or(mem, mask) \
- do { \
- __typeof (*(mem)) __atg17_old; \
- __typeof (mem) __atg17_memp = (mem); \
- __typeof (*(mem)) __atg17_mask = (mask); \
- \
- do \
- __atg17_old = (*__atg17_memp); \
- while (__builtin_expect \
- (atomic_compare_and_exchange_bool_acq (__atg17_memp, \
- __atg17_old | __atg17_mask, \
- __atg17_old), 0)); \
- } while (0)
-#endif
-
-#ifndef catomic_or
-# define catomic_or(mem, mask) \
- do { \
- __typeof (*(mem)) __atg18_old; \
- __typeof (mem) __atg18_memp = (mem); \
- __typeof (*(mem)) __atg18_mask = (mask); \
- \
- do \
- __atg18_old = (*__atg18_memp); \
- while (__builtin_expect \
- (catomic_compare_and_exchange_bool_acq (__atg18_memp, \
- __atg18_old | __atg18_mask,\
- __atg18_old), 0)); \
- } while (0)
-#endif
-
-/* Atomically *mem |= mask and return the old value of *mem. */
-#ifndef atomic_or_val
-# define atomic_or_val(mem, mask) \
- ({ __typeof (*(mem)) __atg19_old; \
- __typeof (mem) __atg19_memp = (mem); \
- __typeof (*(mem)) __atg19_mask = (mask); \
+ ({ __typeof (*(mem)) __oldval; \
+ __typeof (mem) __memp = (mem); \
+ __typeof (*(mem)) __mask = (mask); \
\
do \
- __atg19_old = (*__atg19_memp); \
- while (__builtin_expect \
- (atomic_compare_and_exchange_bool_acq (__atg19_memp, \
- __atg19_old | __atg19_mask,\
- __atg19_old), 0)); \
+ __oldval = (*__memp); \
+ while (__builtin_expect (atomic_compare_and_exchange_bool_acq (__memp, \
+ __oldval \
+ | __mask, \
+ __oldval),\
+ 0)); \
\
- __atg19_old; })
+ __oldval; })
#endif
#ifndef atomic_full_barrier
@@ -497,12 +324,6 @@
#endif
-#ifndef atomic_forced_read
-# define atomic_forced_read(x) \
- ({ __typeof (x) __x; __asm ("" : "=r" (__x) : "0" (x)); __x; })
-#endif
-
-
#ifndef atomic_delay
# define atomic_delay() do { /* nothing */ } while (0)
#endif
diff --git a/include/dlfcn.h b/include/dlfcn.h
index 79c8f7d31b..9144dd2f3f 100644
--- a/include/dlfcn.h
+++ b/include/dlfcn.h
@@ -47,9 +47,6 @@ libc_hidden_proto (_dl_addr)
/* Close an object previously opened by _dl_open. */
extern void _dl_close (void *map) attribute_hidden;
-/* Same as above, but without locking and safety checks for user
- provided map arguments. */
-extern void _dl_close_worker (struct link_map *map) attribute_hidden;
/* Look up NAME in shared object HANDLE (which may be RTLD_DEFAULT or
RTLD_NEXT). WHO is the calling function, for RTLD_NEXT. Returns
diff --git a/include/errno.h b/include/errno.h
index 80c7b6ec13..fe8bca44c5 100644
--- a/include/errno.h
+++ b/include/errno.h
@@ -19,7 +19,7 @@ extern int rtld_errno attribute_hidden;
# else
-# include <tls.h>
+# include <tls.h> /* Defines USE_TLS. */
# if USE___THREAD
# undef errno
diff --git a/include/features.h b/include/features.h
index ad9bbc70ee..1676ad3e58 100644
--- a/include/features.h
+++ b/include/features.h
@@ -49,7 +49,7 @@
The `-ansi' switch to the GNU C compiler defines __STRICT_ANSI__.
If none of these are defined, the default is to have _SVID_SOURCE,
_BSD_SOURCE, and _POSIX_SOURCE set to one and _POSIX_C_SOURCE set to
- 200112L. If more than one of these are defined, they accumulate.
+ 199506L. If more than one of these are defined, they accumulate.
For example __STRICT_ANSI__, _POSIX_SOURCE and _POSIX_C_SOURCE
together give you ISO C, 1003.1, and 1003.2, but nothing else.
diff --git a/include/libc-symbols.h b/include/libc-symbols.h
index a2faeafb32..da46f5e804 100644
--- a/include/libc-symbols.h
+++ b/include/libc-symbols.h
@@ -114,13 +114,6 @@
# define _weak_alias(name, aliasname) \
extern __typeof (name) aliasname __attribute__ ((weak, alias (#name)));
-/* Same as WEAK_ALIAS, but mark symbol as hidden. */
-# define weak_hidden_alias(name, aliasname) \
- _weak_hidden_alias (name, aliasname)
-# define _weak_hidden_alias(name, aliasname) \
- extern __typeof (name) aliasname \
- __attribute__ ((weak, alias (#name), __visibility__ ("hidden")));
-
/* Declare SYMBOL as weak undefined symbol (resolved to 0 if not defined). */
# define weak_extern(symbol) _weak_extern (weak symbol)
# define _weak_extern(expr) _Pragma (#expr)
@@ -128,7 +121,6 @@
# else
# define weak_alias(name, aliasname) strong_alias(name, aliasname)
-# define weak_hidden_alias(name, aliasname) strong_alias(name, aliasname)
# define weak_extern(symbol) /* Nothing. */
# endif
@@ -294,42 +286,27 @@ requires at runtime the shared libraries from the glibc version used \
for linking")
#endif
-/* Declare SYMBOL to be TYPE (`function' or `object') of SIZE bytes
- alias to ORIGINAL, when the assembler supports such declarations
- (such as in ELF).
+/* Declare SYMBOL to be TYPE (`function' or `object') and of SIZE bytes,
+ when the assembler supports such declarations (such as in ELF).
This is only necessary when defining something in assembly, or playing
funny alias games where the size should be other than what the compiler
thinks it is. */
-#define declare_symbol_alias(symbol, original, type, size) \
- declare_symbol_alias_1 (symbol, original, type, size)
+#define declare_symbol(symbol, type, size) \
+ declare_symbol_1 (symbol, type, size)
#ifdef ASM_TYPE_DIRECTIVE_PREFIX
# ifdef __ASSEMBLER__
-# define declare_symbol_alias_1(symbol, original, type, size) \
- strong_alias (original, symbol); \
+# define declare_symbol_1(symbol, type, size) \
.type C_SYMBOL_NAME (symbol), \
- declare_symbol_alias_1_paste (ASM_TYPE_DIRECTIVE_PREFIX, type); \
- .size C_SYMBOL_NAME (symbol), size
-# define declare_symbol_alias_1_paste(a, b) \
- declare_symbol_alias_1_paste_1 (a,b)
-# define declare_symbol_alias_1_paste_1(a,b) a##b
+ declare_symbol_1_paste (ASM_TYPE_DIRECTIVE_PREFIX, type), size
+# define declare_symbol_1_paste(a, b) declare_symbol_1_paste_1 (a,b)
+# define declare_symbol_1_paste_1(a,b) a##b
# else /* Not __ASSEMBLER__. */
-# define declare_symbol_alias_1(symbol, original, type, size) \
- asm (declare_symbol_alias_1_stringify (ASM_GLOBAL_DIRECTIVE) \
- " " __SYMBOL_PREFIX #symbol \
- "\n\t" declare_symbol_alias_1_alias (symbol, original) \
- "\n\t.type " __SYMBOL_PREFIX #symbol ", " \
- declare_symbol_alias_1_stringify (ASM_TYPE_DIRECTIVE_PREFIX) #type \
+# define declare_symbol_1(symbol, type, size) \
+ asm (".type " __SYMBOL_PREFIX #symbol ", " \
+ declare_symbol_1_stringify (ASM_TYPE_DIRECTIVE_PREFIX) #type \
"\n\t.size " __SYMBOL_PREFIX #symbol ", " #size);
-# define declare_symbol_alias_1_stringify(x) \
- declare_symbol_alias_1_stringify_1 (x)
-# define declare_symbol_alias_1_stringify_1(x) #x
-# ifdef HAVE_ASM_SET_DIRECTIVE
-# define declare_symbol_alias_1_alias(symbol, original) \
- ".set " __SYMBOL_PREFIX #symbol ", " __SYMBOL_PREFIX #original
-# else
-# define declare_symbol_alias_1_alias(symbol, original) \
- __SYMBOL_PREFIX #symbol " = " __SYMBOL_PREFIX #original
-# endif /* HAVE_ASM_SET_DIRECTIVE */
+# define declare_symbol_1_stringify(x) declare_symbol_1_stringify_1 (x)
+# define declare_symbol_1_stringify_1(x) #x
# endif /* __ASSEMBLER__ */
#else
# define declare_symbol_1(symbol, type, size) /* Nothing. */
@@ -454,7 +431,8 @@ for linking")
strong_alias(real, name)
#endif
-#if defined SHARED || defined LIBC_NONSHARED
+#if defined HAVE_VISIBILITY_ATTRIBUTE \
+ && (defined SHARED || defined LIBC_NONSHARED)
# define attribute_hidden __attribute__ ((visibility ("hidden")))
#else
# define attribute_hidden
@@ -466,7 +444,11 @@ for linking")
# define attribute_tls_model_ie
#endif
-#define attribute_relro __attribute__ ((section (".data.rel.ro")))
+#ifdef HAVE_Z_RELRO
+# define attribute_relro __attribute__ ((section (".data.rel.ro")))
+#else
+# define attribute_relro
+#endif
/* Handling on non-exported internal names. We have to do this only
for shared code. */
@@ -475,9 +457,14 @@ for linking")
# define INTDEF(name) strong_alias (name, name##_internal)
# define INTVARDEF(name) \
_INTVARDEF (name, name##_internal)
-# define _INTVARDEF(name, aliasname) \
+# if defined HAVE_VISIBILITY_ATTRIBUTE
+# define _INTVARDEF(name, aliasname) \
extern __typeof (name) aliasname __attribute__ ((alias (#name), \
visibility ("hidden")));
+# else
+# define _INTVARDEF(name, aliasname) \
+ extern __typeof (name) aliasname __attribute__ ((alias (#name)));
+# endif
# define INTDEF2(name, newname) strong_alias (name, newname##_internal)
# define INTVARDEF2(name, newname) _INTVARDEF (name, newname##_internal)
#else
@@ -562,10 +549,16 @@ for linking")
versioned_symbol (libc, __real_foo, foo, GLIBC_2_1);
libc_hidden_ver (__real_foo, foo) */
-#if defined SHARED && defined DO_VERSIONING && !defined NO_HIDDEN
+#if defined SHARED && defined DO_VERSIONING \
+ && !defined HAVE_BROKEN_ALIAS_ATTRIBUTE && !defined NO_HIDDEN
# ifndef __ASSEMBLER__
-# define __hidden_proto_hiddenattr(attrs...) \
+# if !defined HAVE_VISIBILITY_ATTRIBUTE \
+ || defined HAVE_BROKEN_VISIBILITY_ATTRIBUTE
+# define __hidden_proto_hiddenattr(attrs...)
+# else
+# define __hidden_proto_hiddenattr(attrs...) \
__attribute__ ((visibility ("hidden"), ##attrs))
+# endif
# define hidden_proto(name, attrs...) \
__hidden_proto (name, __GI_##name, ##attrs)
# define __hidden_proto(name, internal, attrs...) \
diff --git a/include/link.h b/include/link.h
index b45deabf7f..0d6b66100e 100644
--- a/include/link.h
+++ b/include/link.h
@@ -42,9 +42,7 @@ extern unsigned int la_objopen (struct link_map *__map, Lmid_t __lmid,
#include <stddef.h>
#include <bits/linkmap.h>
#include <dl-lookupcfg.h>
-#include <tls.h>
-#include <bits/libc-lock.h>
-#include <rtld-lowlevel.h>
+#include <tls.h> /* Defines USE_TLS. */
/* Some internal data structures of the dynamic linker used in the
@@ -122,7 +120,7 @@ struct link_map
are indexed by DT_ADDRTAGIDX(tagvalue), see <elf.h>. */
ElfW(Dyn) *l_info[DT_NUM + DT_THISPROCNUM + DT_VERSIONTAGNUM
- + DT_EXTRANUM + DT_VALNUM + DT_ADDRNUM];
+ + DT_EXTRANUM + DT_VALNUM + DT_ADDRNUM];
const ElfW(Phdr) *l_phdr; /* Pointer to program header table in core. */
ElfW(Addr) l_entry; /* Entry point location. */
ElfW(Half) l_phnum; /* Number of program header entries. */
@@ -220,8 +218,6 @@ struct link_map
/* This is an array defining the lookup scope for this link map.
There are initially at most three different scope lists. */
struct r_scope_elem **l_scope;
- /* We need to protect using the SCOPEREC. */
- __rtld_mrlock_define (, l_scope_lock)
/* A similar array, this time only with the local scope. This is
used occasionally. */
@@ -261,6 +257,7 @@ struct link_map
const ElfW(Sym) *ret;
} l_lookup_cache;
+#ifdef USE_TLS
/* Thread-local storage related info. */
/* Start of the initialization image. */
@@ -273,13 +270,14 @@ struct link_map
size_t l_tls_align;
/* Offset of first byte module alignment. */
size_t l_tls_firstbyte_offset;
-#ifndef NO_TLS_OFFSET
-# define NO_TLS_OFFSET 0
-#endif
+# ifndef NO_TLS_OFFSET
+# define NO_TLS_OFFSET 0
+# endif
/* For objects present at startup time: offset in the static TLS block. */
ptrdiff_t l_tls_offset;
/* Index of the module in the dtv array. */
size_t l_tls_modid;
+#endif
/* Information used to change permission after the relocations are
done. */
diff --git a/include/shlib-compat.h b/include/shlib-compat.h
index 79246dff25..1e6d1782d9 100644
--- a/include/shlib-compat.h
+++ b/include/shlib-compat.h
@@ -1,5 +1,5 @@
/* Macros for managing ABI-compatibility definitions using ELF symbol versions.
- Copyright (C) 2000, 2002, 2006 Free Software Foundation, Inc.
+ Copyright (C) 2000, 2002 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -44,8 +44,6 @@
in the GLIBC_2.0 version and obsoleted in the GLIBC_2.2 version. */
# define SHLIB_COMPAT(lib, introduced, obsoleted) \
- _SHLIB_COMPAT (lib, introduced, obsoleted)
-# define _SHLIB_COMPAT(lib, introduced, obsoleted) \
((IS_IN_##lib - 0) \
&& (!(ABI_##lib##_##obsoleted - 0) \
|| ((ABI_##lib##_##introduced - 0) < (ABI_##lib##_##obsoleted - 0))))
@@ -64,17 +62,13 @@
shlib-versions if that is newer. */
# define versioned_symbol(lib, local, symbol, version) \
- versioned_symbol_1 (lib, local, symbol, version)
-# define versioned_symbol_1(lib, local, symbol, version) \
- versioned_symbol_2 (local, symbol, VERSION_##lib##_##version)
-# define versioned_symbol_2(local, symbol, name) \
+ versioned_symbol_1 (local, symbol, VERSION_##lib##_##version)
+# define versioned_symbol_1(local, symbol, name) \
default_symbol_version (local, symbol, name)
# define compat_symbol(lib, local, symbol, version) \
- compat_symbol_1 (lib, local, symbol, version)
-# define compat_symbol_1(lib, local, symbol, version) \
- compat_symbol_2 (local, symbol, VERSION_##lib##_##version)
-# define compat_symbol_2(local, symbol, name) \
+ compat_symbol_1 (local, symbol, VERSION_##lib##_##version)
+# define compat_symbol_1(local, symbol, name) \
symbol_version (local, symbol, name)
#else
diff --git a/include/stdio.h b/include/stdio.h
index b293b8f1c7..e040380d79 100644
--- a/include/stdio.h
+++ b/include/stdio.h
@@ -131,6 +131,7 @@ libc_hidden_proto (__vsnprintf_chk)
libc_hidden_proto (__vfprintf_chk)
# if !defined NOT_IN_libc && defined SHARED && defined DO_VERSIONING \
+ && defined HAVE_VISIBILITY_ATTRIBUTE && !defined HAVE_BROKEN_ALIAS_ATTRIBUTE\
&& !defined NO_HIDDEN
/* Special gcc builtins. */
extern size_t __builtin_fwrite (const void *, size_t, size_t, void *)
diff --git a/include/tls.h b/include/tls.h
index 1642456a73..ffd3e4e70c 100644
--- a/include/tls.h
+++ b/include/tls.h
@@ -5,7 +5,8 @@
#include_next <tls.h>
-#if HAVE___THREAD && (!defined NOT_IN_libc || defined IS_IN_libpthread)
+#if USE_TLS && HAVE___THREAD \
+ && (!defined NOT_IN_libc || defined IS_IN_libpthread)
# define USE___THREAD 1