mirror of git://sourceware.org/git/glibc.git
(elf_machine_rela): Compute DTPREL64 and TPREL64 without loadbase applied.
This commit is contained in:
parent
1f8613a6de
commit
76426e0247
|
|
@ -544,15 +544,25 @@ elf_machine_rela (struct link_map *map,
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Elf64_Addr sym_value;
|
Elf64_Addr sym_value;
|
||||||
|
Elf64_Addr sym_raw_value;
|
||||||
|
|
||||||
#if defined USE_TLS && !defined RTLD_BOOTSTRAP
|
#if defined USE_TLS && !defined RTLD_BOOTSTRAP
|
||||||
struct link_map *sym_map = RESOLVE_MAP (&sym, version, r_type);
|
struct link_map *sym_map = RESOLVE_MAP (&sym, version, r_type);
|
||||||
sym_value = sym ? sym_map->l_addr + sym->st_value : 0;
|
sym_raw_value = sym_value = reloc->r_addend;
|
||||||
|
if (sym)
|
||||||
|
{
|
||||||
|
sym_raw_value += sym->st_value;
|
||||||
|
sym_value = sym_raw_value + sym_map->l_addr;
|
||||||
|
}
|
||||||
#else
|
#else
|
||||||
Elf64_Addr loadbase = RESOLVE (&sym, version, r_type);
|
Elf64_Addr loadbase = RESOLVE (&sym, version, r_type);
|
||||||
sym_value = sym ? loadbase + sym->st_value : 0;
|
sym_raw_value = sym_value = reloc->r_addend;
|
||||||
|
if (sym)
|
||||||
|
{
|
||||||
|
sym_raw_value += sym->st_value;
|
||||||
|
sym_value = sym_raw_value + loadbase;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
sym_value += reloc->r_addend;
|
|
||||||
|
|
||||||
if (r_type == R_ALPHA_GLOB_DAT)
|
if (r_type == R_ALPHA_GLOB_DAT)
|
||||||
*reloc_addr = sym_value;
|
*reloc_addr = sym_value;
|
||||||
|
|
@ -600,18 +610,18 @@ elf_machine_rela (struct link_map *map,
|
||||||
#ifndef RTLD_BOOTSTRAP
|
#ifndef RTLD_BOOTSTRAP
|
||||||
/* 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. */
|
||||||
*reloc_addr = sym_value;
|
*reloc_addr = sym_raw_value;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
else if (r_type == R_ALPHA_TPREL64)
|
else if (r_type == R_ALPHA_TPREL64)
|
||||||
{
|
{
|
||||||
#ifdef RTLD_BOOTSTRAP
|
#ifdef RTLD_BOOTSTRAP
|
||||||
*reloc_addr = sym_value - map->l_tls_offset;
|
*reloc_addr = sym_raw_value - map->l_tls_offset;
|
||||||
#else
|
#else
|
||||||
if (sym_map)
|
if (sym_map)
|
||||||
{
|
{
|
||||||
CHECK_STATIC_TLS (map, sym_map);
|
CHECK_STATIC_TLS (map, sym_map);
|
||||||
*reloc_addr = sym_value - sym_map->l_tls_offset;
|
*reloc_addr = sym_raw_value - sym_map->l_tls_offset;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue