1

我正在使用 uClibc 为 Linux 编译一个静态链接的 i386 二进制文件。用于生成地址堆栈跟踪的回溯库函数不可用。我需要一个替代品。

http://code.metager.de/source/xref/lib/eglibc/libc/sysdeps/i386/backtrace.c和https://github.com/hwoarang/uClibc/blob/master-metag/libubacktrace/backtrace _ .c似乎从.c 加载函数_Unwind_Backtracelibgcc_c.so.1。但是,libgcc_so.1在我的工具链中不可用,当我尝试直接使用_Unwind_backtrace时,我得到的堆栈跟踪只有 1 帧(最上面的一个,来自调用_Unwind_Backtrace的函数。

我需要在我的静态链接的 i386 Linux 可执行文件中使用backtrace_Unwind_Backtrace的有效替换,与 uClibc 链接,而不加载任何 .so 文件(例如libgcc_c.so.1),这可以生成完整的堆栈跟踪(仅指令指针)。这样的实现在哪里可用?

仅供参考 gcc__builtin_return_address生成如下代码:

    movl    0(%ebp), %eax
    movl    (%eax), %eax 
    movl    (%eax), %eax 
    movl    (%eax), %eax 
    movl    (%eax), %eax 
    movl    (%eax), %eax 
    movl    (%eax), %eax 
    movl    (%eax), %eax 
    movl    4(%eax), %eax

这只是盲目地沿着框架链走,没有任何边界检查或健全性检查。我想使用比这更安全的东西。

请注意,即使 glibc backtrace(3)也不会在使用gcc -fomit-frame-pointer编译的函数中显示帧,我决定不需要它。

4

0 回答 0