다음과 같은 로컬 정적 변수가 있습니다.
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
매뉴얼 페이지를 더 잘 찾을 수도 있습니다.