Browse Source

x86_64: add PLT bypass for __sigsetjmp

The current x86_64 setjmp helpers incur a reloc, so fix that up.

$ readelf -r lib/libc.so.0
...
Relocation section '.rela.plt' at offset 0xb058 contains 10 entries:
  Offset          Info           Type           Sym. Value    Sym. Name + Addend
000000236010  02a400000007 R_X86_64_JUMP_SLO 000000000000b3c4 __sigsetjmp + 0
...

Signed-off-by: Mike Frysinger <vapier@gentoo.org>
Mike Frysinger 12 years ago
parent
commit
09dfeda9cf

+ 3 - 1
libc/sysdeps/linux/x86_64/bsd-_setjmp.S

@@ -21,9 +21,11 @@
    We cannot do it in C because it must be a tail-call, so frame-unwinding
    in setjmp doesn't clobber the state restored by longjmp.  */
 
+#include <sysdep.h>
+
 .global _setjmp
 .type   _setjmp,%function
 _setjmp:
 	xorq %rsi, %rsi
-	jmp __sigsetjmp@PLT
+	jmp HIDDEN_JUMPTARGET(__sigsetjmp)
 .size _setjmp,.-_setjmp

+ 2 - 1
libc/sysdeps/linux/x86_64/bsd-setjmp.S

@@ -20,10 +20,11 @@
 #define _ASM
 #define _SETJMP_H
 #include <bits/setjmp.h>
+#include <sysdep.h>
 
 .global setjmp
 .type   setjmp,%function
 setjmp:
 	movq $1, %rsi
-	jmp __sigsetjmp@PLT
+	jmp HIDDEN_JUMPTARGET(__sigsetjmp)
 .size setjmp,.-setjmp

+ 2 - 0
libc/sysdeps/linux/x86_64/setjmp.S

@@ -20,6 +20,7 @@
 #define _ASM
 #define _SETJMP_H
 #include <bits/setjmp.h>
+#include <sysdep.h>
 
 .global __sigsetjmp
 .type   __sigsetjmp,%function
@@ -43,3 +44,4 @@ __sigsetjmp:
 	jmp __sigjmp_save
 #endif
 .size __sigsetjmp,.-__sigsetjmp
+libc_hidden_def(__sigsetjmp)