나는 기호 테이블이 ELF의 .data 섹션과 어떻게 관련되어 있는지 이해하려고 노력하고 있습니다. 먼저 몇 가지 가정을 기초로 시작합니다.
기호는 함수나 변수를 사람이 읽을 수 있는(또는 "소스 파일에 작성된 대로") 표현한 것으로, 실제 이진 값(CPU가 작동하는 값)에 매핑됩니다.
여기에 예가 있습니다.
//simple.c
int var_global_init = 5;
int main(void)
{
return 0;
}
빌드하고 바이너리를 확인해 봅시다:
$ gcc simple.c -o simple
$ objdump -t simple | grep var_global_init
0000000000201010 g O .data 0000000000000004 var_global_init
.data
ELF 파일 섹션의 기호를 나열합니다. 20페이지ELF 문서
이 부분을 다음 .data
과 같이 정의합니다.
이 섹션에는 프로그램의 메모리 이미지에 기여하는 초기화 데이터가 들어 있습니다.
글쎄, 그건 적절하다. 그래서 나는 나 자신에게 물었다 Does this mean that the symbol table is embedded in the .data section?
. 그러나 다음 예는 이를 반증하는 것 같습니다.
$ readelf -s simple
Symbol table '.symtab' contains 66 entries:
....
50: 0000000000201010 4 OBJECT GLOBAL DEFAULT 23 var_global_init
readelf
.symtab
ELF에 이 기호를 보관하는 전용 섹션이 있음 을 나타냅니다 .
이 .data
섹션에는 실제 기호 테이블이 필요합니까? 첫 번째 예는 data
섹션에 하나가 있다는 것을 보여 주지만 이진 값만 수행할 수 있어야 하는 것 아닌가요?
검사를 통해 hexdump
단 하나의 항목만 감지할 수 있으므로 내 개념이 잘못되었거나 일부가 거짓말을 하고 있습니다. :)
답변1
이 .data
섹션에는 데이터 자체가 포함되어 있습니다.즉값 5 를 보유하는 4바이트입니다 int
. 이 .symtab
섹션에는 기호,즉바이너리 파일의 각 섹션 이름은 해당 var_global_init
섹션 .data
에 저장된 4바이트를 가리킵니다.
이것이 바로 하나의 항목, 즉 기호 테이블에 하나의 기호만 표시되는 이유입니다. 그러나 이름을 값으로 변환하려면 다음 두 부분이 필요합니다. 기호 테이블은 기호에 해당하는 값을 찾을 위치를 알려주고 var_global_init
데이터 부분에는 해당 값에 대한 저장 공간이 포함됩니다.