web-dev-qa-db-ja.com

シンボルテーブルとは何ですか?実行可能ファイルにどのように統合されますか?

実行可能ファイルをデバッグしようとしたとき:

(gdb) break +1
No symbol table is loaded.  Use the "file" command.

それは正確にはどういう意味ですか?

シンボルテーブルは実行可能ファイルに追加されていますか?

16
user198729

Gdbが使用するシンボルのセットは2つあります。

-gセットはデバッグシンボルであり、デバッグ中にコードを確認したり変数を確認したりできるため、作業が非常に簡単になります。

コンパイル時に、デフォルトで別のシンボルセットが含まれます。これらはリンクシンボルであり、ELF(実行可能リンク可能フォーマット)シンボルテーブルに存在します。これには、デバッグシンボルよりもはるかに少ない情報が含まれていますが、実行可能ファイル(またはライブラリやオブジェクトファイル)内のもののアドレスなど、最も重要なものが含まれています。この情報がないと、gdbはmainがどこにあるかさえ知らないため、(gdb) break mainは失敗します。

デバッグシンボル(-g)がない場合でも、(gdb) break mainを実行できますが、gdbにはソースファイルのコード行の概念がありません。コードをステップ実行しようとすると、一度に1行ではなく、一度に1つのマシン命令のみを進めます。

Stripコマンドは、実行可能ファイル(または他のオブジェクトファイル)からシンボルをstripオフするためによく使用されます。これは、誰かに記号を見せたくない場合や、ファイルのスペースを節約したい場合によく使用されます。シンボルテーブルは大きくなる可能性があります。 Stripは、デバッグシンボルとリンカーシンボルの両方を削除しますが、削除するものを制限できるコマンドラインスイッチがいくつかあります。

プログラムでfileコマンドを実行すると、天気かどうかがわかり、実行可能ファイルが削除されていることがわかります。

$ gcc my_prog.c -o my_prog
$ file my_prog
my_prog: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.15, not stripped
$ strip my_prog
my_prog: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.15, stripped
$
22
nategoose

これは、デバッグをオンにしてコンパイルしなかったためです。 gcc -gfile.cを試してください

8
rkulla

シンボルテーブルには、元のソースコードファイル内のどのシンボル(関数名や変数名など)に対応するメモリ位置をデバッガーに通知するデバッグ情報が含まれています。シンボルテーブルは通常、実行可能ファイル内に保存されます。

gdbは、そのテーブルが見つからないと言っています。 gccを使用してコンパイルした場合、-gフラグを使用しない限り、ファイルにシンボルテーブルは含まれません。最も簡単な方法は、おそらく-gを使用してファイルを再コンパイルすることです。 gdbは、シンボルテーブル情報を自動的に検出する必要があります。

Gccのコマンドライン引数またはプログラムのコンパイルに使用したMakefileに-gフラグを追加します。 (多くの場合、Makefile内にCFLAGSなどと呼ばれる変数があります)。

任意のサードパーティプログラムをデバッグしようとすると、多くの場合、情報がプログラムから「削除」されます。これは、リバースエンジニアリングを困難にし、実行可能ファイルのサイズを小さくするために行われます。ソースコードにアクセスでき、プログラムを自分でコンパイルできない限り、gdbを使用するのは非常に困難です。

2
RarrRarrRarr

アプリケーションのエントリポイントを見つけます。

objdump -f main

    main:     file format elf32-i386
    architecture: i386, flags 0x00000112:
    EXEC_P, HAS_SYMS, D_PAGED
    start address 0x08048054

Gnuデバッガーを使用してそこにブレークポイントを設定します

gdb

    exec-file main
    break *0x8048054
    set disassemble-next-line on
    run

次に、コードをステップスルーします

gdb

    stepi

特記事項

最新バージョンのUbuntuを使用している場合、これによる影響はありませんが、Ubuntu 10.04以前を実行している場合は、このバグが発生する可能性があります。

https://bugs.launchpad.net/ubuntu/+source/gdb/+bug/151518G

解決策は、エントリポイントアドレスプラス1でデバッグを開始することです。

1
Elite Mx