svn commit: r226214 - stable/9/libexec/rtld-elf
Konstantin Belousov
kib at FreeBSD.org
Mon Oct 10 14:46:41 UTC 2011
Author: kib
Date: Mon Oct 10 14:46:40 2011
New Revision: 226214
URL: http://svn.freebsd.org/changeset/base/226214
Log:
MFC r226155:
Setting up TLS block for the main thread must be done after the
relocations are processed.
Approved by: re (bz)
Modified:
stable/9/libexec/rtld-elf/rtld.c
Directory Properties:
stable/9/libexec/rtld-elf/ (props changed)
Modified: stable/9/libexec/rtld-elf/rtld.c
==============================================================================
--- stable/9/libexec/rtld-elf/rtld.c Mon Oct 10 14:35:26 2011 (r226213)
+++ stable/9/libexec/rtld-elf/rtld.c Mon Oct 10 14:46:40 2011 (r226214)
@@ -495,8 +495,12 @@ _rtld(Elf_Addr *sp, func_ptr_type *exit_
exit (0);
}
- /* setup TLS for main thread */
- dbg("initializing initial thread local storage");
+ /*
+ * Processing tls relocations requires having the tls offsets
+ * initialized. Prepare offsets before starting initial
+ * relocation processing.
+ */
+ dbg("initializing initial thread local storage offsets");
STAILQ_FOREACH(entry, &list_main, link) {
/*
* Allocate all the initial objects out of the static TLS
@@ -504,7 +508,6 @@ _rtld(Elf_Addr *sp, func_ptr_type *exit_
*/
allocate_tls_offset(entry->obj);
}
- allocate_initial_tls(obj_list);
if (relocate_objects(obj_main,
ld_bind_now != NULL && *ld_bind_now != '\0', &obj_rtld, NULL) == -1)
@@ -519,6 +522,14 @@ _rtld(Elf_Addr *sp, func_ptr_type *exit_
exit (0);
}
+ /*
+ * Setup TLS for main thread. This must be done after the
+ * relocations are processed, since tls initialization section
+ * might be the subject for relocations.
+ */
+ dbg("initializing initial thread local storage");
+ allocate_initial_tls(obj_list);
+
dbg("initializing key program variables");
set_program_var("__progname", argv[0] != NULL ? basename(argv[0]) : "");
set_program_var("environ", env);
More information about the svn-src-stable-9
mailing list