2016-06-15 3 views
1

나는 JIT compiler for the virtual machine in ioquake3을 유지 관리하고 있습니다.PIC/PIE 바이너리의 전역 심볼 테이블 (GOT) 주소

최근에 누군가 ioquake3에서 PIE 바이너리를 작성하려고했지만 컴파일 된 코드는 PIC 코드에서 EBX 레지스터를 광범위하게 사용하므로 PIE 바이너리는 GOT 주소가 포함 된 고정 레지스터 인 것으로 보입니다.

가상 머신이 고정 점에서 GCC 컴파일 코드를 호출 할 수 있으므로 EBT를 GOT 주소로 복원해야합니다. JIT 컴파일러 코드는 EBX를 해당 주소로 복원하는 코드를 내보낼 수 있도록 GOT 주소를 알아야합니다. 내가 직접과 같이 인라인 어셈블리를 사용할 수 상상 : EBX는 JIT 컴파일에서와 VM에 전화에서 동일해야하므로

void *gotptr; 

__asm__ volatile("\n": "=b" (gotptr)); 

컴파일 된 코드를 직접 JIT 컴파일러의 코드에서 호출됩니다. 내 질문은 :이 작동하고 C 코드에서 GOT 주소를 검색 할 수있는 다른 방법입니다, 예를 들어, 해당 주소를 지정하는 기호가 정의되어 있습니까? 또는이를 반환하는 함수가 있습니까?

+0

EBX를 복원 할 필요가 없습니다. PIC 컴파일 된 함수를 설정하는 함수의 시작 부분에 있어야합니다. (예를 들어'__x86.get_pc_thunk.bx'에 대한 호출). –

+0

너는 옳은 암소 야. 각각의 PIC 객체는 자체 심볼 테이블을 가지고 있기 때문에 이해할 수 있습니다. 답을 추가하면 받아 들일 것입니다. –

답변

3

System V i386 ABI에서 필요한 경우 EBX를 설정하기 위해 함수의 책임이 있으므로 PIC/PIE 컴파일 함수를 호출 할 때 복원 할 필요가 없습니다. ABI의이 상태로 :

위치 독립적 인 코드는 주소 전역 옵셋 테이블의 을 유지하기 위해 %ebx 레지스터를 사용합니다. 함수가 전역 오프셋 테이블의 주소를 직접 또는 간접적으로 필요로하는 경우 값을 계산해야합니다.