This commit is contained in:
Jakub Jelinek 2004-10-14 09:57:42 +00:00
parent 9869e6ec91
commit 82496aab64
9 changed files with 50 additions and 37 deletions

View File

@ -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)

View File

@ -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;
}

View File

@ -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;

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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;
}

View File

@ -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

View File

@ -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