2013-06-10 2 views
1

절대 참조, 공유 라이브러리 및 위치 독립적 코드의 재배치에 대해 혼란스러워합니다. 나는 아직 개별 processess 주소 공간에 대해 충분히 알지 못한다고 가정한다.링커, 절대 참조 및 프로세스 주소 공간

필자의 저서에서 저자는 글로벌 변수/기능의 주소 인 런타임을 삽입하여 절대 기호 참조를 해결하는 링크에 대해 이야기합니다. 링커는 이것을 어떻게 알 수 있습니까? 내가 컴파일, 링크, 내 실행 파일을 만들고, N 개의 다른 시간을 실행할 수 있습니다. 나는 그것이 메모리의 동일한 장소에 매번로드되지 않을 것이라고 생각합니다. 그래서 링커가 어떻게 절대 런타임 주소를 알 수 있습니까? 변수/함수?

답변

1

링커는 가상 주소를 처리합니다. 절대 주소는 절대 가상 주소입니다.

각 프로세스 인스턴스는 완전히 동일한 가상 주소 공간을 갖습니다.

+0

그래, 내가 생각했던거야. 그러나 이것은 질문을 제기합니다 : 모든 코드가 위치 독립적 인 이유는 무엇입니까? 프로그램이로드 될 때마다 동일한 가상 주소 공간을 갖는 경우 프로그램이 실제로로드되는 위치가 중요한 이유는 무엇입니까? 즉 모든 프로그램이 직위에 독립적이지 않아야합니까? – gone

+0

나는 당신을 쫓고 있는지 잘 모르겠다. 그러나 실행 가능 코드의 사전 링크 개념과 위치 독립적 코드 등을 실행 파일의 주소 공간에 대한 사후 링크 개념과 혼합하는 것이 가능합니다. 개별 개체 파일에 대해 생성 된 코드는 재배치 또는 위치 독립적 일 수 있습니다. 전자는 재배치 프로세스를 사용하여 링커에서 주소 공간의 아무 곳에 나 배치 할 수 있습니다. 후자는 주소 공간의 아무 곳에 나 배치 할 수 있으므로 아무런 조치가 필요 없습니다. 이러한 개체가 배치되면 (함께 링크 된 경우) 실행 파일에는 고정 된 가상 주소 공간이 있습니다. – Ziffusion

+0

확인. 그래서 공유 라이브러리에 대해 위치 독립적 코드에'-fPIC' 플래그를 사용하면 어떻게 될까요? 공유 라이브러리는 실제 메모리에 한 번만 존재하지만 여러 프로세스의 가상 주소 공간에있는 임의의 위치에 매핑 될 수 있습니까? – gone

1

당신 말이 맞습니다. 일반적으로 링커는 절대 주소를 모르고 변동 가능 주소라는 것을 생성합니다. 매우 단순한 모델의 경우 변동 가능 주소는 실행시 절대 주소에 바인딩됩니다.

+0

무엇이 변동 가능 주소를 변경합니까? 로더? 이해가 안됩니다. – gone

+0

운영체제에 대한 책을 참고하고 가상 메모리 장을 찾아 보시기 바랍니다. 일반적으로 최종 주소 바인딩에 대한 하드웨어 지원이 필요합니다. – unxnut