1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-07-29 11:41:21 +03:00
2002-06-17  Jakub Jelinek  <jakub@redhat.com>

	* elf/dl-lookup.c (_dl_debug_bindings): Use type_class 4 for TLS
	lookups.
	* elf/rtld.c (dl_main): Move TLS setup code before LD_TRACE_PRELINKING
	code.  Print TLS modid and offset for modules containing PT_TLS
	segments.

2002-06-09  Jakub Jelinek  <jakub@redhat.com>

	* sysdeps/unix/sysv/linux/i386/dl-brk.c: Move...
	* sysdeps/unix/sysv/linux/dl-brk.c: ...here.
	* sysdeps/unix/sysv/linux/i386/dl-sbrk.c: Move...
	* sysdeps/unix/sysv/linux/dl-sbrk.c: ...here.

2002-06-07  Jakub Jelinek  <jakub@redhat.com>

	* nss/getXXbyYY_r.c (NEW, NEW1): Define.
	(NEW (REENTRANT_NAME)): Strong alias to INTERNAL (REENTRANT_NAME).
	(REENTRANT_NAME@@GLIBC_2.1.2): Use NEW (REENTRANT_NAME).
	* nss/getXXent_r.c (NEW, NEW1): Define.
	(NEW (REENTRANT_GETNAME)): Strong alias to
	INTERNAL (REENTRANT_GETNAME).
	(REENTRANT_GETNAME@@GLIBC_2.1.2): Use NEW (REENTRANT_GETNAME).

2002-06-21  Ulrich Drepper  <drepper@redhat.com>

	* libio/fileops.c (_IO_file_setbuf_mmap): New function.
	(_IO_file_jumps_mmap): Use it.
	* libio/iosetvbuf.c: Don't call _IO_WSETBUF.
	* libio/libioP.h: Remove _IO_wdefault_setbuf and
	_IO_wdefault_setbuf_internal prorotypes.  Add _IO_file_setbuf_mmap
	prototype.
	* libio/wfileops.c (_IO_wfile_setbuf): Removed.
	(_IO_wfile_jumps_mmap): Don't use it anymore.
	* libio/wgenops.c (_IO_wdefault_setbuf): Removed.
	* libio/memstream.c (_IO_wmem_jumps): Use _IO_default_setbuf not
	_IO_wdefault_setbuf.
	* libio/vswprintf.c (_IO_wstrn_jumps): Likewise.
	* libio/wstrops.c (_IO_wstr_jumps): Likewise.
	* stdio-common/vfprintf.c (_IO_helper_jumps): Likewise.

2002-06-05  Jakub Jelinek  <jakub@redhat.com>

	* libio/Makefile (tests): Add tst-mmap-setvbuf.
	* libio/tst-mmap-setvbuf.c: New test.
This commit is contained in:
Ulrich Drepper
2002-06-22 05:24:45 +00:00
parent 90f0056f74
commit bff334e090
17 changed files with 269 additions and 134 deletions

View File

