Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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?

like image 850
Avio Avatar asked Nov 09 '12 12:11

Avio


2 Answers

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
like image 66
Avio Avatar answered Oct 19 '22 03:10

Avio


If you absolutely have to compile your program as static, you can still use backtrace() to find out addresses of the functions and then find function names by parsing debug information, using libdwarf, for example.

But it isn't a simple task, so I'd suggest to use -rdynamic flag.

like image 3
qrdl Avatar answered Oct 19 '22 01:10

qrdl