6

as(アセンブラコードから)を使用してコンパイルされたオブジェクトファイルがあります。

ldを使用してリンクすると、 stepi(またはnexti )を実行しようとすると、gdbはアドレス0x0でのメモリアクセスについて文句を言います。gccを使用してリンクすると、すべて問題ありません。

この問題は、 gccのリンク結果と比較して生成されるセクションが少ないldが原因であると推測しています。

実行可能ファイルの何が問題になっているのかを理解できるように、gdbをより詳細に構成する方法はありますか?

(gdb) b main
Breakpoint 1 at 0x100000f8e
(gdb) r
Breakpoint 1, 0x0000000100000f8e in main ()
(gdb) x/10i $pc
0x100000f8e <main>: fbld   0x6c(%rip)        # 0x100001000 <data1>
0x100000f94 <main+6>: fimul  0x7a(%rip)        # 0x100001014 <data2>
0x100000f9a <main+12>: fbstp  0x60(%rip)        # 0x100001000 <data1>
0x100000fa0 <main+18>: mov0x0    $0x2000001,%rax
0x100000fa7 <main+25>: mov    $,%rdi
0x100000fae <main+32>: syscall 
(gdb) si
Cannot access memory at address 0x0
0x0000000100000f94 in main ()

PS:実行可能ファイル自体は、両方のバージョンで期待どおりに実行されます。

後で編集:コンパイルに使用したコマンド:

as -arch x86_64 src.s -o src.o
ld -e _main -arch x86_64 src.o -o src
gcc -o src src.o
4

2 に答える 2

2

gdbには「showdebug」コマンドがあり、さまざまな内部デバッグ設定を提供します。たとえば、「set debug target 1」は、gdbとターゲットプロセスとの相互作用のトレースをオンにします。あなたは彼らが持っているすべての旗を試してみたいかもしれません(それほど多くはありません)。

于 2010-12-04T00:13:03.190 に答える
1

GCCは実際にはリンクを実行せず、ユーザーに代わってldを呼び出すだけです。提供するオプションは、使用しているものとは異なる必要があります。

このスレッドごとに:

GCCリンカーコマンドを取得する方法は?

gcc -vを実行すると、ld呼び出しのコマンドラインが表示されるはずです。これで、ldコマンドラインを変更して問題が解決するようにする方法がわかります。

于 2010-12-04T17:59:29.733 に答える