diff options
Diffstat (limited to 'sysdeps/generic')
-rw-r--r-- | sysdeps/generic/bits/libc-tsd.h | 2 | ||||
-rw-r--r-- | sysdeps/generic/dl-sysdep.h | 28 | ||||
-rw-r--r-- | sysdeps/generic/errno.c | 32 | ||||
-rw-r--r-- | sysdeps/generic/ldsodefs.h | 5 | ||||
-rw-r--r-- | sysdeps/generic/start.c | 3 |
5 files changed, 66 insertions, 4 deletions
diff --git a/sysdeps/generic/bits/libc-tsd.h b/sysdeps/generic/bits/libc-tsd.h index 1954b20334..cc2c2c1219 100644 --- a/sysdeps/generic/bits/libc-tsd.h +++ b/sysdeps/generic/bits/libc-tsd.h @@ -51,7 +51,7 @@ We don't define an enum for the possible key values, because the KEYs translate directly into variables by macro magic. */ -#if USE_TLS && HAVE___THREAD +#if USE___THREAD # define __libc_tsd_define(CLASS, KEY) CLASS __thread void *__libc_tsd_##KEY; # define __libc_tsd_address(KEY) (&__libc_tsd_##KEY) diff --git a/sysdeps/generic/dl-sysdep.h b/sysdeps/generic/dl-sysdep.h new file mode 100644 index 0000000000..b39103cbc2 --- /dev/null +++ b/sysdeps/generic/dl-sysdep.h @@ -0,0 +1,28 @@ +/* System-specific settings for dynamic linker code. Generic version. + Copyright (C) 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 + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +/* This macro must be defined to either 0 or 1. + + If 1, then an errno global variable hidden in ld.so will work right with + all the errno-using libc code compiled for ld.so, and there is never a + need to share the errno location with libc. This is appropriate only if + all the libc functions that ld.so uses are called without PLT and always + get the versions linked into ld.so rather than the libc ones. */ + +#define RTLD_PRIVATE_ERRNO 1 diff --git a/sysdeps/generic/errno.c b/sysdeps/generic/errno.c new file mode 100644 index 0000000000..cba5ab9c3b --- /dev/null +++ b/sysdeps/generic/errno.c @@ -0,0 +1,32 @@ +/* Definition of `errno' variable. Canonical version. + Copyright (C) 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 + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#include <errno.h> +#include <tls.h> +#undef errno + +#if USE___THREAD +__thread int errno; +#else +/* This differs from plain `int errno;' in that it doesn't create + a common definition, but a plain symbol that resides in .bss, + which can have an alias. */ +int errno __attribute__ ((section (".bss"))); +strong_alias (errno, _errno) +#endif diff --git a/sysdeps/generic/ldsodefs.h b/sysdeps/generic/ldsodefs.h index c149656446..36582a7463 100644 --- a/sysdeps/generic/ldsodefs.h +++ b/sysdeps/generic/ldsodefs.h @@ -34,6 +34,7 @@ #include <sys/mman.h> #include <link.h> #include <dl-lookupcfg.h> +#include <dl-sysdep.h> #include <bits/libc-lock.h> #include <hp-timing.h> #include <tls.h> @@ -372,6 +373,10 @@ struct rtld_global /* Structure describing the dynamic linker itself. */ EXTERN struct link_map _dl_rtld_map; + +#ifdef _LIBC_REENTRANT + EXTERN void **(*_dl_error_catch_tsd) (void) __attribute__ ((const)); +#endif #ifdef SHARED }; # define __rtld_global_attribute__ diff --git a/sysdeps/generic/start.c b/sysdeps/generic/start.c index cf7efc931a..08f985c482 100644 --- a/sysdeps/generic/start.c +++ b/sysdeps/generic/start.c @@ -11,6 +11,3 @@ int __data_start = 0; #ifdef HAVE_WEAK_SYMBOLS weak_alias (__data_start, data_start) #endif - -volatile int __errno; -strong_alias (__errno, errno) |