mirror of
https://github.com/tobast/libunwind-eh_elf.git
synced 2024-08-15 06:12:51 +02:00
![Jan Kratochvil](/assets/img/avatar_default.png)
On some systems executable stacks are denied. Since libunwind and the tests don't actually need executable stacks this patch marks all assembly files as not needing it. The original patch comes from frysk: 2007-04-05 Jan Kratochvil <jan.kratochvil@redhat.com> * src/hppa/getcontext.S, src/hppa/setcontext.S, src/hppa/siglongjmp.S, src/ia64/Ginstall_cursor.S, src/ia64/Linstall_cursor.S, src/ia64/dyn_info_list.S, src/ia64/getcontext.S, src/ia64/longjmp.S, src/ia64/setjmp.S, src/ia64/siglongjmp.S, src/ia64/sigsetjmp.S, src/ppc64/longjmp.S, src/ppc64/siglongjmp.S, src/x86/longjmp.S, src/x86/siglongjmp.S, src/x86_64/longjmp.S, src/x86_64/setcontext.S, src/x86_64/siglongjmp.S: Stack should be non-executable, for SELinux. I added a couple more markers for new files in current libunwind. Before this patch you would get the following on selinux enabled systems without allow_exec_stack: error while loading shared libraries: libunwind.so.7: cannot enable executable stack as shared object requires: Permission denied After the patch that error disappears and all test results are similar to the results on systems without executable stack protection.
102 lines
1.7 KiB
ArmAsm
102 lines
1.7 KiB
ArmAsm
.globl func_add1, func_add1_end
|
|
.proc func_add1
|
|
func_add1:
|
|
{.mib; add r8 = 1, r32
|
|
nop.i 0
|
|
br.ret.sptk.many rp
|
|
}
|
|
func_add1_end:
|
|
.endp func_add1
|
|
|
|
.globl func_add3, func_add3_end
|
|
.proc func_add3
|
|
func_add3:
|
|
{.mmi; alloc loc0 = ar.pfs, 2, 1, 2, 0
|
|
mov r2 = sp
|
|
add sp = -16, sp
|
|
} ;;
|
|
{.mii; ld8 r8 = [in1], 8 // load the function pointer
|
|
mov r3 = rp
|
|
mov rp = loc0 // trash rp
|
|
} ;;
|
|
{.mmi; ld8 r9 = [r8], 8 // load the entry-point
|
|
st8 [r2] = r3
|
|
mov out0 = in0
|
|
} ;;
|
|
{.mii; ld8 gp = [r8] // load the gp
|
|
mov b6 = r9
|
|
mov out1 = in1
|
|
}
|
|
{.mib; nop 0
|
|
nop 0
|
|
br.call.sptk rp = b6
|
|
}
|
|
{.mmi; add r2 = 16, sp
|
|
;;
|
|
ld8 r3 = [r2] // r3 = saved rp
|
|
mov ar.pfs = loc0
|
|
} ;;
|
|
{.mii; nop 0
|
|
mov rp = r3
|
|
adds sp = 16, sp
|
|
} ;;
|
|
{.mib; st8 [sp] = in0 // trash rp save location
|
|
add r8 = 2, r8
|
|
br.ret.sptk.many rp
|
|
}
|
|
func_add3_end:
|
|
.endp func_add3
|
|
|
|
.globl func_vframe, func_vframe_end
|
|
.proc func_vframe
|
|
func_vframe:
|
|
{.mii; alloc r16 = ar.pfs, 1, 2, 0, 0 // 0
|
|
mov loc0 = rp
|
|
mov loc1 = sp
|
|
} ;;
|
|
{.mmi; sub sp = sp, in0
|
|
st8 [loc1] = r16
|
|
mov r2 = -99 // 0
|
|
} ;;
|
|
{.mii; nop 0
|
|
mov rp = r2
|
|
mov ar.pfs = r0
|
|
}
|
|
{.mib; mov r16 = r2
|
|
tbit.nz p6, p0 = in0, 4
|
|
(p6) br.cond.sptk.many .exit
|
|
} ;;
|
|
{.mmi; ld8 r16 = [loc1]
|
|
;;
|
|
mov r3 = loc0 // 8 move saved rp to r3
|
|
mov ar.pfs = r16
|
|
} ;;
|
|
{.mmi; mov sp = loc1 // 10
|
|
st8 [loc1] = r0 // trash saved pfs
|
|
mov loc0 = r2
|
|
} ;;
|
|
{.mib; mov r8 = 10
|
|
mov rp = r3
|
|
br.ret.sptk.many rp
|
|
}
|
|
.exit:
|
|
{.mmi; ld8 r16 = [loc1]
|
|
;;
|
|
sub sp = 32, sp
|
|
mov ar.pfs = r16
|
|
} ;;
|
|
{.mmi; mov sp = loc1
|
|
st8 [loc1] = r0 // trash saved pfs
|
|
mov rp = loc0
|
|
}
|
|
{.mib; nop 0
|
|
mov r8 = 4
|
|
br.ret.sptk.many rp
|
|
}
|
|
func_vframe_end:
|
|
.endp func_vframe
|
|
|
|
#ifdef __linux__
|
|
/* We do not need executable stack. */
|
|
.section .note.GNU-stack,"",@progbits
|
|
#endif
|