Arm
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 工具,但我想,這對於其他平台也是一樣的)謝謝!
這不是
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
; 也許你會發現它的手冊頁更好。