8

dlopen() 내에서 초기화 된 라이브러리가 주 프로그램이 소유 한 정적 변수를 초기화하는 이유를 아는 사람이 있습니까? 주 프로그램과 공유 라이브러리는 모두 정적 변수의 복사본을 가지고 있지만, 어떤 이유로 공유 라이브러리는 주 프로그램의 정적 변수 복사본을 다시 초기화하고이를 파괴하여 주 프로그램이이를 파괴하려고 시도 할 때 세그 폴트를 발생시킵니다.주 프로그램 및 공유 라이브러리는 __static_initialization_and_destruction_0에서 동일한 정적 변수를 초기화합니다.

기호 테이블에서 잘못된 이름을 잘못 범하는 경우입니까?

답변

7

이는 런타임 링커가 프로세스에서 심볼의 활성 복사본 하나만 필요로하는 경우입니다. 공유 객체와 실행 파일 모두에 심볼 사본이 있으면 런타임 링커는 그 중 하나에 대한 모든 참조를 확인합니다.

이 문제를 해결하기 위해 할 수있는 일은 공유 객체를 빌드 할 때 링크 편집기의 version command을 사용하여 심볼 축소를 사용하는 것입니다. 정적 변수의 심볼이 전역 변수가 아니므로 원하는 동작을 얻을 수 있는지 확인하십시오.

+0

님, 버전 스크립트를 구현하고 링커에 전달하는 데 문제가있는 것 같습니다. 구문 오류에 대해 불평하고 있습니다. 다음은 내가 사용한 스크립트 파일입니다. "{global : local : *;}"어떤 아이디어입니까? 예제를 찾았지만 모두 구문 검사에 실패한 것 같습니다. 또는 __asm__ 지시문을 소스에 직접 저장하는 것이 더 좋습니까? – Paul

+0

@ Paul - 내 스크립트는 'VERSION {{global : ...; 지역 *; }; }'링커 명령 행에서 그 파일의 파일 이름을 사용합니다. –

+0

@ Samuel - 감사합니다. 버전 스크립트를 완성하고 글로벌 컨텍스트에 몇 가지 심볼을 추가 한 후 이제는 작동합니다! – Paul

관련 문제