+2012-05-10 H.J. Lu <hongjiu.lu@intel.com>
+
+ * elf/elf.h (R_X86_64_RELATIVE64): New.
+ (R_X86_64_NUM): Updated.
+ * sysdeps/x86_64/dl-machine.h (elf_machine_rela): Handle
+ R_X86_64_RELATIVE64. Always use Elf64_Addr with R_X86_64_64.
+ (elf_machine_rela_relative): Handle R_X86_64_RELATIVE64.
+ * sysdeps/x86_64/Makefile (tests): Add tst-quad1 tst-quad2
+ tst-quad1pie tst-quad2pie
+ (modules-names): Add tst-quadmod1 tst-quadmod2.
+ ($(objpfx)tst-quad1): New dependency.
+ ($(objpfx)tst-quad2): Likewise.
+ ($(objpfx)tst-quad1pie): Likewise.
+ ($(objpfx)tst-quad2pie): Likewise.
+ * sysdeps/x86_64/tst-quad1.c: New file.
+ * sysdeps/x86_64/tst-quad1pie.c: New file.
+ * sysdeps/x86_64/tst-quad2.c: Likewise.
+ * sysdeps/x86_64/tst-quad2pie.c: Likewise.
+ * sysdeps/x86_64/tst-quadmod1.S: Likewise.
+ * sysdeps/x86_64/tst-quadmod1pie.S: Likewise.
+ * sysdeps/x86_64/tst-quadmod2.S: Likewise.
+ * sysdeps/x86_64/tst-quadmod2pie.S: Likewise.
+
2012-05-10 Samuel Thibault <samuel.thibault@ens-lyon.org>
* io/fcntl.h (mode_t, off_t, pid_t): Define types.
descriptor. */
#define R_X86_64_TLSDESC 36 /* TLS descriptor. */
#define R_X86_64_IRELATIVE 37 /* Adjust indirectly by program base */
+#define R_X86_64_RELATIVE64 38 /* 64-bit adjust by program base */
-#define R_X86_64_NUM 38
+#define R_X86_64_NUM 39
/* AM33 relocations. */
sysdep_routines += tlsdesc dl-tlsdesc
sysdep-rtld-routines += tlsdesc dl-tlsdesc
+tests += tst-quad1 tst-quad2
+modules-names += tst-quadmod1 tst-quadmod2
+
+$(objpfx)tst-quad1: $(objpfx)tst-quadmod1.so
+$(objpfx)tst-quad2: $(objpfx)tst-quadmod2.so
+
+quad-pie-test += tst-quad1pie tst-quad2pie
+tests += $(quad-pie-test)
+tests-pie += $(quad-pie-test)
+
+$(objpfx)tst-quad1pie: $(objpfx)tst-quadmod1pie.o
+$(objpfx)tst-quad2pie: $(objpfx)tst-quadmod2pie.o
+
tests: $(objpfx)tst-xmmymm.out
$(objpfx)tst-xmmymm.out: ../sysdeps/x86_64/tst-xmmymm.sh $(objpfx)ld.so
@echo "Checking ld.so for SSE register use. This will take a few seconds..."
}
else
# endif
+# if !defined RTLD_BOOTSTRAP
+ /* l_addr + r_addend may be > 0xffffffff and R_X86_64_RELATIVE64
+ relocation updates the whole 64-bit entry. */
+ if (__builtin_expect (r_type == R_X86_64_RELATIVE64, 0))
+ *(Elf64_Addr *) reloc_addr = (Elf64_Addr) map->l_addr + reloc->r_addend;
+ else
+# endif
if (__builtin_expect (r_type == R_X86_64_NONE, 0))
return;
else
# ifndef RTLD_BOOTSTRAP
case R_X86_64_64:
- *reloc_addr = value + reloc->r_addend;
+ /* value + r_addend may be > 0xffffffff and R_X86_64_64
+ relocation updates the whole 64-bit entry. */
+ *(Elf64_Addr *) reloc_addr = (Elf64_Addr) value + reloc->r_addend;
break;
case R_X86_64_32:
value += reloc->r_addend;
void *const reloc_addr_arg)
{
ElfW(Addr) *const reloc_addr = reloc_addr_arg;
- assert (ELFW(R_TYPE) (reloc->r_info) == R_X86_64_RELATIVE);
- *reloc_addr = l_addr + reloc->r_addend;
+ /* l_addr + r_addend may be > 0xffffffff and R_X86_64_RELATIVE64
+ relocation updates the whole 64-bit entry. */
+ if (__builtin_expect (ELFW(R_TYPE) (reloc->r_info) == R_X86_64_RELATIVE64, 0))
+ *(Elf64_Addr *) reloc_addr = (Elf64_Addr) l_addr + reloc->r_addend;
+ else
+ {
+ assert (ELFW(R_TYPE) (reloc->r_info) == R_X86_64_RELATIVE);
+ *reloc_addr = l_addr + reloc->r_addend;
+ }
}
auto inline void
--- /dev/null
+/* Copyright (C) 2012 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+extern void foo (void);
+
+int
+main (void)
+{
+ foo ();
+ return 0;
+}
--- /dev/null
+#include "tst-quad1.c"
--- /dev/null
+#include "tst-quad1.c"
--- /dev/null
+#include "tst-quad2.c"
--- /dev/null
+/* Copyright (C) 2012 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+#ifndef BIAS
+# define BIAS 0x7fffffff
+#endif
+
+ .section .data.rel,"aw",@progbits
+ .align 8
+.Ljmp:
+ .quad func + BIAS
+ .text
+ .globl func
+ .type func, @function
+func:
+ .cfi_startproc
+ xorl %edi, %edi
+ jmp exit@PLT
+ .cfi_endproc
+ .size func, .-func
+ .globl foo
+ .type foo, @function
+foo:
+ .cfi_startproc
+ .cfi_def_cfa_register 6
+ movq .Ljmp(%rip), %rax
+ subq $BIAS, %rax
+ jmp *%rax
+ .cfi_endproc
+ .size foo, .-foo
--- /dev/null
+#define BIAS 0x7fff0000
+#include "tst-quadmod1.S"
--- /dev/null
+/* Copyright (C) 2012 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+#ifndef BIAS
+# define BIAS 0x7fff0000
+#endif
+
+ .section .data.rel.local,"aw",@progbits
+ .align 8
+.Ljmp:
+ .quad func + BIAS
+ .text
+ .type func, @function
+func:
+ .cfi_startproc
+ xorl %edi, %edi
+ jmp exit@PLT
+ .cfi_endproc
+ .size func, .-func
+ .globl foo
+ .type foo, @function
+foo:
+ .cfi_startproc
+ .cfi_def_cfa_register 6
+ movq .Ljmp(%rip), %rax
+ subq $BIAS, %rax
+ jmp *%rax
+ .cfi_endproc
+ .size foo, .-foo
--- /dev/null
+#include "tst-quadmod2.S"