summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog26
-rw-r--r--csu/Versions6
-rw-r--r--inet/herrno.c13
-rw-r--r--resolv/Versions11
-rw-r--r--resolv/res_libc.c18
-rw-r--r--sysdeps/generic/errno.c11
6 files changed, 77 insertions, 8 deletions
diff --git a/ChangeLog b/ChangeLog
index 6a643229a9..1f6afc8ecb 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,31 @@
2002-11-14 Roland McGrath <roland@redhat.com>
+ * sysdeps/generic/errno.c [! USE___THREAD]
+ [HAVE_ELF && SHARED && DO_VERSIONING] (errno, _errno): Declare these
+ with compat_symbol so they are not link-time visible.
+ [! USE___THREAD] (__libc_errno): New alias for errno.
+ * csu/Versions [!(USE_TLS && HAVE___THREAD)] (libc: GLIBC_PRIVATE):
+ Add __libc_errno here.
+ * inet/herrno.c [USE___THREAD]: Use this conditional
+ in place of [USE_TLS && HAVE___THREAD].
+ [! USE___THREAD] [HAVE_ELF && SHARED && DO_VERSIONING]
+ (h_errno, _h_errno): Declare these with compat_symbol so they are not
+ link-time visible.
+ [! USE___THREAD] (__libc_h_errno): New alias for h_errno.
+ * resolv/res_libc.c [! USE___THREAD]
+ [HAVE_ELF && SHARED && DO_VERSIONING] (_res): Likewise.
+ (_res): Use __attribute__ ((section (".bss"))) so we can have an alias.
+ (__libc_res): Define as alias for _res.
+ * resolv/Versions [!(USE_TLS && HAVE___THREAD)] (libc: GLIBC_PRIVATE):
+ Add __libc_h_errno and __libc_res here.
+
+2002-11-14 Jakub Jelinek <jakub@redhat.com>
+
+ * csu/Versions (errno): Move STT_TLS symbol to GLIBC_PRIVATE for now.
+ * resolv/Versions (h_errno, _res): Likewise.
+
+2002-11-14 Roland McGrath <roland@redhat.com>
+
* Makerules (%.dynsym): Remove $(objpfx) from target and dep.
(%.symlist): Likewise.
diff --git a/csu/Versions b/csu/Versions
index f0dfe91ca6..bd82a96149 100644
--- a/csu/Versions
+++ b/csu/Versions
@@ -17,10 +17,14 @@ libc {
# New special glibc functions.
gnu_get_libc_release; gnu_get_libc_version;
}
- GLIBC_2.3 {
+ GLIBC_PRIVATE {
%if USE_TLS && HAVE___THREAD
# This version is for the TLS symbol, GLIBC_2.0 is the old object symbol.
errno;
+%else
+ # This internal alias is solely to give libpthread access
+ # to the variable that is not directly user-visible at link time.
+ __libc_errno;
%endif
}
}
diff --git a/inet/herrno.c b/inet/herrno.c
index 406e91ec4b..f0ee81b804 100644
--- a/inet/herrno.c
+++ b/inet/herrno.c
@@ -25,7 +25,7 @@
/* We need to have the error status variable of the resolver
accessible in the libc. */
-#if USE_TLS && HAVE___THREAD
+#if USE___THREAD
__thread int h_errno;
extern __thread int __libc_h_errno __attribute__ ((alias ("h_errno")))
attribute_hidden;
@@ -33,6 +33,17 @@ extern __thread int __libc_h_errno __attribute__ ((alias ("h_errno")))
#else
int h_errno = 0;
weak_alias (h_errno, _h_errno)
+
+/* This alias is needed by libpthread. */
+strong_alias (h_errno, __libc_h_errno)
+
+/* We declare these with compat_symbol so that they are not
+ visible at link time. Programs must use the accessor functions. */
+# if defined HAVE_ELF && defined SHARED && defined DO_VERSIONING
+# include <shlib-compat.h>
+compat_symbol (libc, h_errno, h_errno, GLIBC_2_0);
+compat_symbol (libc, _h_errno, _h_errno, GLIBC_2_0);
+# endif
#endif
/* When threaded, h_errno may be a per-thread variable. */
diff --git a/resolv/Versions b/resolv/Versions
index 09dca6aa2a..238d579d8c 100644
--- a/resolv/Versions
+++ b/resolv/Versions
@@ -29,15 +29,18 @@ libc {
# r*
__res_state; __res_init; __res_nclose; __res_ninit; _res_hconf;
}
- GLIBC_2.3 {
+ GLIBC_PRIVATE {
+ __gai_sigqueue;
+
%if USE_TLS && HAVE___THREAD
# This version is for the TLS symbol, GLIBC_2.0 is the old object symbol.
h_errno; _res;
+%else
+ # These internal aliases are solely to give libpthread access
+ # to the variables that are not directly user-visible.
+ __libc_h_errno; __libc_res;
%endif
}
- GLIBC_PRIVATE {
- __gai_sigqueue;
- }
}
libresolv {
diff --git a/resolv/res_libc.c b/resolv/res_libc.c
index 60f7febf05..b1132b0ffd 100644
--- a/resolv/res_libc.c
+++ b/resolv/res_libc.c
@@ -31,8 +31,22 @@ extern __thread struct __res_state __libc_res __attribute__ ((alias ("_res")))
attribute_hidden;
# define _res __libc_res
#else
-/* The resolver state for use by single-threaded programs. */
-struct __res_state _res;
+/* The resolver state for use by single-threaded programs.
+
+ This differs from a plain uninitialized definition in that it doesn't
+ create a common definition, but a plain symbol that resides in .bss,
+ which can have an alias. */
+struct __res_state _res __attribute__ ((section (".bss")));
+
+/* This alias is needed by libpthread. */
+strong_alias (_res, __libc_res)
+
+/* We declare this with compat_symbol so that it's not
+ visible at link time. Programs must use the accessor functions. */
+# if defined HAVE_ELF && defined SHARED && defined DO_VERSIONING
+# include <shlib-compat.h>
+compat_symbol (libc, _res, _res, GLIBC_2_0);
+# endif
#endif
/* This function is used to access the resolver state in
diff --git a/sysdeps/generic/errno.c b/sysdeps/generic/errno.c
index e33c6b88ad..45c9639095 100644
--- a/sysdeps/generic/errno.c
+++ b/sysdeps/generic/errno.c
@@ -31,4 +31,15 @@ extern __thread int __libc_errno __attribute__ ((alias ("errno")))
which can have an alias. */
int errno __attribute__ ((section (".bss")));
strong_alias (errno, _errno)
+
+/* This alias is needed by libpthread. */
+strong_alias (errno, __libc_errno)
+
+/* We declare these with compat_symbol so that they are not
+ visible at link time. Programs must use the accessor functions. */
+# if defined HAVE_ELF && defined SHARED && defined DO_VERSIONING
+# include <shlib-compat.h>
+compat_symbol (libc, errno, errno, GLIBC_2_0);
+compat_symbol (libc, _errno, _errno, GLIBC_2_0);
+# endif
#endif