1551a592fefff29bad7a5b7778b3a0d6ceaaf8c81Andrew Hsieh#include <new> 2551a592fefff29bad7a5b7778b3a0d6ceaaf8c81Andrew Hsieh#include <exception> 3551a592fefff29bad7a5b7778b3a0d6ceaaf8c81Andrew Hsieh#include <cstdio> 4551a592fefff29bad7a5b7778b3a0d6ceaaf8c81Andrew Hsieh 5551a592fefff29bad7a5b7778b3a0d6ceaaf8c81Andrew Hsieh/* Stubbed out in libdl and defined in the dynamic linker. 6551a592fefff29bad7a5b7778b3a0d6ceaaf8c81Andrew Hsieh * Same semantics as __gnu_Unwind_Find_exidx(). 7551a592fefff29bad7a5b7778b3a0d6ceaaf8c81Andrew Hsieh */ 8551a592fefff29bad7a5b7778b3a0d6ceaaf8c81Andrew Hsiehtypedef long unsigned int *_Unwind_Ptr; 9551a592fefff29bad7a5b7778b3a0d6ceaaf8c81Andrew Hsiehextern "C" _Unwind_Ptr dl_unwind_find_exidx(_Unwind_Ptr pc, int *pcount); 10551a592fefff29bad7a5b7778b3a0d6ceaaf8c81Andrew Hsiehextern "C" _Unwind_Ptr __gnu_Unwind_Find_exidx(_Unwind_Ptr pc, int *pcount) 11551a592fefff29bad7a5b7778b3a0d6ceaaf8c81Andrew Hsieh{ 12551a592fefff29bad7a5b7778b3a0d6ceaaf8c81Andrew Hsieh _Unwind_Ptr ret_pc; 13551a592fefff29bad7a5b7778b3a0d6ceaaf8c81Andrew Hsieh printf("%p -> ", pc); 14551a592fefff29bad7a5b7778b3a0d6ceaaf8c81Andrew Hsieh ret_pc = dl_unwind_find_exidx(pc, pcount); 15551a592fefff29bad7a5b7778b3a0d6ceaaf8c81Andrew Hsieh printf("%p %d\n", ret_pc, *pcount); 16551a592fefff29bad7a5b7778b3a0d6ceaaf8c81Andrew Hsieh return ret_pc; 17551a592fefff29bad7a5b7778b3a0d6ceaaf8c81Andrew Hsieh} 18551a592fefff29bad7a5b7778b3a0d6ceaaf8c81Andrew Hsiehstatic void* g_func_ptr; 19551a592fefff29bad7a5b7778b3a0d6ceaaf8c81Andrew Hsieh 2076e0b8f3914eed32c003bc8a29f0dccf9167bc13Logan Chienstatic void foo(void) 21551a592fefff29bad7a5b7778b3a0d6ceaaf8c81Andrew Hsieh{ 22551a592fefff29bad7a5b7778b3a0d6ceaaf8c81Andrew Hsieh try 23551a592fefff29bad7a5b7778b3a0d6ceaaf8c81Andrew Hsieh { 24551a592fefff29bad7a5b7778b3a0d6ceaaf8c81Andrew Hsieh ::printf("Hello "); 25551a592fefff29bad7a5b7778b3a0d6ceaaf8c81Andrew Hsieh throw std::exception(); 26551a592fefff29bad7a5b7778b3a0d6ceaaf8c81Andrew Hsieh } catch (const std::exception &e) 27551a592fefff29bad7a5b7778b3a0d6ceaaf8c81Andrew Hsieh { 28551a592fefff29bad7a5b7778b3a0d6ceaaf8c81Andrew Hsieh ::printf(" World!\n"); 29551a592fefff29bad7a5b7778b3a0d6ceaaf8c81Andrew Hsieh } 30551a592fefff29bad7a5b7778b3a0d6ceaaf8c81Andrew Hsieh} 31551a592fefff29bad7a5b7778b3a0d6ceaaf8c81Andrew Hsieh 32551a592fefff29bad7a5b7778b3a0d6ceaaf8c81Andrew Hsiehint main(int argc, char** argv) 33551a592fefff29bad7a5b7778b3a0d6ceaaf8c81Andrew Hsieh{ 34551a592fefff29bad7a5b7778b3a0d6ceaaf8c81Andrew Hsieh int count; 35551a592fefff29bad7a5b7778b3a0d6ceaaf8c81Andrew Hsieh g_func_ptr = (void*)__gnu_Unwind_Find_exidx; 36551a592fefff29bad7a5b7778b3a0d6ceaaf8c81Andrew Hsieh 37551a592fefff29bad7a5b7778b3a0d6ceaaf8c81Andrew Hsieh __gnu_Unwind_Find_exidx((_Unwind_Ptr)main, &count); // This one succeed 38551a592fefff29bad7a5b7778b3a0d6ceaaf8c81Andrew Hsieh 39551a592fefff29bad7a5b7778b3a0d6ceaaf8c81Andrew Hsieh // This one crash on Android <= 2.1. 40551a592fefff29bad7a5b7778b3a0d6ceaaf8c81Andrew Hsieh // The lcoal __gnu_Unwind_Find_exidx() isn't even called. 41551a592fefff29bad7a5b7778b3a0d6ceaaf8c81Andrew Hsieh // Need to recompile Android 2.1 from source and debug platform from there 42551a592fefff29bad7a5b7778b3a0d6ceaaf8c81Andrew Hsieh foo(); 43551a592fefff29bad7a5b7778b3a0d6ceaaf8c81Andrew Hsieh return 0; 44551a592fefff29bad7a5b7778b3a0d6ceaaf8c81Andrew Hsieh} 45