Qual é o número no nome da tabela de símbolos de leitura?

1

Eu tenho uma variável estática local, algo assim:

void function(void) {
    static unsigned char myVariable = 0;
    ...

Eu despejo a tabela de símbolos usando o readelf da seguinte forma:

readelf -s myprogram.elf

e eu recebo a tabela de símbolos, que contém myVariable da seguinte forma:

...
409: 00412668     1 NOTYPE  LOCAL  DEFAULT   16 myVariable.9751
...

Minha pergunta é: o que significa o número depois do nome da variável e do ponto? E há alguma documentação detalhada sobre o formato de saída do readelf? A man page não contém informações sobre o formato da tabela de símbolos, e não consigo encontrar nada sobre isso. (Eu estou usando ferramentas ARM GNU da Xilinx, mas eu acho que isso é o mesmo para outras plataformas também) Obrigado!

    
por waszil 27.09.2018 / 12:12

1 resposta

1

Isso não é um artefato da saída de readelf ; myVariable.9751 é realmente o nome desse símbolo. Para distinguir variáveis estáticas definidas em diferentes escopos / funções, o compilador deve decorar seus nomes de alguma forma:

$ 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

Observe que o ponto ( . ) não pode ser usado em C como parte de um identificador, portanto var.num não colidirá com nenhuma outra variável definida pelo usuário.

Quanto à documentação de leitura, não há muito além da página de manual e lendo o código fonte; mas você também pode usar objdump -tT em vez de readelf -s ; talvez você ache a sua página de manual melhor.

    
por 27.09.2018 / 18:37