次のローカル静的変数があります。
void function(void) {
static unsigned char myVariable = 0;
...
readelfを使用して、次のようにシンボルテーブルをダンプします。
readelf -s myprogram.elf
次の内容を含むシンボルテーブルがありますmyVariable
。
...
409: 00412668 1 NOTYPE LOCAL DEFAULT 16 myVariable.9751
...
私の質問は:変数名とドットの後の数字はどういう意味ですか? readelf出力フォーマットに関する詳細なドキュメントはありますか?マニュアルページにはシンボルテーブルの形式に関する情報は含まれておらず、関連情報が見つかりません。 (私はXilinxのARM GNUツールを使用していますが、これは他のプラットフォームでも同じだと思います。)ありがとう!
答え1
readelf
これは出力のアーティファクトではなく、myVariable.9751
実際にはシンボルの名前です。さまざまなスコープ/関数で定義された静的変数を区別するために、コンパイラは何らかの方法で名前を装飾する必要があります。
$ cat a.c
static int var;
int foo(void){
static int var;
if(var++ > 3){ static int var; return var++; } else return var++;
}
int bar(void){ static int var; return var++; }
int baz(void){ return var++; }
$ cc -Wall -o - -S a.c | grep local.*var
.local var
.local var.1759
.local var.1760
.local var.1764
点(.
)はCの識別子の一部として使用できないため、var.num
他のカスタム変数と競合しません。
readelf ドキュメントの場合、マニュアルページとソースコードを読む以外の方法はありませんが、代わりにobjdump -tT
そのreadelf -s
マニュアルページをよりよく見つけることができます。