2009-07-22 2 views
10

나는 작업중인 프로젝트의 makefile을 정리하고있다. 프로젝트에 실행 파일과 공유 라이브러리가 있습니다. 둘 다 객체 파일로 개별적으로 컴파일되는 동일한 소스 파일 중 일부를 사용합니다. 공유 라이브러리에서 이러한 객체를 사용할 수 있으려면 gcc에서 -fPIC (position independent code) 플래그를 사용해야합니다. 실행 파일에 사용되는 -fPIC을 사용하여 개체를 컴파일 할 때 어떤 영향이 있습니까?실행 파일에서 gcc -fPIC 플래그를 사용하여 객체를 컴파일하면 그 의미는 무엇입니까?

+0

GCC7에서는 이제 -fPIC로 컴파일 된 모든 것이 필요합니다. 나는 적어도 n 개의 에러를 얻었고 왜이 에러를 찾았는지에 대한 질문에서이 질문을 발견했다. – Lothar

+0

@Lothar 아니, 일반적으로 요구하지 않는다. '-fPIC'의 유무에 상관없이 컴파일 된 객체입니까? – ephemient

답변

9

위치 독립적 코드를 컴파일 할 필요가없는 경우 일부 플랫폼에서는 성능 저하가 발생합니다 (특히 PIC가 PIC가 아닐 때보다 자유롭게 사용할 수있는 레지스터를 빼앗기 때문에 가장 많이 등록 된 x86 아키텍처) 그렇지 않으면 해를 끼치 지 않아야한다.

또한 위치 독립적 코드로만 빌드 된 위치 독립적 실행 파일 (-fPIE)을 만들 수도 있습니다.

즉, libtool은 컴파일하는 각 소스 파일에 대해 PIC 및 PIC가 아닌 개체를 자동으로 생성 할 수 있으며 libtool 통합없이 빌드 시스템에서도 동일한 작업을 쉽게 수행 할 수 있습니다.

+0

PIC는 x86에서 레지스터를 삭제하지 않습니다. 이 CPU에는 위치 간접 코드가 없으므로 항상 데이터/함수에 간접 참조가 추가됩니다. 코드를 지정하지 않으면 빠른 코드를 얻고 링커가 각 실행 파일의 코드 세그먼트를 복제하기 때문에 x86에서 -fPIC을 완전히 잊어 버릴 수 있습니다. – Lothar

+0

@Lothar 컴파일러에 따라 x86-32에서 PIC는 레지스터를 제거합니다. 5.0 이전의 GCC는'% ebx'를 예약하여 일반 용도로 사용할 수 없게 만듭니다. https://gcc.gnu.org/bugzilla/show_bug.cgi?id=54232 – ephemient

관련 문제