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