ELF .data 섹션의 기호 테이블

ELF .data 섹션의 기호 테이블

나는 기호 테이블이 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

.dataELF 파일 섹션의 기호를 나열합니다. 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.symtabELF에 이 기호를 보관하는 전용 섹션이 있음 을 나타냅니다 .

.data섹션에는 실제 기호 테이블이 필요합니까? 첫 번째 예는 data섹션에 하나가 있다는 것을 보여 주지만 이진 값만 수행할 수 있어야 하는 것 아닌가요?

검사를 통해 hexdump단 하나의 항목만 감지할 수 있으므로 내 개념이 잘못되었거나 일부가 거짓말을 하고 있습니다. :)

답변1

.data섹션에는 데이터 자체가 포함되어 있습니다.값 5 를 보유하는 4바이트입니다 int. 이 .symtab섹션에는 기호,바이너리 파일의 각 섹션 이름은 해당 var_global_init섹션 .data에 저장된 4바이트를 가리킵니다.

이것이 바로 하나의 항목, 즉 기호 테이블에 하나의 기호만 표시되는 이유입니다. 그러나 이름을 값으로 변환하려면 다음 두 부분이 필요합니다. 기호 테이블은 기호에 해당하는 값을 찾을 위치를 알려주고 var_global_init데이터 부분에는 해당 값에 대한 저장 공간이 포함됩니다.

관련 정보