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から関数_Unwind_Backtraceをロードしているようですlibgcc_c.so.1
。ただし、libgcc_so.1
私のツールチェーンでは利用できず、_Unwind_backtraceを直接使用しようとすると、1 フレームのみのスタック トレースが取得されます ( _Unwind_Backtraceを呼び出す関数からの一番上のフレーム) 。
静的にリンクされた i386 Linux 実行可能ファイルのbacktraceまたは_Unwind_Backtraceの代わりに、.so ファイル (.so ファイルなどlibgcc_c.so.1
) をロードせずに uClibc にリンクし、完全なスタック トレース (命令ポインターのみ) を生成できるようにする必要があります。そのような実装はどこで利用できますか?
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
これは、境界チェックや健全性チェックなしで、盲目的にフレーム チェーンを上っていくだけです。それよりも安全なものを使いたい。
gcc -fomit-frame-pointerでコンパイルされた関数では、glibc backtrace(3)でさえフレームが表示されないことに注意してください。これは必要ないと判断しました。