g 정적 링크 pthread 시 분할 오류가 발생하는 이유는 무엇입니까?
이 C 프로그램은 -pthread -o one one을 사용하여 동적으로 링크할 때 .cpp -Wall -std=c 11 -O3, 문제 없이 실행됩니다. 그러나 -pthread -o one one.cpp -Wall -std=c 11 -O3 -static을 사용하여 정적으로 연결하면 "세그먼트 오류"로 인해 충돌이 발생합니다.
문제 이해
-pthread를 사용하면 컴파일러가 자동으로 pthread 라이브러리에 연결됩니다. 단, 정적으로 링크할 경우 pthread 라이브러리를 포함하려면 -lpthread를 명시적으로 지정해야 합니다.
약한 기호
Unix에서 ELF 파일 형식은 다음과 같은 개념을 사용합니다. 연결하는 동안 강한 기호로 재정의될 수 있는 약한 기호. Glibc 및 pthread는 최적화된 버전으로 선택적으로 대체할 수 있는 기능에 약한 기호를 사용합니다.
이 경우 glibc는 __pthread_mutex_lock과 같은 동기화 기능에 약한 기호를 제공합니다. pthread가 동적으로 연결되면 약한 기호는 pthread의 강한 기호로 대체됩니다.
정적 연결 및 약한 기호
정적 연결 중에 링커는 다음 위치에서 중지됩니다. 약한 기호라 할지라도 가장 먼저 찾는 기호입니다. pthread 라이브러리의 모든 기호를 포함하려면 링커가 아카이브의 모든 개체 파일을 강제로 포함하도록 하는 Wl,--whole-archive 옵션을 사용해야 합니다.
해결책
문제를 해결하려면 다음 연결 명령을 사용하십시오.
g++ -o one one.cpp -Wall -std=c++11 -O3 -static -pthread \ -Wl,--whole-archive -lpthread -Wl,--no-whole-archive
부록: Autotools 해결 방법
Autotools를 빌드 시스템으로 사용하는 경우 Automake는 LDADD에서 옵션을 허용하지 않으므로 다음 해결 방법이 필요합니다.
configure.ac에서:
WL_WHOLE_ARCHIVE_HACK="-Wl,--whole-archive" WL_NO_WHOLE_ARCHIVE_HACK="-Wl,--no-whole-archive" AC_SUBST(WL_WHOLE_ARCHIVE_HACK) AC_SUBST(WL_NO_WHOLE_ARCHIVE_HACK)
Makefile.am에서:
mytarget_LDADD = @WL_WHOLE_ARCHIVE_HACK@ -lpthread @WL_NO_WHOLE_ARCHIVE_HACK@
위 내용은 `pthread`를 사용하는 C 프로그램이 정적으로 연결되면 \'세그먼트 오류\'와 함께 충돌이 발생하지만 동적으로 연결되면 제대로 작동하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!