2009-09-28 4 views
2

간략한 요약 : gcc 4.1, aCC, VisualAge 및 MSVC에서 여러 플랫폼에서 잘 작동하는 기존 코드가 많이 있습니다. HP-UX에서 현재이 문제를 해결하기 위해 노력 중입니다.GCC 4.1/HP-UX 11.23의 정적/전역 생성자

출력은 여러 (8-10) 공유 라이브러리로 구성됩니다.

모든 것이 잘 컴파일되지만 테스트 응용 프로그램을 실행하려고하면 일부 전역 생성자에서 즉시 분리됩니다. 실제로 gdb는이 실제 전역 객체가있는 위치에 대한 정보를 얻을 수 없습니다. si_code는 SEGV_ACCERR입니다. - 개체에 대한 권한이 올바르지 않습니다. 'this'포인터는 항상 0입니다.

Null 인 개체의 초기화는 어떻게 초기화됩니까? 이것은 gcc의 전역 초기화 개념과 HP의 개념 (HP의 ld 사용) 사이의 충돌입니까?

어디에서 진단 하시겠습니까? 슬프게도이 문제를 문제를 재현하는 테스트 사례로 축소 할 수 없습니다.

+1

업데이트 비트 : 변덕스럽게도 실패한 ctor에 printf를 추가했습니다 (이전에는 비어 있음). 다음에 샘플 앱을 사용해 보았을 때, 다른 글로벌 생성자에서 충돌이 발생했습니다 ... 그래서 반복되었고 똑같은 일이 발생했습니다. 빈 생성자를 최적화하는 것이 가능합니까? 논리적으로 보이지는 않지만 * HP-UX – phrakture

답변

1

objdump을 실행 파일과 개체 파일 및 공유 라이브러리에서 실행하여 시작할 것입니다. 가상 주소가 0 (예 : NULL) 인 데이터 세그먼트와 같은 의심스러운 항목을 찾으십시오.

공유 라이브러리의 경우 로더은 런타임 연결을 수행하며 HP-UX 로더는 있어야 할 대상을 재배치하지 않을 수 있습니다.

또한 GNU ld 정보 페이지를 살펴보십시오. CONSTRUCTORS 옵션 아래에 유용한 정보가 있습니다. 다른 오브젝트 형식이 다르게 작동합니다.

0

해당 공유 라이브러리에 대한 컴파일 및 링크 명령 줄은 무엇입니까? "g++ -fPIC -c ..."으로 개체를 컴파일하고 "g++ -fPIC -shared ..."이 아닌으로 직접 연결하고 "ld -b ..."으로 연결하십시오. g++HP-UX에 필요할 수있는 추가 런타임 지원 코드로 연결될 수 있습니다.

+0

예, g-++를 -fPIC -mlp64 및 추가 -shared -Wl, -z와 함께 사용하고 있습니다. 다른 프로젝트 특정 플래그) – phrakture