13

gccを使用してリリースビルドを実行すると(つまり、指定しません-g)、バイナリにシンボルが含まれるようになりstrip、それらを削除するために使用する必要があります。実際、関数にブレークポイントを設定し、gdbでバックトレースを取得できます(行番号はありませんが)。

これは私を驚かせました-なぜこれが起こるのか誰かが説明できますか?

例えば

#include <stdio.h>

static void blah(void)
{
    printf("hello world\n");
}
int main(int argc, char *argv[])
{
    blah();
    return 0;
}

gcc -o foo foo.c

nm foo | grep blah

08048374 t blah

4

2 に答える 2

11

デバッグシンボルとリンカーシンボルには大きな違いがあります。デバッグシンボルは、コードの場所などをソースファイル名や行番号、およびデバッガーやプロファイラーなどに役立つその他のさまざまな便利なものにマップします。リンカーシンボルは、コード内のさまざまなエントリポイントやその他の重要な場所のアドレスを定義するだけです。実行可能ファイルを完全に匿名にしたい場合はstrip、これまで見てきたように、を使用する必要があります。

于 2010-03-22T09:55:26.177 に答える
6

これはGCCのデフォルトの動作です。デバッグ情報を含めることと、何も含まないことの間の半ば有用な妥協点。もちろん、ストリッピングがデフォルトであるべきだと主張することもできますが、それはとにかくそれを制御するためにコマンドを追加-sまたは使用するだけの問題です。strip

于 2010-03-22T09:58:24.907 に答える