>백엔드 개발 >C++ >`pthread`를 사용하는 C 프로그램이 정적으로 연결되면 \'세그먼트 오류\'와 함께 충돌이 발생하지만 동적으로 연결되면 제대로 작동하는 이유는 무엇입니까?

`pthread`를 사용하는 C 프로그램이 정적으로 연결되면 \'세그먼트 오류\'와 함께 충돌이 발생하지만 동적으로 연결되면 제대로 작동하는 이유는 무엇입니까?

Linda Hamilton
Linda Hamilton원래의
2024-11-02 00:46:02423검색

Why does my C   program using `pthread` crash with a

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.