사실 저도 심볼 심볼만 하고 있었지 이 녀석이 무엇인지 어떤 역할을 하는지 잘 몰랐습니다.

저는 친절한 임베디드 시스템 블로그(http://recipes.egloos.com)를 참고 했습니다.

(개인적으로 굉장히 좋은 사이트라 생각합니다... 못 믿으시겠다면 어서 방문을 ㄱㄱㄱ)

 

http://recipes.egloos.com/5009181 여기를 보면 심볼에 대한 정보가 굉장히 잘 나와있습니다.

심볼이란 Linker가 쓰는 기본 단위로써, Link를 한 후 에는 자신만의 주소를 갖게 되는 특별한 단위를 말한다. 

(이 부분이 젤 중요합니다.)

위에 진하게 되어 있는 곳을 보죠. 그 중 빨간색이 가장 중요한데요. "자신만의 주소를 갖게 된다" 이 부분 입니다.. 

우리가 C로 프로그램을 짜고 디버깅을 할 때 생각해 보죠. 우리는 그 변수에 할당된 값들을 볼 수 있습니다.

 이 때 이것들의 주소가 없다면? 당연히 볼 수 없겠죠?? 하지만… 우리는 모든 변수들의 값들을 볼 수 있습니다. 

왜냐? 주소를 갖고 있기 때문입니다. 지역변수 들은 비록 EBP, ESP로 할당된 스택 프레임 안에 들어 있지만. 

일단은 주소를 갖고 있죠? 근데 이것들은 심볼이라는 것이 없습니다. 위에서 보면 "자신만의 주소"를 갖게 되는 특별한 단위라고 했는데 왜 심볼이 없냐 하면… 이 지역변수 주소는 "자신만의 주소"는 아니죠? 스택 프레임은 각 함수마다 할당되었다 사라졌다 합니다. 그 주소는 여러 변수에 의해서 계속 쓰이게 됩니다. 그래서 지역 변수는 "심볼이 없다"라고 볼 수 있겠네요.


이 분은 Symbol을 Global이라고 부르십니다(왠지 교주 찬양하는 것 같네요 -_ -;;). Global 은 프로그램이 시작하고 끝날 때까지 없어지지 않는 것들을 말하죠? 거기에 해당되는 것들이 뭐뭐 있을 까요? 함수, 전역변수, static 변수가 있죠? 위에서 말한 것 처럼 자신만의 주소를 갖게 되는 것도 이런 Global 밖에 없습니다. 나머지는 전부 stack, heap이죠…. 할당 되고 해제 되는…


자자 계속 할게요. Symbol의 이름은 그 Symbol이 갖는 메모리 영역의 시작 주소를 가리키는 Linker만의 pointer라고 하네요. 우리가 디버깅 할 때 VS에서는 자동으로 pdb 파일이 생성되죠?


(모른신다고 하면 안됩니다. 여기 증거가ㅋㅋ)


이때도 symbol의 이름이 사용된다고 합니다. 또한 우리가 C, CPP 파일을 컴파일 하면 object file(이 녀석은 소스 파일마다 생성됩니다.)


이 생성되는데 이 안에는 Linker를 위해서 symbol table을 놔둔다고 합니다. 여기 안에는 source code에 의해서 참조되는 symbol들의 이름과 위치 정보가 들어 있으며, 다른 파일에 정의되어 있는 symbol정보를 쓸 경우에는 그 정보가 해당 file에 없기 때문에 그 object 파일 안에 있는 symbol table은 완전하지 못하다고 하네요. 이런 불완전한 symbol들은 linker에 의해서 처리하여 다른 파일에 있는 symbol을 연결하여 사용할 수 있도록 만든다고 합니다. 이 symbol 정보들은 메모리에 올라오는 것이 아니며…. 오직 linker만이 이 정보들을 쓴다고 하네요. 그리고 binary(윈도우는 PE, 리눅스는 elf)로 만들어 질 때 이 symbol들을 주소로 모두 변환한다고 합니다. (네 그래서 native code안에는 symbol 정보가 없습니다.)

 

여기까지가 제가 공부한 내용이네요. 요약해서 뭔 말인가 하면. 이 symbol정보들은 global 한 정보들을 말하며 실제 실행 파일 안에는 들어가 있지 않다. 왜냐면 linker만 사용하기 때문에 그리고 실행파일로 만들 때 object file 안의 symbol 들을 모두 주소로 변환하니깐. 이제 좀 이해가 되기 시작하네요…(감사합니다 히언님ㅋ)

 

Bloger: moltak.net

'Programming > 이것저것' 카테고리의 다른 글

x86 Register  (0) 2010.04.30
어셈블리어 점프 명령어  (0) 2010.04.29
IL Code에 심볼 정보가 포함되는 이유  (0) 2010.04.24
초기화 하지 않은 메모리  (0) 2010.04.16
[Design Pattern] Singleton Pattern  (2) 2010.04.16

+ Recent posts