0

cygwin ホストで Linux を対象としたアプリをクロスコンパイルしました。プログラムは、ターゲット上でも gdbserver でも正常に実行されます。ただし、プログラムをステップ実行しようとすると、共有ライブラリ関数にステップインするたびにクラッシュします。バックトレース gdb 出力は次のとおりです。

(gdb) bt
#0 0x00000000004008f4 in ?? ()
#1 0x0000003f0380d7e4 in ?? ()
#2 0x00002b1373630000 in ?? ()
#3 0x00002b1373630590 in ?? ()
#4 0x00002b1373631348 in ?? ()
#5 0x00002b1373631888 in ?? ()
#6 0x0000003f03a1c510 in ?? ()
#7 0x0000000000000000 in ?? ()

関数にブレークポイントを設定して続行すると、クラッシュしません。

これは hello.c です。

void foo(int*);
int main()
{
    int a;
    foo(&a);
    return a;
}

x86_64-unknown-linux-gnu-gcc -g -c hello.c でコンパイル。

および foo.c:

void foo(int *i)
{
    *i = 2;
}

x86_64-unknown-linux-gnu-gcc -g -shared -Wl,-soname,libfoo.so -o libfoo.so foo.c でコンパイル。

リンクはx86_64-unknown-linux-gnu-gcc -Wl,-rpath, で行われます。libfoo.so hello.o -o こんにちは

4

2 に答える 2

1

私もそのような状況を見たことがありますが、あなたの例では再現できないようです(それでも、私はクロスコンパイルしませんでした)。それにもかかわらず、そのような状況に対処するためのヒント...

  • もちろん、まず、-O0 -ggdb3(-gだけでなく)を使用してコンパイルすることをお勧めします。
  • LD_BIND_NOW=1 gdb helloこのような遅延解決を無効にするために使用します。
  • それでも問題が解決しない場合はb foo、gdbで使用してからシングルステップを実行するか、通常どおり続行してfooで停止するのを待ちます。
于 2011-02-17T21:54:52.523 に答える
0

デバッグ フラグを使用して共有ライブラリをコンパイルしてみてください。

于 2011-02-17T15:29:09.597 に答える