나는 작업중인 프로젝트의 makefile을 정리하고있다. 프로젝트에 실행 파일과 공유 라이브러리가 있습니다. 둘 다 객체 파일로 개별적으로 컴파일되는 동일한 소스 파일 중 일부를 사용합니다. 공유 라이브러리에서 이러한 객체를 사용할 수 있으려면 gcc에서 -fPIC (position independent code) 플래그를 사용해야합니다. 실행 파일에 사용되는 -fPIC을 사용하여 개체를 컴파일 할 때 어떤 영향이 있습니까?실행 파일에서 gcc -fPIC 플래그를 사용하여 객체를 컴파일하면 그 의미는 무엇입니까?
답변
위치 독립적 코드를 컴파일 할 필요가없는 경우 일부 플랫폼에서는 성능 저하가 발생합니다 (특히 PIC가 PIC가 아닐 때보다 자유롭게 사용할 수있는 레지스터를 빼앗기 때문에 가장 많이 등록 된 x86 아키텍처) 그렇지 않으면 해를 끼치 지 않아야한다.
또한 위치 독립적 코드로만 빌드 된 위치 독립적 실행 파일 (-fPIE
)을 만들 수도 있습니다.
즉, libtool은 컴파일하는 각 소스 파일에 대해 PIC 및 PIC가 아닌 개체를 자동으로 생성 할 수 있으며 libtool 통합없이 빌드 시스템에서도 동일한 작업을 쉽게 수행 할 수 있습니다.
PIC는 x86에서 레지스터를 삭제하지 않습니다. 이 CPU에는 위치 간접 코드가 없으므로 항상 데이터/함수에 간접 참조가 추가됩니다. 코드를 지정하지 않으면 빠른 코드를 얻고 링커가 각 실행 파일의 코드 세그먼트를 복제하기 때문에 x86에서 -fPIC을 완전히 잊어 버릴 수 있습니다. – Lothar
@Lothar 컴파일러에 따라 x86-32에서 PIC는 레지스터를 제거합니다. 5.0 이전의 GCC는'% ebx'를 예약하여 일반 용도로 사용할 수 없게 만듭니다. https://gcc.gnu.org/bugzilla/show_bug.cgi?id=54232 – ephemient
- 1. GCC 인라인 어셈블리 코드에서 % c의 의미는 무엇입니까?
- 2. Firefox에서 event.srcElement가 작동하도록하려면 어떻게해야합니까? 그 의미는 무엇입니까?
- 3. PostgreSQL 테이블은 출력을 설명하며, 그 의미는 무엇입니까?
- 4. 로컬 파일에서 XMLHttpRequest 실행 허용
- 5. CSS 파일에서 $ {imagepath}의 의미는 무엇입니까?
- 6. make 파일에서 $ <와 $ @의 의미는 무엇입니까?
- 7. LLVM/Clang으로 컴파일하면 GCC 4.2가 아닌 충돌이 발생합니다.
- 8. SWIG에서 C++ 최적화 플래그를 사용하는 방법은 무엇입니까?
- 9. 메모장에서 gcc 실행 ++?
- 10. c89 및 c99로 컴파일하면 gcc 4.4.2가 기본값으로 c99가됩니까?
- 11. OS/X에서 컴파일시 컴파일 플래그를 결정하는 방법은 무엇입니까?
- 12. 왜 GCC를 사용하여 공유 객체를 컴파일하면 main에 대한 정의되지 않은 참조가 생깁니 까?
- 13. 인터페이스와 그 객체를 구현하는 모든 객체를 테스트해야합니까?
- 14. -g로 컴파일하면 코드가 느려 집니까?
- 15. gcc 컴파일 플래그
- 16. -o3로 컴파일하면 -o0이 정상적으로 동작합니다.
- 17. GCC 및 autotools를 사용하여 개별 소스 파일에 대해 컴파일 플래그를 설정하는 가장 좋은 방법은 무엇입니까?
- 18. 작은 C# 코드 라인을 읽고 그 의미는 무엇입니까
- 19. Python subprocess.Popen - GCC 플래그를 추가하면 "입력 파일 없음"오류가 발생합니다.
- 20. RewriteCond를 사용하여 플래그를 결합하는 방법은 무엇입니까?
- 21. "스로틀"이란 용어가 객체를 "조절"할 때의 의미는 무엇입니까?
- 22. -D_XOPEN_SOURCE의 의미/의미는 무엇입니까?
- 23. LINQ를 작성할 수 있다고했을 때 그 의미는 무엇입니까?
- 24. 기술 문서에서 무언가가 IP 인식임을 명시하면 그 의미는 무엇입니까?
- 25. 파이썬 스크립트에서 __name__에 사용할 수있는 값은 무엇이고 그 의미는 무엇입니까?
- 26. "#"또는 "#!"의 의미는 무엇입니까? 그 웹 사이트 URL에 나타납니다
- 27. -symbolic과 -shared GCC 플래그의 차이점은 무엇입니까? 문서의 설명에서
- 28. 어떻게 객체를 구성하고 그 구성
- 29. setup.py가 기본적으로 사용하는 컴파일러 (gcc) 플래그를 어떻게 무시할 수 있습니까?
- 30. 높은 수준의 SSE 플래그는 GCC/clang에서 낮은 SSE 플래그를 암시합니까?
GCC7에서는 이제 -fPIC로 컴파일 된 모든 것이 필요합니다. 나는 적어도 n 개의 에러를 얻었고 왜이 에러를 찾았는지에 대한 질문에서이 질문을 발견했다. – Lothar
@Lothar 아니, 일반적으로 요구하지 않는다. '-fPIC'의 유무에 상관없이 컴파일 된 객체입니까? – ephemient