1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-07-30 22:43:12 +03:00

* elf/dl-misc.c: Include <sysdep.h>.

(_dl_debug_vdprintf): Only take dl_load_lock if not _dl_starting_up.

	* sysdeps/generic/ldsodefs.h (_dl_starting_up): Declare it here.
	* sysdeps/unix/sysv/linux/init-first.c: Not here.
	* sysdeps/powerpc/elf/libc-start.c: Or here.
	* sysdeps/unix/sysv/aix/libc-start.c: Or here.
	* sysdeps/unix/sysv/aix/start-libc.c: Or here.
	* sysdeps/unix/sysv/aix/init-first.c: Or here.
	* sysdeps/generic/libc-start.c: Or here.
	* sysdeps/unix/sysv/linux/init-first.c (init): Protect _dl_starting_up
	access with [! SHARED].
	* sysdeps/unix/sysv/aix/init-first.c (init): Likewise.
This commit is contained in:
Roland McGrath
2002-10-24 19:14:59 +00:00
parent 369b849f1a
commit 5bbcba0db5
9 changed files with 39 additions and 20 deletions

View File

@ -30,6 +30,7 @@
#include <sys/param.h>
#include <sys/stat.h>
#include <sys/uio.h>
#include <sysdep.h>
#include <stdio-common/_itoa.h>
#include <bits/libc-lock.h>
@ -81,7 +82,7 @@ _dl_sysdep_read_whole_file (const char *file, size_t *sizep, int prot)
}
/* Bare-bone printf implementation. This function only knows about
/* Bare-bones printf implementation. This function only knows about
the formats and flags needed and can handle only up to 64 stripes in
the output. */
static void
@ -250,10 +251,17 @@ _dl_debug_vdprintf (int fd, int tag_p, const char *fmt, va_list arg)
INTERNAL_SYSCALL (writev, 3, fd, iov, niov);
#elif RTLD_PRIVATE_ERRNO
/* We have to take this lock just to be sure we don't clobber the private
errno when it's being used by another thread that cares about it. */
__libc_lock_lock_recursive (GL(dl_load_lock));
__writev (fd, iov, niov);
__libc_lock_unlock_recursive (GL(dl_load_lock));
errno when it's being used by another thread that cares about it.
Yet we must be sure not to try calling the lock functions before
the thread library is fully initialized. */
if (__builtin_expect (INTUSE (_dl_starting_up), 0))
__writev (fd, iov, niov);
else
{
__libc_lock_lock_recursive (GL(dl_load_lock));
__writev (fd, iov, niov);
__libc_lock_unlock_recursive (GL(dl_load_lock));
}
#else
__writev (fd, iov, niov);
#endif