/* test signal stack alignment (sigframe) */ /* Markus F.X.J. Oberhumer */ #include #include #include #include volatile unsigned long signal_sp = 0; #if defined(__x86_64__) /* amd64: signal stack is properly aligned */ asm( ".text\n .align 16\n" "my_sighandler:\n" "lea 8(%rsp),%rax\n" "movq %rax,(signal_sp)\n" "retq\n" ); #elif defined(__i386__) /* i386: signal stack is always mis-aligned to 4-bytes */ asm( ".text\n .align 16\n" "my_sighandler:\n" "lea 4(%esp),%eax\n" "movl %eax,(signal_sp)\n" "ret\n" ); #else #error "arch not supported - please insert your code here" #endif #if defined(__cplusplus) extern "C" #endif void my_sighandler(int); int main() { int signo = SIGUSR1; #if 1 /* randomize stack */ void * volatile dummy = NULL; srand((unsigned)clock() % RAND_MAX); dummy = __builtin_alloca(rand() % 2048ul); #endif signal_sp = 0; signal(signo, my_sighandler); raise(signo); printf("sp = 0x%lx alignment = %lu\n", signal_sp, signal_sp & 15); if (signal_sp & 15) printf(" error: signal stack not aligned\n"); return 0; } /* vim:set ts=4 et: */