|
@@ -22,6 +22,7 @@
|
|
|
#include <bits/setjmp.h>
|
|
|
|
|
|
.globl __setjmp;
|
|
|
+.type __setjmp,@function
|
|
|
.align 4; \
|
|
|
__setjmp:
|
|
|
popl %eax /* Pop return address. */
|
|
@@ -31,6 +32,7 @@ __setjmp:
|
|
|
pushl %eax /* Push back return address. */
|
|
|
|
|
|
.globl __sigsetjmp;
|
|
|
+.type __sigsetjmp,@function
|
|
|
.align 4; \
|
|
|
__sigsetjmp:
|
|
|
movl 4(%esp), %eax /* User's jmp_buf in %eax. */
|
|
@@ -45,15 +47,15 @@ __sigsetjmp:
|
|
|
movl %ecx, (JB_PC*4)(%eax)
|
|
|
|
|
|
/* Make a tail call to __sigjmp_save; it takes the same args. */
|
|
|
-#ifdef PIC
|
|
|
+#if defined(PIC)
|
|
|
/* We cannot use the PLT, because it requires that %ebx be set, but
|
|
|
we can't save and restore our caller's value. Instead, we do an
|
|
|
indirect jump through the GOT, using for the temporary register
|
|
|
%ecx, which is call-clobbered. */
|
|
|
- call L(here)
|
|
|
-L(here):
|
|
|
+ call Lhere
|
|
|
+Lhere:
|
|
|
popl %ecx
|
|
|
- addl $_GLOBAL_OFFSET_TABLE_+[.-L(here)], %ecx
|
|
|
+ addl $_GLOBAL_OFFSET_TABLE_+[.-Lhere], %ecx
|
|
|
movl (__sigjmp_save)(%ecx), %ecx
|
|
|
jmp *%ecx
|
|
|
#else
|