2014-10-11 2 views
0

왜 공유 라이브러리 로딩이 정적 변수를 손상시키는 지 설명 할 수 있습니까? 리눅스 (AltLinux, 오픈 수세)에공유 라이브러리 로딩시 정적 변수 손상

  • 출력 (는 MinGW를 사용하여) Windows에서 1 개 진정한 0
  • 출력 : 1 사실 1

Qt는 5.3.1 : https://github.com/ipostanogov/variables-destroyer

+0

Visual Studio 2013에서도 문제가 없습니다. – Serhiy

+2

SO 질문 (및 답변)은 자체 포함되어야하며, 링크가 끊어져도 의미가 있습니다. – hyde

+0

@hyde 9 개의 파일을 여기에 게시 하시겠습니까? 진심으로? 어쨌든'이 질문 개선하기 '버튼이 당신을 기다리고 있습니다. –

답변

0

은 상황에 따라 다르다 플랫폼 및 컴파일러에서. 한 가지 해결책은이 정적 변수를 코드의 예상 값으로 초기화하는 것입니다.

+0

QList는 이니셜 라이저를 지원하지 않으므로이 경우 std :: list를 사용해야합니다. 표준리스트는 std :: list처럼 초기화 될 수있다. Core :: stdList = {41, 42}; 하지만 어쨌든, 로딩 라이브러리는 정적 변수에 유창하지 않아야합니다. – Serhiy

+0

예상되는 값이 없습니다. 그것은 간단한 예입니다. 실제 단어 프로그램은 라이브러리에서 정보를 검색하고 정적 변수에 저장합니다. –

+1

@Serhiy : 왜 QList 목록 (QList () << 1 << 2 << 3)'이이 경우에 작동하지 않습니까? – user2672165

0

아마도 공유 라이브러리를로드 할 때 빈 목록과 함께 다른 핵심 복사본이있을 것입니다. 공유 라이브러리를로드 한 후에는 두 번째 복사본에 액세스 할 수 있습니다. 그렇지 않으면이 정적 목록이 두 번째로 초기화됩니다 (라이브러리를로드 한 후 다시 비워 둘 수 있습니다). 라이브러리가로드되기 전후에이리스트 주소를 비교해 보면 대답을 얻을 수 있습니다. 어쨌든 문제는 정적 변수의 두 인스턴스를 사용하는 것입니다.

0

동적 라이브러리가 프로그램을 작성하는 데 사용 된 것과 동일한 Qt 라이브러리에 연결되어 있는지 확인해야합니다. 이것은 QT가 바이너리 호환이기 때문에 문제가되어서는 안됩니다. 그러나 다른 ABI를 사용하여 최신 컴파일러 (mingw 4.8)로 전환 한 Windows에서이 오류가 많이 발생합니다. 어쩌면 이것은 당신이보고있는 효과 일 것입니다.

0

이 동작은 ld.so가 init 실행 가능 이미지 용으로 사용하는 전역 오프셋 테이블 (GOT) 때문에 발생합니다. 사실, 위의 예제에서 정적 필드는 두 번 초기화되었습니다. 실행 가능로드 중 첫 번째, 라이브러리로드 중 두 번째. "static_initialization_and_destruction"proc는 ld.lib의 "dl_init_internal"프로 시저에서 호출합니다.