심볼 테이블이란?


87

누군가 C 및 C ++ 컨텍스트 내에서 기호 테이블이 무엇인지 설명 할 수 있습니까?

답변:


81

여기에 기호 테이블의 두 가지 공통적이고 관련된 의미가 있습니다.

첫째, 개체 파일에 기호 테이블이 있습니다. 일반적으로 C 또는 C ++ 컴파일러는 단일 소스 파일을 .obj 또는 .o 확장자를 가진 개체 파일로 컴파일합니다. 여기에는 링커가 작업 응용 프로그램 또는 공유 라이브러리로 처리 할 수있는 실행 코드 및 데이터 모음이 포함됩니다. 개체 파일에는 개체 파일의 여러 항목을 링커가 이해할 수있는 이름으로 매핑하는 심볼 테이블이라는 데이터 구조가 있습니다. 코드에서 함수를 호출하면 컴파일러는 루틴의 최종 주소를 객체 파일에 넣지 않습니다. 대신 자리 표시 자 값을 코드에 넣고 링커가 처리중인 모든 개체 파일에서 다양한 기호 테이블의 참조를 조회하고 거기에 최종 위치를 고정하도록 지시하는 메모를 추가합니다.

둘째, 공유 라이브러리 또는 DLL에 기호 테이블도 있습니다. 이것은 링커에 의해 생성되며 라이브러리 사용자에게 표시되는 모든 함수 및 데이터 항목의 이름을 지정하는 역할을합니다. 이를 통해 시스템은 런타임 링크를 수행하여 라이브러리가 메모리에로드 된 위치에 대한 해당 이름에 대한 열린 참조를 확인할 수 있습니다.

더 배우고 싶다면 John Levine의 훌륭한 책 "Linkers and Loaders"를 제안합니다. 링크 텍스트


Hi Ben, 두 번째 경우에는 내보내기 테이블을 참조하고 있습니까? 즉, 내보내기 테이블이 기호 테이블의 특별한 경우입니까? 아니면 관련이없는 개념입니까?
Pooven

안녕하세요. 나는 그것이 어떤 개체 파일에 있지 않지만 그들로부터 참조되었다고 믿습니다. 둘째, "최종 위치"가 의미하는 바를 좀 더 설명해 주시겠습니까? 소스 코드의 실제 주소 또는 최종 상대 주소입니다.
stdout

26

간단히 말하면 유형, 범위 및 크기와 같은 메타 데이터를 포함하여 메모리의 주소에 변수를 할당하는 이름의 매핑입니다. 컴파일러에서 사용합니다.

일반적으로 C [++] *가 아닙니다. 기술적으로 항상 직접 메모리 주소를 포함하지는 않습니다. 컴파일러가 목표로하는 언어, 플랫폼 등에 따라 다릅니다.


"항상 직접 메모리 주소를 포함하지는 않는다"고 말하면서 주소의 내용을 언급하는 것이 매우 중요하다고 생각합니다.
stdout

13

Linux에서는 다음 명령을 사용할 수 있습니다.

nm [객체 파일]

해당 개체 파일의 기호 테이블을 나열합니다. 이 출력물에서 사용중인 링커 기호를 잘린 이름 에서 해독 할 수 있습니다 .


8

기호 테이블은 프로그램 / 유닛의 "기호"목록입니다. 기호는 대부분 변수 또는 함수의 이름입니다. 심볼 테이블은 메모리에서 변수 또는 함수가 위치 할 위치를 결정하는 데 사용할 수 있습니다.



0

심볼 테이블은 변수 이름, 함수 이름, 개체, 클래스, 인터페이스 등과 같은 다양한 개체의 발생에 대한 정보를 저장하기 위해 컴파일러에서 만들고 유지 관리하는 중요한 데이터 구조입니다.


링커와 어셈블러는 심볼 테이블도 다룹니다 (종종 컴파일러보다 간단 함).
Basile Starynkevitch
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.