1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-08-05 19:35:52 +03:00

* sysdeps/i386/dl-machine.h (elf_machine_rel)

(case R_386_TLS_DTPMOD32): Don't use addend.
	[case R_386_TLS_TPOFF32]: Remove redundant SYM_MAP != NULL check.
	(elf_machine_rela): Add support for TLS relocs.
This commit is contained in:
Roland McGrath
2002-09-14 09:17:58 +00:00
parent b634293600
commit 4730fc6882
3 changed files with 51 additions and 5 deletions

View File

@@ -1,3 +1,10 @@
2002-09-12 Jakub Jelinek <jakub@redhat.com>
* sysdeps/i386/dl-machine.h (elf_machine_rel)
(case R_386_TLS_DTPMOD32): Don't use addend.
[case R_386_TLS_TPOFF32]: Remove redundant SYM_MAP != NULL check.
(elf_machine_rela): Add support for TLS relocs.
2002-09-14 Roland McGrath <roland@redhat.com> 2002-09-14 Roland McGrath <roland@redhat.com>
* Makefile (manual/%): Add this pattern target to the iconvdata/% rule. * Makefile (manual/%): Add this pattern target to the iconvdata/% rule.

View File

@@ -1,3 +1,7 @@
2002-09-11 Steven Munroe <sjmunroe@us.ibm.com>
* sysdeps/powerpc/powerpc64/pt-machine.h: New file.
2002-09-04 Bruno Haible <bruno@clisp.org> 2002-09-04 Bruno Haible <bruno@clisp.org>
* pthread.c: Include <sys/time.h>. * pthread.c: Include <sys/time.h>.

View File

@@ -410,8 +410,6 @@ elf_machine_rel (struct link_map *map, const Elf32_Rel *reloc,
*reloc_addr = value; *reloc_addr = value;
break; break;
/* XXX Remove TLS relocations which are not needed. */
#ifdef USE_TLS #ifdef USE_TLS
case R_386_TLS_DTPMOD32: case R_386_TLS_DTPMOD32:
# ifdef RTLD_BOOTSTRAP # ifdef RTLD_BOOTSTRAP
@@ -432,7 +430,7 @@ elf_machine_rel (struct link_map *map, const Elf32_Rel *reloc,
/* During relocation all TLS symbols are defined and used. /* During relocation all TLS symbols are defined and used.
Therefore the offset is already correct. */ Therefore the offset is already correct. */
if (sym != NULL) if (sym != NULL)
*reloc_addr += sym->st_value; *reloc_addr = sym->st_value;
# endif # endif
break; break;
case R_386_TLS_TPOFF32: case R_386_TLS_TPOFF32:
@@ -444,7 +442,7 @@ elf_machine_rel (struct link_map *map, const Elf32_Rel *reloc,
It is a positive value which will be subtracted from the It is a positive value which will be subtracted from the
thread pointer. To get the variable position in the TLS thread pointer. To get the variable position in the TLS
block we subtract the offset from that of the TLS block. */ block we subtract the offset from that of the TLS block. */
if (sym_map != NULL && sym != NULL) if (sym != NULL)
*reloc_addr += sym_map->l_tls_offset - sym->st_value; *reloc_addr += sym_map->l_tls_offset - sym->st_value;
# endif # endif
break; break;
@@ -516,7 +514,44 @@ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
case R_386_PC32: case R_386_PC32:
*reloc_addr = (value + reloc->r_addend - (Elf32_Addr) reloc_addr); *reloc_addr = (value + reloc->r_addend - (Elf32_Addr) reloc_addr);
break; break;
/* XXX Do we have to handle the TLS relocation here? */
#ifdef USE_TLS
case R_386_TLS_DTPMOD32:
# ifdef RTLD_BOOTSTRAP
/* During startup the dynamic linker is always the module
with index 1.
XXX If this relocation is necessary move before RESOLVE
call. */
*reloc_addr = 1;
# else
/* Get the information from the link map returned by the
resolv function. */
if (sym_map != NULL)
*reloc_addr = sym_map->l_tls_modid;
# endif
break;
case R_386_TLS_DTPOFF32:
# ifndef RTLD_BOOTSTRAP
/* During relocation all TLS symbols are defined and used.
Therefore the offset is already correct. */
*reloc_addr = (sym == NULL ? 0 : sym->st_value) + reloc->r_addend;
# endif
break;
case R_386_TLS_TPOFF32:
/* The offset is positive, backward from the thread pointer. */
# ifdef RTLD_BOOTSTRAP
*reloc_addr = map->l_tls_offset - sym->st_value + reloc->r_addend;
# else
/* We know the offset of object the symbol is contained in.
It is a positive value which will be subtracted from the
thread pointer. To get the variable position in the TLS
block we subtract the offset from that of the TLS block. */
*reloc_addr
= (sym == NULL ? 0 : sym_map->l_tls_offset - sym->st_value)
+ reloc->r_addend;
# endif
break;
#endif /* use TLS */
default: default:
/* We add these checks in the version to relocate ld.so only /* We add these checks in the version to relocate ld.so only
if we are still debugging. */ if we are still debugging. */