rtld dl_iterate_phdr(): dlpi_tls_data is wrong
dl_iterate_phdr() dlpi_tls_data should provide the TLS module segment address, and not the TLS init segment address as it does now. Reported by: emacsray@gmail.com PR: 254774 Sponsored by: The FreeBSD Foundation MFC after: 1 week
This commit is contained in:
parent
843d16436d
commit
d36d681615
@ -15,7 +15,7 @@
|
|||||||
.\"
|
.\"
|
||||||
.\" $OpenBSD: dl_iterate_phdr.3,v 1.3 2007/05/31 19:19:48 jmc Exp $
|
.\" $OpenBSD: dl_iterate_phdr.3,v 1.3 2007/05/31 19:19:48 jmc Exp $
|
||||||
.\" $FreeBSD$
|
.\" $FreeBSD$
|
||||||
.Dd October 9, 2014
|
.Dd April 5, 2021
|
||||||
.Dt DL_ITERATE_PHDR 3
|
.Dt DL_ITERATE_PHDR 3
|
||||||
.Os
|
.Os
|
||||||
.Sh NAME
|
.Sh NAME
|
||||||
@ -80,7 +80,10 @@ The counter of the object unloads performed by the dynamic linker.
|
|||||||
.It Fa dlpi_tls_modid
|
.It Fa dlpi_tls_modid
|
||||||
The TLS index of the object.
|
The TLS index of the object.
|
||||||
.It Fa dlpi_tls_data
|
.It Fa dlpi_tls_data
|
||||||
A pointer to the initialization data for the object TLS segment.
|
A pointer to the calling thread' TLS data segment for this module,
|
||||||
|
if it was allocated,
|
||||||
|
.Dv NULL
|
||||||
|
otherwise.
|
||||||
.El
|
.El
|
||||||
.Pp
|
.Pp
|
||||||
Future versions of
|
Future versions of
|
||||||
|
@ -34,4 +34,5 @@ FBSDprivate_1.0 {
|
|||||||
_r_debug_postinit;
|
_r_debug_postinit;
|
||||||
_rtld_version__FreeBSD_version;
|
_rtld_version__FreeBSD_version;
|
||||||
_rtld_version_laddr_offset;
|
_rtld_version_laddr_offset;
|
||||||
|
_rtld_version_dlpi_tls_data;
|
||||||
};
|
};
|
||||||
|
@ -424,6 +424,13 @@ See
|
|||||||
Also it indicates the presence of
|
Also it indicates the presence of
|
||||||
.Va l_refname
|
.Va l_refname
|
||||||
member of the structure.
|
member of the structure.
|
||||||
|
.It Dv _rtld_version_dlpi_tls_data
|
||||||
|
The
|
||||||
|
.Va dlpi_tls_data
|
||||||
|
member of the structure
|
||||||
|
.Vt dl_phdr_info
|
||||||
|
contains the address of the module TLS segment for the calling thread,
|
||||||
|
and not the address of the initialization segment.
|
||||||
.El
|
.El
|
||||||
.Sh FILES
|
.Sh FILES
|
||||||
.Bl -tag -width ".Pa /var/run/ld-elf32.so.hints" -compact
|
.Bl -tag -width ".Pa /var/run/ld-elf32.so.hints" -compact
|
||||||
|
@ -3909,13 +3909,16 @@ dlinfo(void *handle, int request, void *p)
|
|||||||
static void
|
static void
|
||||||
rtld_fill_dl_phdr_info(const Obj_Entry *obj, struct dl_phdr_info *phdr_info)
|
rtld_fill_dl_phdr_info(const Obj_Entry *obj, struct dl_phdr_info *phdr_info)
|
||||||
{
|
{
|
||||||
|
tls_index ti;
|
||||||
|
|
||||||
phdr_info->dlpi_addr = (Elf_Addr)obj->relocbase;
|
phdr_info->dlpi_addr = (Elf_Addr)obj->relocbase;
|
||||||
phdr_info->dlpi_name = obj->path;
|
phdr_info->dlpi_name = obj->path;
|
||||||
phdr_info->dlpi_phdr = obj->phdr;
|
phdr_info->dlpi_phdr = obj->phdr;
|
||||||
phdr_info->dlpi_phnum = obj->phsize / sizeof(obj->phdr[0]);
|
phdr_info->dlpi_phnum = obj->phsize / sizeof(obj->phdr[0]);
|
||||||
phdr_info->dlpi_tls_modid = obj->tlsindex;
|
phdr_info->dlpi_tls_modid = obj->tlsindex;
|
||||||
phdr_info->dlpi_tls_data = obj->tlsinit;
|
ti.ti_module = obj->tlsindex;
|
||||||
|
ti.ti_offset = 0;
|
||||||
|
phdr_info->dlpi_tls_data = __tls_get_addr(&ti);
|
||||||
phdr_info->dlpi_adds = obj_loads;
|
phdr_info->dlpi_adds = obj_loads;
|
||||||
phdr_info->dlpi_subs = obj_loads - obj_count;
|
phdr_info->dlpi_subs = obj_loads - obj_count;
|
||||||
}
|
}
|
||||||
@ -5914,3 +5917,6 @@ int _rtld_version__FreeBSD_version = __FreeBSD_version;
|
|||||||
|
|
||||||
extern char _rtld_version_laddr_offset __exported;
|
extern char _rtld_version_laddr_offset __exported;
|
||||||
char _rtld_version_laddr_offset;
|
char _rtld_version_laddr_offset;
|
||||||
|
|
||||||
|
extern char _rtld_version_dlpi_tls_data __exported;
|
||||||
|
char _rtld_version_dlpi_tls_data;
|
||||||
|
@ -60,7 +60,7 @@
|
|||||||
* in the range 5 to 9.
|
* in the range 5 to 9.
|
||||||
*/
|
*/
|
||||||
#undef __FreeBSD_version
|
#undef __FreeBSD_version
|
||||||
#define __FreeBSD_version 1400006 /* Master, propagated to newvers */
|
#define __FreeBSD_version 1400007 /* Master, propagated to newvers */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* __FreeBSD_kernel__ indicates that this system uses the kernel of FreeBSD,
|
* __FreeBSD_kernel__ indicates that this system uses the kernel of FreeBSD,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user