diff options
-rw-r--r-- | elf/dl-close.c | 2 | ||||
-rw-r--r-- | elf/dl-load.c | 2 | ||||
-rw-r--r-- | elf/rtld.c | 37 | ||||
-rw-r--r-- | include/errno.h | 6 | ||||
-rw-r--r-- | linuxthreads/sysdeps/pthread/errno-loc.c | 4 | ||||
-rw-r--r-- | sysdeps/generic/errno-loc.c | 4 | ||||
-rw-r--r-- | sysdeps/sparc/fpu/bits/mathinline.h | 24 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/i386/setresgid.c | 4 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/i386/setresuid.c | 4 |
9 files changed, 50 insertions, 37 deletions
diff --git a/elf/dl-close.c b/elf/dl-close.c index 4f015fd6df..c823b17642 100644 --- a/elf/dl-close.c +++ b/elf/dl-close.c @@ -237,7 +237,7 @@ _dl_close (void *_map) struct link_map *rl = depmap->l_initfini[k]; if (rl->l_idx < nopencount - & list[rl->l_idx] == rl) + && list[rl->l_idx] == rl) { assert (new_opencount[rl->l_idx] > 0); if (--new_opencount[rl->l_idx] == 0) diff --git a/elf/dl-load.c b/elf/dl-load.c index 83d46f04ee..27f6e3f641 100644 --- a/elf/dl-load.c +++ b/elf/dl-load.c @@ -909,7 +909,9 @@ _dl_map_object_from_fd (const char *name, int fd, struct filebuf *fbp, l = _dl_new_object (realname, name, l_type, loader, mode, nsid); if (__builtin_expect (l == NULL, 0)) { +#ifdef SHARED fail_new: +#endif errstring = N_("cannot create shared object descriptor"); goto call_lose_errno; } diff --git a/elf/rtld.c b/elf/rtld.c index 2039a77e2e..4adbb437bf 100644 --- a/elf/rtld.c +++ b/elf/rtld.c @@ -537,7 +537,7 @@ _dl_start (void *arg) # define ELF_MACHINE_START_ADDRESS(map, start) (start) #endif - return ELF_MACHINE_START_ADDRESS (GL(dl_loaded), entry); + return ELF_MACHINE_START_ADDRESS (GL(dl_ns)[LM_ID_BASE]._ns_loaded, entry); } } @@ -1090,32 +1090,36 @@ of this helper program; chances are you did not intend to run this program.\n\ #if defined(__i386__) /* Force non-TLS libraries for glibc 2.0 binaries or if a buggy binary references non-TLS errno or h_errno. */ - if (__builtin_expect (GL(dl_loaded)->l_info[DT_NUM + DT_THISPROCNUM + DT_VERSIONTAGIDX (DT_VERNEED)] == NULL, 0) - && GL(dl_loaded)->l_info[DT_DEBUG]) + if (__builtin_expect (main_map->l_info[DT_NUM + DT_THISPROCNUM + + DT_VERSIONTAGIDX (DT_VERNEED)] + == NULL, 0) + && main_map->l_info[DT_DEBUG]) GLRO(dl_osversion) = 0x20205; else if ((__builtin_expect (mode, normal) != normal - || GL(dl_loaded)->l_info [ADDRIDX (DT_GNU_LIBLIST)] == NULL) + || main_map->l_info[ADDRIDX (DT_GNU_LIBLIST)] == NULL) /* Only binaries have DT_DEBUG dynamic tags... */ - && GL(dl_loaded)->l_info[DT_DEBUG]) + && main_map->l_info[DT_DEBUG]) { /* Workaround for buggy binaries. This doesn't handle buggy libraries. */ bool buggy = false; - const ElfW(Sym) *symtab = (const void *) D_PTR (GL(dl_loaded), l_info[DT_SYMTAB]); - const char *strtab = (const void *) D_PTR (GL(dl_loaded), l_info[DT_STRTAB]); + const ElfW(Sym) *symtab = (const void *) D_PTR (main_map, + l_info[DT_SYMTAB]); + const char *strtab = (const void *) D_PTR (main_map, + l_info[DT_STRTAB]); Elf_Symndx symidx; - for (symidx = GL(dl_loaded)->l_buckets[0x6c994f % GL(dl_loaded)->l_nbuckets]; + for (symidx = main_map->l_buckets[0x6c994f % main_map->l_nbuckets]; symidx != STN_UNDEF; - symidx = GL(dl_loaded)->l_chain[symidx]) + symidx = main_map->l_chain[symidx]) { if (__builtin_expect (strcmp (strtab + symtab[symidx].st_name, "errno") == 0, 0) && ELFW(ST_TYPE) (symtab[symidx].st_info) != STT_TLS) buggy = true; } - for (symidx = GL(dl_loaded)->l_buckets[0xe5c992f % GL(dl_loaded)->l_nbuckets]; + for (symidx = main_map->l_buckets[0xe5c992f % main_map->l_nbuckets]; symidx != STN_UNDEF; - symidx = GL(dl_loaded)->l_chain[symidx]) + symidx = main_map->l_chain[symidx]) { if (__builtin_expect (strcmp (strtab + symtab[symidx].st_name, "h_errno") == 0, 0) @@ -1315,8 +1319,11 @@ ERROR: ld.so: object '%s' from %s cannot be preloaded: ignored.\n", */ #define LIB_NOVERSION "/lib/libNoVersion.so.1" - if (__builtin_expect (GL(dl_loaded)->l_info[DT_NUM + DT_THISPROCNUM + DT_VERSIONTAGIDX (DT_VERNEED)] == NULL, 0) - && (GL(dl_loaded)->l_info[DT_DEBUG] || !(GLRO(dl_debug_mask) & DL_DEBUG_PRELINK))) + if (__builtin_expect (main_map->l_info[DT_NUM + DT_THISPROCNUM + + DT_VERSIONTAGIDX (DT_VERNEED)] + == NULL, 0) + && (main_map->l_info[DT_DEBUG] + || !(GLRO(dl_debug_mask) & DL_DEBUG_PRELINK))) { struct stat test_st; int test_fd; @@ -1343,8 +1350,8 @@ ERROR: ld.so: object '%s' from %s cannot be preloaded: ignored.\n", if (can_load != 0) { struct link_map *new_map; - new_map = _dl_map_object (GL(dl_loaded), LIB_NOVERSION, - 1, lt_library, 0, 0); + new_map = _dl_map_object (main_map, LIB_NOVERSION, + 1, lt_library, 0, 0, LM_ID_BASE); if (++new_map->l_opencount == 1) { /* It is no duplicate. */ ++npreloads; diff --git a/include/errno.h b/include/errno.h index 13d17f9c0e..d9f95aa982 100644 --- a/include/errno.h +++ b/include/errno.h @@ -36,7 +36,11 @@ extern __thread int errno attribute_tls_model_ie; # define __set_errno(val) (errno = (val)) # ifndef __ASSEMBLER__ -extern int *__errno_location (void) __THROW __attribute__ ((__const__)); +extern int *__errno_location (void) __THROW __attribute__ ((__const__)) +# ifdef RTLD_PRIVATE_ERRNO + attribute_hidden +# endif +; libc_hidden_proto (__errno_location) # endif diff --git a/linuxthreads/sysdeps/pthread/errno-loc.c b/linuxthreads/sysdeps/pthread/errno-loc.c index d3e49b7211..0a8f0f9076 100644 --- a/linuxthreads/sysdeps/pthread/errno-loc.c +++ b/linuxthreads/sysdeps/pthread/errno-loc.c @@ -1,6 +1,6 @@ /* MT support function to get address of `errno' variable, linuxthreads version. - Copyright (C) 1996, 1998, 2002, 2003 Free Software Foundation, Inc. + Copyright (C) 1996, 1998, 2002, 2003, 2004 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 @@ -23,7 +23,7 @@ #include <linuxthreads/internals.h> #include <sysdep-cancel.h> -#if ! USE___THREAD +#if ! USE___THREAD && !RTLD_PRIVATE_ERRNO #undef errno extern int errno; #endif diff --git a/sysdeps/generic/errno-loc.c b/sysdeps/generic/errno-loc.c index fd16103b11..633590f4f9 100644 --- a/sysdeps/generic/errno-loc.c +++ b/sysdeps/generic/errno-loc.c @@ -1,6 +1,6 @@ /* MT support function to get address of `errno' variable, non-threaded version. - Copyright (C) 1996, 1998, 2002 Free Software Foundation, Inc. + Copyright (C) 1996, 1998, 2002, 2004 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 @@ -21,7 +21,7 @@ #include <errno.h> #include <tls.h> -#if ! USE___THREAD +#if ! USE___THREAD && !RTLD_PRIVATE_ERRNO #undef errno extern int errno; #endif diff --git a/sysdeps/sparc/fpu/bits/mathinline.h b/sysdeps/sparc/fpu/bits/mathinline.h index 2b578d04cd..7add493660 100644 --- a/sysdeps/sparc/fpu/bits/mathinline.h +++ b/sysdeps/sparc/fpu/bits/mathinline.h @@ -112,7 +112,7 @@ /* Test for negative number. Used in the signbit() macro. */ __MATH_INLINE int -__signbitf (float __x) __THROW +__NTH (__signbitf (float __x)) { __extension__ union { float __f; int __i; } __u = { __f: __x }; return __u.__i < 0; @@ -121,14 +121,14 @@ __signbitf (float __x) __THROW # if __WORDSIZE == 32 __MATH_INLINE int -__signbit (double __x) __THROW +__NTH (__signbit (double __x)) { __extension__ union { double __d; int __i[2]; } __u = { __d: __x }; return __u.__i[0] < 0; } __MATH_INLINE int -__signbitl (long double __x) __THROW +__NTH (__signbitl (long double __x)) { return __signbit ((double)__x); } @@ -136,14 +136,14 @@ __signbitl (long double __x) __THROW # else /* sparc64 */ __MATH_INLINE int -__signbit (double __x) __THROW +__NTH (__signbit (double __x)) { __extension__ union { double __d; long int __i; } __u = { __d: __x }; return __u.__i < 0; } __MATH_INLINE int -__signbitl (long double __x) __THROW +__NTH (__signbitl (long double __x)) { __extension__ union { long double __l; long int __i[2]; } __u = { __l: __x }; return __u.__i[0] < 0; @@ -156,7 +156,7 @@ __signbitl (long double __x) __THROW # if !defined __NO_MATH_INLINES && !__GNUC_PREREQ (3, 2) __MATH_INLINE double -sqrt (double __x) __THROW +__NTH (sqrt (double __x)) { register double __r; __asm ("fsqrtd %1,%0" : "=f" (__r) : "f" (__x)); @@ -164,7 +164,7 @@ sqrt (double __x) __THROW } __MATH_INLINE float -sqrtf (float __x) __THROW +__NTH (sqrtf (float __x)) { register float __r; __asm ("fsqrts %1,%0" : "=f" (__r) : "f" (__x)); @@ -173,7 +173,7 @@ sqrtf (float __x) __THROW # if __WORDSIZE == 64 __MATH_INLINE long double -sqrtl (long double __x) __THROW +__NTH (sqrtl (long double __x)) { long double __r; extern void _Qp_sqrt (long double *, __const__ long double *); @@ -219,16 +219,16 @@ __ieee754_sqrtl (long double __x) # ifndef __NO_MATH_INLINES -__MATH_INLINE double fdim (double __x, double __y) __THROW; +__MATH_INLINE double __NTH (fdim (double __x, double __y)); __MATH_INLINE double -fdim (double __x, double __y) __THROW +__NTH (fdim (double __x, double __y)) { return __x <= __y ? 0 : __x - __y; } -__MATH_INLINE float fdimf (float __x, float __y) __THROW; +__MATH_INLINE float __NTH (fdimf (float __x, float __y)); __MATH_INLINE float -fdimf (float __x, float __y) __THROW +__NTH (fdimf (float __x, float __y)) { return __x <= __y ? 0 : __x - __y; } diff --git a/sysdeps/unix/sysv/linux/i386/setresgid.c b/sysdeps/unix/sysv/linux/i386/setresgid.c index ee782e49f3..614e2c256d 100644 --- a/sysdeps/unix/sysv/linux/i386/setresgid.c +++ b/sysdeps/unix/sysv/linux/i386/setresgid.c @@ -28,7 +28,7 @@ #include <pthread-functions.h> -#ifdef __NR_setresgid +#if defined __NR_setresgid || defined __NR_setresgid32 # ifdef __NR_setresgid32 # if __ASSUME_32BITUIDS == 0 @@ -43,7 +43,7 @@ __setresgid (gid_t rgid, gid_t egid, gid_t sgid) { int result; -# if __ASSUME_32BITUIDS > 0 +# if __ASSUME_32BITUIDS > 0 || !defined __NR_setresgid result = INLINE_SYSCALL (setresgid32, 3, rgid, egid, sgid); # else # ifdef __NR_setresgid32 diff --git a/sysdeps/unix/sysv/linux/i386/setresuid.c b/sysdeps/unix/sysv/linux/i386/setresuid.c index 66e5a1c0c1..4d735ca0f9 100644 --- a/sysdeps/unix/sysv/linux/i386/setresuid.c +++ b/sysdeps/unix/sysv/linux/i386/setresuid.c @@ -28,7 +28,7 @@ #include <pthread-functions.h> -#ifdef __NR_setresuid +#if defined __NR_setresuid || defined __NR_setresuid32 # ifdef __NR_setresuid32 # if __ASSUME_32BITUIDS == 0 @@ -43,7 +43,7 @@ __setresuid (uid_t ruid, uid_t euid, uid_t suid) { int result; -# if __ASSUME_32BITUIDS > 0 +# if __ASSUME_32BITUIDS > 0 || !defined __NR_setresuid result = INLINE_SYSCALL (setresuid32, 3, ruid, euid, suid); # else # ifdef __NR_setresuid32 |