Arm

readelf 符號表名稱中的數字是多少?

  • September 27, 2018

我有一個局部靜態變數,如下所示:

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 工具,但我想,這對於其他平台也是一樣的)謝謝!

這不是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; 也許你會發現它的手冊頁更好。

引用自:https://unix.stackexchange.com/questions/471792