심볼 해석에 대해서
글쓴이: declspec / 작성시간: 금, 2011/04/29 - 12:38오후
리눅스든 윈도우즈든
링커가 심볼을 해석할때...(심볼을 해석하는 주체는 링커 맞죠?)
심볼을 해석한다는 의미는 결국
아스키 코드의 문자열로 되어있는
함수명 또는 변수명(이것 외에도 심볼이 있나요?)
에 대해서 그것이 메모리상에 존재하는
가상메모리주소를 연결해주는 것이죠?
요컨대 소스파일에서
void hello(){}
void main(){
hello();
}
이런 게 있는경우
hello를 호출하는 부분에서
어셈블러의 입장을 생각하면
CALL ?; // call hello()
CALL 로 함수호출을 할때 어떤 주소를 불러줘야 할지
모르겠죠?
이것을 hello 의 시작 메모리 주소 값을 찾아서 넣어주는게
링커가 하는 일인것이죠?
그런데 동적 라이브러리의 경우 이게 어떻게 수행될까요?
즉 동적 라이브러리에 hello 의 실행코드가 존재할 경우에
그것을 참조하는 프로그램의 경우
CALL ?; // call hello()
여기서 ? 부분에 뭐가 들어가게되나요?
임시로 뭔가 다른게 들어가있을것같은데...
PLT 나 GOT 가 상관있나요?
연관되는건지...
조언 부탁합니다
Forums:
프로그램 하나 만들어서 objdump -D 하면 대충
프로그램 하나 만들어서 objdump -D 하면 대충 다 나옵니다만...
.plt섹션에 있는 어떤 코드를 호출하죠.
여기서는 다이나믹링커가 해당 함수를 찾을수 있도록 하는 루틴으로 점프합니다.
점프해서 찾으면 GOT도 변경하고 해요. ELF스펙을 한번 읽어보세요.
감사합니다
좋은답변 감사합니다~
자기실력이 좋다고 느껴지는건 공부를 안하고 있다는 신호.
댓글 달기