Search code examples
c++csymbolsstatic-linkingbacktrace

backtrace_symbols() with both -static and -rdynamic


Looking at this question and this question I can see that for backtrace_symbols() to work, one must compile with the -rdynamic flag.

I've tried it into a test program and it works, but I'm writing a program that is also compiled with -static and this page says that backtrace_symbols() doesn't work when -static is passed to the compiler/linker.

Is there any quick workaround to this or I'll never have a human-readable backtrace function in my statically linked program?


Solution

  • The answer was already at hand: it was in the same page I linked in the question. At the end, I successfully used libunwind.

    #include <libunwind.h>
    #include <stdio.h>
    
    void do_backtrace()
    {
        unw_cursor_t    cursor;
        unw_context_t   context;
    
        unw_getcontext(&context);
        unw_init_local(&cursor, &context);
    
        while (unw_step(&cursor) > 0)
        {
            unw_word_t  offset, pc;
            char        fname[64];
    
            unw_get_reg(&cursor, UNW_REG_IP, &pc);
    
            fname[0] = '\0';
            (void) unw_get_proc_name(&cursor, fname, sizeof(fname), &offset);
    
            printf ("%p : (%s+0x%x) [%p]\n", pc, fname, offset, pc);
        }
    }
    
    int main()
    {
     do_backtrace();
     return 0;
    }
    

    I was getting linking errors because I was (again) forgotting to place linker options at the end of the command line. I really don't understand why g++/gcc don't issue at least a warning when ignoring command line options. The correct command line to compile is (-g isn't needed):

    g++ -static unwind.cpp -o unwind -lunwind -lunwind-x86