uClibc i386的backtrace()替换
我正在使用uClibc为Linux编译一个静态链接的i386二进制文件。用于生成地址堆栈跟踪的回溯库函数不可用。我需要一个替代品 和似乎都从uClibc i386的backtrace()替换,c,stack-trace,static-linking,uclibc,C,Stack Trace,Static Linking,Uclibc,我正在使用uClibc为Linux编译一个静态链接的i386二进制文件。用于生成地址堆栈跟踪的回溯库函数不可用。我需要一个替代品 和似乎都从libgcc\u c.so.1加载函数_Unwind\u Backtrace。但是,libgcc\u so.1在我的工具链中不可用,当我尝试直接使用_Unwind\u backtrace时,我只得到一帧的堆栈跟踪(最上面的一帧,来自调用_Unwind\u backtrace的函数) 在静态链接的i386 Linux可执行文件中,我需要一个可工作的backtr
libgcc\u c.so.1
加载函数_Unwind\u Backtrace。但是,libgcc\u so.1
在我的工具链中不可用,当我尝试直接使用_Unwind\u backtrace时,我只得到一帧的堆栈跟踪(最上面的一帧,来自调用_Unwind\u backtrace的函数)
在静态链接的i386 Linux可执行文件中,我需要一个可工作的backtrace或_Unwind_backtrace替换,该文件与uClibc链接,不加载任何.so文件(例如libgcc_c.so.1
),它可以生成完整的堆栈跟踪(只有指令指针)。哪里有这样的实现
gcc内置返回地址的参考生成如下代码:
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指针编译的函数中也不显示帧,我已经决定不需要它。这有点不太成熟,但它应该与gcc(-compatible compilers)一起工作:@user3477950:Thx。它看起来像是内置的返回地址(I)只是盲目地沿着ebp链走。我已经更新了问题。