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매뉴얼 페이지를 더 잘 찾을 수도 있습니다.

관련 정보