@ -1006,6 +1006,76 @@ of this helper program; chances are you did not intend to run this program.\n\
_dl_receive_error (print_missing_version, version_check_doit, &args);
}
#ifdef USE_TLS
/* Now it is time to determine the layout of the static TLS block
and allocate it for the initial thread. Note that we always
allocate the static block, we never defer it even if no
DF_STATIC_TLS bit is set. The reason is that we know glibc will
use the static model. First add the dynamic linker to the list
if it also uses TLS. */
if (GL(dl_rtld_map).l_tls_blocksize != 0)
/* Assign a module ID. */
GL(dl_rtld_map).l_tls_modid = _dl_next_tls_modid ();
# ifndef SHARED
/* If dynamic loading of modules with TLS is impossible we do not
have to initialize any of the TLS functionality unless any of the
initial modules uses TLS. */
if (GL(dl_tls_max_dtv_idx) > 0)
# endif
{
struct link_map *l;
size_t nelem;
struct dtv_slotinfo *slotinfo;
/* Number of elements in the static TLS block. */
GL(dl_tls_static_nelem) = GL(dl_tls_max_dtv_idx);
/* Allocate the array which contains the information about the
dtv slots. We allocate a few entries more than needed to
avoid the need for reallocation. */
nelem = GL(dl_tls_max_dtv_idx) + 1 + TLS_SLOTINFO_SURPLUS;
/* Allocate. */
GL(dl_tls_dtv_slotinfo_list) = (struct dtv_slotinfo_list *)
malloc (sizeof (struct dtv_slotinfo_list)
+ nelem * sizeof (struct dtv_slotinfo));
/* No need to check the return value. If memory allocation failed
the program would have been terminated. */
slotinfo = memset (GL(dl_tls_dtv_slotinfo_list)->slotinfo, '\0',
nelem * sizeof (struct dtv_slotinfo));
GL(dl_tls_dtv_slotinfo_list)->len = nelem;
GL(dl_tls_dtv_slotinfo_list)->next = NULL;
/* Fill in the information from the loaded modules. */
for (l = GL(dl_loaded), i = 0; l != NULL; l = l->l_next)
if (l->l_tls_blocksize != 0)
/* This is a module with TLS data. Store the map reference.
The generation counter is zero. */
slotinfo[++i].map = l;
assert (i == GL(dl_tls_max_dtv_idx));
/* Computer the TLS offsets for the various blocks. We call this
function even if none of the modules available at startup time
uses TLS to initialize some variables. */
_dl_determine_tlsoffset ();
/* Construct the static TLS block and the dtv for the initial
thread. For some platforms this will include allocating memory
for the thread descriptor. The memory for the TLS block will
never be freed. It should be allocated accordingly. The dtv
array can be changed if dynamic loading requires it. */
tcbp = INTUSE(_dl_allocate_tls) ();
if (tcbp == NULL)
_dl_fatal_printf ("\
cannot allocate TLS data structures for inital thread");
/* And finally install it for the main thread. */
TLS_INIT_TP (tcbp);
}
#endif
if (__builtin_expect (mode, normal) != normal)
{
/* We were run just to list the shared libraries. It is
@ -1032,7 +1102,7 @@ of this helper program; chances are you did not intend to run this program.\n\
}
if (_dl_name_match_p (GL(dl_trace_prelink), l))
GL(dl_trace_prelink_map) = l;
_dl_printf ("\t%s => %s (0x%0*Zx, 0x%0*Zx)\n",
_dl_printf ("\t%s => %s (0x%0*Zx, 0x%0*Zx)",
l->l_libname->name[0] ? l->l_libname->name
: rtld_progname ?: "<main program>",
l->l_name[0] ? l->l_name
@ -1041,6 +1111,14 @@ of this helper program; chances are you did not intend to run this program.\n\
l->l_map_start,
(int) sizeof l->l_addr * 2,
l->l_addr);
#ifdef USE_TLS
if (l->l_tls_modid)
_dl_printf (" TLS(0x%Zx, 0x%0*Zx)\n", l->l_tls_modid,
(int) sizeof l->l_tls_offset * 2,
l->l_tls_offset);
else
#endif
_dl_printf ("\n");
}
}
else
@ -1182,76 +1260,6 @@ of this helper program; chances are you did not intend to run this program.\n\
_exit (0);
}
#ifdef USE_TLS
/* Now it is time to determine the layout of the static TLS block
and allocate it for the initial thread. Note that we always
allocate the static block, we never defer it even if no
DF_STATIC_TLS bit is set. The reason is that we know glibc will
use the static model. First add the dynamic linker to the list
if it also uses TLS. */
if (GL(dl_rtld_map).l_tls_blocksize != 0)
/* Assign a module ID. */
GL(dl_rtld_map).l_tls_modid = _dl_next_tls_modid ();
# ifndef SHARED
/* If dynamic loading of modules with TLS is impossible we do not
have to initialize any of the TLS functionality unless any of the
initial modules uses TLS. */
if (GL(dl_tls_max_dtv_idx) > 0)
# endif
{
struct link_map *l;
size_t nelem;
struct dtv_slotinfo *slotinfo;
/* Number of elements in the static TLS block. */
GL(dl_tls_static_nelem) = GL(dl_tls_max_dtv_idx);
/* Allocate the array which contains the information about the
dtv slots. We allocate a few entries more than needed to
avoid the need for reallocation. */
nelem = GL(dl_tls_max_dtv_idx) + 1 + TLS_SLOTINFO_SURPLUS;
/* Allocate. */
GL(dl_tls_dtv_slotinfo_list) = (struct dtv_slotinfo_list *)
malloc (sizeof (struct dtv_slotinfo_list)
+ nelem * sizeof (struct dtv_slotinfo));
/* No need to check the return value. If memory allocation failed
the program would have been terminated. */
slotinfo = memset (GL(dl_tls_dtv_slotinfo_list)->slotinfo, '\0',
nelem * sizeof (struct dtv_slotinfo));
GL(dl_tls_dtv_slotinfo_list)->len = nelem;
GL(dl_tls_dtv_slotinfo_list)->next = NULL;
/* Fill in the information from the loaded modules. */
for (l = GL(dl_loaded), i = 0; l != NULL; l = l->l_next)
if (l->l_tls_blocksize != 0)
/* This is a module with TLS data. Store the map reference.
The generation counter is zero. */
slotinfo[++i].map = l;
assert (i == GL(dl_tls_max_dtv_idx));
/* Computer the TLS offsets for the various blocks. We call this
function even if none of the modules available at startup time
uses TLS to initialize some variables. */
_dl_determine_tlsoffset ();
/* Construct the static TLS block and the dtv for the initial
thread. For some platforms this will include allocating memory
for the thread descriptor. The memory for the TLS block will
never be freed. It should be allocated accordingly. The dtv
array can be changed if dynamic loading requires it. */
tcbp = INTUSE(_dl_allocate_tls) ();
if (tcbp == NULL)
_dl_fatal_printf ("\
cannot allocate TLS data structures for inital thread");
/* And finally install it for the main thread. */
TLS_INIT_TP (tcbp);
}
#endif
if (GL(dl_loaded)->l_info [ADDRIDX (DT_GNU_LIBLIST)]
&& ! __builtin_expect (GL(dl_profile) != NULL, 0))
{