2014-11-28 3 views
0

정적 버전의 libgcc (libgcc.a)와 함께 정적으로 (--disable-shared를 사용하여), C 언어 만 (C++이 아님)에서 Mac OS X에 GCC 4.9.2를 빌드했습니다. 물론 libgcc의 정적 버전 만 만들었 기 때문에 libgcc * .dylib 같은 것이 없습니다. GCC는 libgcc.a를 빌드하고 설치했으며 (예상대로) 괜찮습니다. ,gcc가 libgcc_ext.10.5.dylib에 링크해야하는 이유는 무엇입니까?

-no_compact_unwind -lSystem -lgcc_ext.10.5 -lgcc -lSystem 

번호 : 그것은 기본적으로이 컴파일러 플래그를 보여줍니다

gcc -v test.c -o test 

: 이제 다음 명령을 사용하여 GCC의 새로 지은 사본 (! 간단한 안녕하세요, 세계 예제를 사용)를 호출 할 때 아니 아니! 나는 당신이 libgcc의 공유 버전에 링크하려고하지 않기를 바란다! 구성 단계에서 내가 말했던 것을 기억하지 못하니? 그리고 -static-libgcc 옵션을 사용하면 다음과 같이 나타납니다.

-no_compact_unwind -lgcc_eh -lgcc -lSystem 

libgcc_eh? 허? GCC 컴파일 중에 언제 만들어 졌나요? 아 맞아, 그렇지 않아, 왜 libgcc_eh.a를 찾을 수 없는지.

여기 무슨 일 이니? 저는 GCC에 공유 라이브러리가 필요 없다고 특별히 말했습니까? 그렇다면 왜 그것들이 디폴트로 링크하려고합니까? 물론, -nodefaultlibs를 사용하고 -lgcc 및 -lSystem을 수동으로 지정하여이 모든 문제를 해결할 수 있지만 왜 그렇게해야합니까?

또한, GCC 문서는이 말을 가지고

공유 라이브러리로 관하여 libgcc 제공하는 시스템에

-shared-관하여 libgcc -static-관하여 libgcc ,이 옵션의 사용을 강제로 공유 또는 정적 중 버전입니다. 컴파일러가 구성되었을 때 libgcc의 공유 버전이 빌드되지 않은 경우이 옵션은 아무 효과가 없습니다.

그래서 나는 GCC에 libgcc의 공유 버전을 빌드하도록 요청하지 않았다면 정적 버전 이외의 다른 것에 링크하려고한다고 가정해서는 안된다. 그러나, 어쨌든, 어떤 이유로, 그것은 않습니다. 나는 이것을 막을 수있는 configure 옵션을 찾지 못했고, 어떤 "기본 라이브러리"가 기본적으로 링크되도록 지정할 수있는 옵션도 찾을 수 없었습니다. GCC가 -nodefaultlibs를 사용하여 이것을 억압하지 않으면 libgcc의 공유 버전에 링크하도록 강요하고있는 것 같습니다. 이것은 거꾸로 보인다.

+0

왜 downvote? – Synthetix

답변

0

이 문제를 해결하는 방법을 알았습니다. GCC 소스에서 /gcc/config/darwin.h를 편집하고 REAL_LIBGCC_SPEC 매크로가 정의 된 곳을 주석 처리해야했습니다. 이 매크로를 정의하지 않고 남겨두면 GCC는 연결 중에 -lgcc 및 -lSystem 라이브러리 플래그 만 전달할 것입니다. 이는 내가 원하는 것입니다. 컴파일 드라이버

GCC는 워드 프로세서는 이것과 다른 매크로가하는 일을 설명 :

https://gcc.gnu.org/onlinedocs/gccint/Driver.html

- 매크로 : LIBGCC_SPEC 하는 방법과 때를 배치 GCC 드라이버 프로그램을 알려줍니다 또 다른 C 문자열 상수 링커 명령 행에 libgcc.a에 대한 참조. 이 상수는 LIB_SPEC의 값 전후에 배치됩니다. 이 매크로가 정의되어 있지 않으면 GCC 드라이버는 문자열 -lgcc를 링커에 전달하는 기본값을 제공합니다.

- 매크로 : ENABLE_SHARED_LIBGCC가 정의되어있는 경우 REAL_LIBGCC_SPEC 기본적으로는 LIBGCC_SPEC 직접 드라이버 프로그램에서 사용하지 않는 대신 명령 행의 값에 따라 libgcc.o로의 다른 버전을 참조하도록 수정 flags -static, -shared, -static-libgcc 및 -shared-libgcc가 있습니다. 이러한 수정이 부적절한 대상에서는 대신 REAL_LIBGCC_SPEC를 정의하십시오. REAL_LIBGCC_SPEC는 링크 명령 행에 libgcc에 대한 참조를 배치하는 방법을 드라이버에게 알려주지 만 LIBGCC_SPEC과 달리 수정되지 않은 상태로 사용됩니다.

관련 문제