2012-03-13 2 views
11

나는 this article on PLT (Process Linkage Table) and GOT (Global Offset Table)을 읽고 있습니다. PLT의 목적은 분명하지만 GOT에 대해서는 여전히 혼란 스럽습니다. 이 글에서 이해할 수있는 것은 GOT가 공유 라이브러리에서 extern으로 선언 된 변수에만 필요하다는 것입니다. 공유 라이브러리 코드에서 static으로 선언 된 전역 변수의 경우 필수는 아닙니다.프로세스 연결 테이블 및 전역 오프셋 테이블

내 이해가 맞습니까, 아니면 완전히 요점을 놓치고 있습니까?

답변

16

아마도 혼란은 extern의 의미입니다. 기본 연결은 extern이므로 static 키워드없이 함수 범위 외부에 선언 된 변수는 extern입니다.

GOT가 필요한 이유는 공유 라이브러리가 생성 될 때 공유 라이브러리 코드가 액세스하는 변수의 주소를 알 수 없기 때문입니다. 라이브러리가로드되는로드 주소 (정의가 라이브러리 자체에있는 경우) 또는 변수가 정의 된 제 3 자 코드 (정의가 다른 위치에있는 경우)에 따라 다릅니다. 따라서 코드에 주소를 인라인으로 넣는 대신 컴파일러는 공유 라이브러리의 GOT를 읽는 코드를 생성 한 다음 런타임에 GOT에서 주소를로드합니다.

변수가 동일한 공유 라이브러리 내에서 정의 될 공지 (그것은 static있어 또는 hidden 또는 protected 시야가 사용 특성 때문에 하나)를 라이브러리의 코드 어드레스 상대가 고정 될 수 있다면 공유 라이브러리 파일이 생성 된 시간 이 경우 GOT를 통해 조회를 수행하는 대신 컴파일러가 프로그램 카운터 상대 주소 지정을 사용하여 변수에 액세스하는 코드를 생성합니다. 런타임 및로드 타임 모두에서 비용이 적게 듭니다 (전체 심볼 룩업 및 재배치 프로세스가로드 시간에 건너 뛸 수 있기 때문에).

+0

gcc가 정적 변수에 대해 GOT를 통해 검색을 수행하도록하는 방법에 대한 아이디어가 있으십니까? –

+0

나는 길을 생각할 수 없다. 왜 그걸 필요로합니까? –

+0

위치 독립적 실행 파일로 ARM 프로세서 용 응용 프로그램을 만들려고하고 있으며 정적 변수를 제외하고 모두 잘 작동합니다. 문제는 .text 섹션과 .data/.bss 섹션에 다른 재배치 오프셋이 있기 때문에 GOT를 통한 액세스가 정상적으로 작동하는 동안 정적 변수에 대한 PC 상대 액세스가 작동하지 않는다는 것입니다. –