1

uClibc を使用して、静的にリンクされた Linux 用の i386 バイナリをコンパイルしています。アドレスのスタック トレースを生成するバックトレースライブラリ関数は使用できません。代わりが必要です。

http://code.metager.de/source/xref/lib/eglibc/libc/sysdeps/i386/backtrace.chttps://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)でさえフレームが表示されないことに注意してください。これは必要ないと判断しました。

4

0 に答える 0