我有一个局部静态变量,如下所示:
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
也许你会发现它的手册页更好。