#include <stdlib.h>
#include <string.h>
#include <unwind.h>
extern char __start_main_func;
extern char __stop_main_func;
_Unwind_Reason_Code frame_handler(struct _Unwind_Context *ctx, void *arg) {
(void)arg;
uintptr_t ip = _Unwind_GetIP(ctx);
if (ip >= (uintptr_t)&__start_main_func &&
ip < (uintptr_t)&__stop_main_func) {
_Exit(0);
}
return _URC_NO_REASON;
}
__attribute__((noinline)) void foo() {
#if defined(__aarch64__)
asm volatile(".cfi_offset 64, 0");
asm volatile(".cfi_undefined 65");
asm volatile(".cfi_undefined 95");
asm volatile(".cfi_register 66, 94");
#endif
_Unwind_Backtrace(frame_handler, NULL);
}
__attribute__((section("main_func"))) int main(int, char **) {
foo();
return -2;
}