> 백엔드 개발 > C++ > 본문

pthread를 g와 정적으로 연결하면 분할 오류가 발생하는 이유는 무엇이며 어떻게 해결할 수 있나요?

DDD
풀어 주다: 2024-10-25 20:05:29
원래의
735명이 탐색했습니다.

Why does statically linking pthread with g   cause a segmentation fault, and how can I fix it?

pthread를 정적으로 링크할 때 g가 분할 오류를 일으키는 이유는 무엇입니까?

해결책:

이 문제를 해결하려면, 다음 명령을 사용하십시오.

g++ -o one one.cpp -Wall -std=c++11 -O3 -static -lrt -pthread \
    -Wl,--whole-archive -lpthread -Wl,--no-whole-archive
로그인 후 복사

문제 이해:

pthread에 정적으로 링크하려면 약한 기호를 사용하므로 특정 접근 방식이 필요합니다.

약한 기호

ELF 파일(Unix에서 사용됨)은 강한 기호와 약한 기호를 구별합니다.

  • 강한: 동일한 이름을 가진 약한 기호를 재정의할 수 있습니다.
  • 약함: 강한 기호로 재정의할 수 있지만 다른 약한 기호로는 재정의할 수 없습니다.

pthread 및 약한 기호

GLIBC 및 pthread 스레드 안전성 기능에는 약한 기호를 사용합니다. 약한 기호 버전은 정적 라이브러리에 정의되고 강력한 기호 버전은 동적 라이브러리에 정의됩니다. 동적 연결 시에는 Strong 심볼을 사용하지만, 정적 연결 시에는 Weak 심볼을 Strong 버전으로 교체해야 합니다.

-Wl,--whole-archive 및 -Wl,--no- 사용 전체 아카이브

정적으로 링크할 때 링커는 아카이브의 첫 번째 기호를 보고 검색을 중지합니다. -Wl,--whole-archive 플래그는 링커가 약한 기호를 포함하여 아카이브의 모든 기호를 보도록 강제합니다. -Wl,--no-whole-archive 플래그는 후속 아카이브에 대해 이 옵션을 끕니다.

이러한 플래그를 사용하면 pthread 함수의 강력한 기호 버전이 실행 파일에 포함되어 문제를 해결하도록 할 수 있습니다. 약한 기호로 인해 발생하는 분할 오류 문제입니다.

위 내용은 pthread를 g와 정적으로 연결하면 분할 오류가 발생하는 이유는 무엇이며 어떻게 해결할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!