readelfシンボルテーブル名の数字は何ですか?

readelfシンボルテーブル名の数字は何ですか?

次のローカル静的変数があります。

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マニュアルページをよりよく見つけることができます。

関連情報