我正在使用uClibc为Linux编译静态链接的i386二进制文件。用于生成地址堆栈跟踪的 backtrace 库函数不可用。我需要更换。
http://code.metager.de/source/xref/lib/eglibc/libc/sysdeps/i386/backtrace.c和https://github.com/hwoarang/uClibc/blob/master-metag/libubacktrace/backtrace.c似乎都加载了来自libgcc_c.so.1
的函数 _Unwind_Backtrace 。但是,libgcc_so.1
在我的工具链中不可用,当我尝试直接使用 _Unwind_backtrace 时,我得到的堆栈跟踪只有1帧(最顶层的一个,来自调用 _Unwind_Backtrace
我需要在我的静态链接的i386 Linux可执行文件中替换针对uClibc的 backtrace 或 _Unwind_Backtrace ,而不加载任何.so文件(例如{{1} }}),它可以生成完整的堆栈跟踪(只有指令指针)。这种实施在哪里可用?
对于gcc libgcc_c.so.1
的FYI生成如下代码:
__builtin_return_address
这只是盲目地走向框架链,没有任何边界检查或完整性检查。我想使用比这更安全的东西。
请注意,即使glibc 回溯(3)也不会在用 gcc -fomit-frame-pointer 编译的函数中显示帧,我已经决定我不需要那个。