>백엔드 개발 >C++ >정적 링크 및 Pthread를 사용하는 내 C 프로그램에서 분할 오류가 발생하는 이유는 무엇입니까?

정적 링크 및 Pthread를 사용하는 내 C 프로그램에서 분할 오류가 발생하는 이유는 무엇입니까?

DDD
DDD원래의
2024-10-26 11:14:021058검색

Why Does My C   Program With Static Linking and Pthreads Result in a Segmentation Fault?

g 정적 링크가 Pthread일 때 분할 오류 발생: 설명 및 해결 방법

문제:

pthread 라이브러리에 연결하기 위해 g 및 -pthread 플래그를 사용하여 C 프로그램을 컴파일할 때 정적으로(-static) 프로그램에서 세그먼트화 오류가 발생합니다.

설명:

  1. 약한 기호:

    • pthread 및 libstdc는 pthread_mutex_lock()과 같은 특정 기능에 약한 기호를 사용합니다.
    • 연결하는 동안 약한 기호는 강한 기호로 대체될 수 있습니다.
  2. 동적 연결과 정적 연결:

    • 동적 연결 연결하면 약한 기호는 공유 라이브러리에서 해결됩니다.
    • 정적 연결에서는 링커가 첫 번째 기호(약한 기호 포함)에서 중지하고 강한 기호를 검색하지 않습니다.
  3. 불완전한 링크 해결:

    • -static을 사용할 때 링커는 약한 기호를 먼저 발견하므로 pthread 라이브러리의 모든 기호를 고려하지 않습니다. .
    • 따라서 pthread_mutex_lock()에 대한 강력한 기호는 사용되지 않습니다.

해결책:

To 링커가 정적으로 링크된 프로그램에서 pthread 라이브러리의 모든 기호를 보도록 강제하려면 다음을 사용하세요.

g++ -o one one.cpp -Wall -std=c++11 -O3 -static -pthread \
    -Wl,--whole-archive -lpthread -Wl,--no-whole-archive
  • -Wl,--whole-archive: 모든 객체 포함 지정된 아카이브의 파일.
  • -lpthread: pthread 라이브러리에 대한 링크.
  • -Wl,--no-whole-archive: 후속 아카이브에 대한 전체 아카이브 옵션을 비활성화합니다.

추가 참고 사항:

  • 일부 시스템에는 librt의 경우 -lrt와 같은 추가 플래그가 필요할 수 있습니다. .
  • Autotools를 사용하는 경우 구성.ac에서 플래그를 정의하고 Makefile.am에서 이를 대체합니다. 예:
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)

mytarget_LDADD = @WL_WHOLE_ARCHIVE_HACK@ -lpthread @WL_NO_WHOLE_ARCHIVE_HACK@

위 내용은 정적 링크 및 Pthread를 사용하는 내 C 프로그램에서 분할 오류가 발생하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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