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也许你会发现它的手册页更好。

相关内容