This is the mail archive of the
glibc-cvs@sourceware.org
mailing list for the glibc project.
GNU C Library master sources branch, master, updated. glibc-2.15-781-gc8c5945
- From: hjl at sourceware dot org
- To: glibc-cvs at sourceware dot org
- Date: 10 May 2012 17:06:17 -0000
- Subject: GNU C Library master sources branch, master, updated. glibc-2.15-781-gc8c5945
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "GNU C Library master sources".
The branch, master has been updated
via c8c59454eac603f75e8e037d290e595abeda2af5 (commit)
from 6f27cd16593d0c095bb1b90787bee70910d3a609 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
http://sources.redhat.com/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=c8c59454eac603f75e8e037d290e595abeda2af5
commit c8c59454eac603f75e8e037d290e595abeda2af5
Author: H.J. Lu <hjl.tools@gmail.com>
Date: Thu May 10 10:05:40 2012 -0700
Sign extend R_X86_64_DTPOFF64/R_X86_64_TPOFF64
diff --git a/ChangeLog b/ChangeLog
index b418bfe..7fb8d56 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2012-05-10 H.J. Lu <hongjiu.lu@intel.com>
+
+ * sysdeps/x86_64/dl-machine.h (elf_machine_rela) [__ILP32__]:
+ Sign extend relocation result to 64 bits for R_X86_64_DTPOFF64
+ and R_X86_64_TPOFF64.
+
2012-05-10 Joseph Myers <joseph@codesourcery.com>
* sysdeps/unix/sysv/linux/syscalls.list (alarm): Add entry from
diff --git a/sysdeps/x86_64/dl-machine.h b/sysdeps/x86_64/dl-machine.h
index d1906a4..cf49d42 100644
--- a/sysdeps/x86_64/dl-machine.h
+++ b/sysdeps/x86_64/dl-machine.h
@@ -328,7 +328,19 @@ elf_machine_rela (struct link_map *map, const ElfW(Rela) *reloc,
/* During relocation all TLS symbols are defined and used.
Therefore the offset is already correct. */
if (sym != NULL)
- *reloc_addr = sym->st_value + reloc->r_addend;
+ {
+ value = sym->st_value + reloc->r_addend;
+# ifdef __ILP32__
+ /* This relocation type computes a signed offset that is
+ usually negative. The symbol and addend values are 32
+ bits but the GOT entry is 64 bits wide and the whole
+ 64-bit entry is used as a signed quantity, so we need
+ to sign-extend the computed value to 64 bits. */
+ *(Elf64_Sxword *) reloc_addr = (Elf64_Sxword) (Elf32_Sxword) value;
+# else
+ *reloc_addr = value;
+# endif
+ }
# endif
break;
case R_X86_64_TLSDESC:
@@ -378,8 +390,17 @@ elf_machine_rela (struct link_map *map, const ElfW(Rela) *reloc,
/* We know the offset of the object the symbol is contained in.
It is a negative value which will be added to the
thread pointer. */
- *reloc_addr = (sym->st_value + reloc->r_addend
- - sym_map->l_tls_offset);
+ value = (sym->st_value + reloc->r_addend
+ - sym_map->l_tls_offset);
+# ifdef __ILP32__
+ /* The symbol and addend values are 32 bits but the GOT
+ entry is 64 bits wide and the whole 64-bit entry is used
+ as a signed quantity, so we need to sign-extend the
+ computed value to 64 bits. */
+ *(Elf64_Sxword *) reloc_addr = (Elf64_Sxword) (Elf32_Sword) value;
+# else
+ *reloc_addr = value;
+# endif
}
break;
# endif
-----------------------------------------------------------------------
Summary of changes:
ChangeLog | 6 ++++++
sysdeps/x86_64/dl-machine.h | 27 ++++++++++++++++++++++++---
2 files changed, 30 insertions(+), 3 deletions(-)
hooks/post-receive
--
GNU C Library master sources