mirror of
https://sourceware.org/git/glibc.git
synced 2025-08-08 17:42:12 +03:00
.
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
/* dlinfo -- Get information from the dynamic linker.
|
||||
Copyright (C) 2003, 2004, 2006 Free Software Foundation, Inc.
|
||||
Copyright (C) 2003, 2004, 2006, 2007 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
|
||||
@@ -32,7 +32,9 @@ dlinfo (void *handle, int request, void *arg)
|
||||
|
||||
#else
|
||||
|
||||
# include <dl-tls.h>
|
||||
# ifdef USE_TLS
|
||||
# include <dl-tls.h>
|
||||
# endif
|
||||
|
||||
struct dlinfo_args
|
||||
{
|
||||
@@ -56,9 +58,8 @@ dlinfo_doit (void *argsblock)
|
||||
/* Find the highest-addressed object that CALLER is not below. */
|
||||
for (nsid = 0; nsid < DL_NNS; ++nsid)
|
||||
for (l = GL(dl_ns)[nsid]._ns_loaded; l != NULL; l = l->l_next)
|
||||
if (caller >= l->l_map_start && caller < l->l_map_end)
|
||||
/* There must be exactly one DSO for the range of the virtual
|
||||
memory. Otherwise something is really broken. */
|
||||
if (caller >= l->l_map_start && caller < l->l_map_end
|
||||
&& (l->l_contiguous || _dl_addr_inside_object (l, caller)))
|
||||
break;
|
||||
|
||||
if (l == NULL)
|
||||
@@ -95,14 +96,18 @@ RTLD_SELF used in code not dynamically loaded"));
|
||||
|
||||
case RTLD_DI_TLS_MODID:
|
||||
*(size_t *) args->arg = 0;
|
||||
#ifdef USE_TLS
|
||||
*(size_t *) args->arg = l->l_tls_modid;
|
||||
#endif
|
||||
break;
|
||||
|
||||
case RTLD_DI_TLS_DATA:
|
||||
{
|
||||
void *data = NULL;
|
||||
#ifdef USE_TLS
|
||||
if (l->l_tls_modid != 0)
|
||||
data = _dl_tls_get_addr_soft (l);
|
||||
#endif
|
||||
*(void **) args->arg = data;
|
||||
break;
|
||||
}
|
||||
|
Reference in New Issue
Block a user