2010-03-12 7 views
15

내가 nm 출력이 기능 수 (전역 정적 개체) C++ 파일로 컴파일 한 것입니다 : 그것은 무엇g ++ __static_initialization_and_destruction_0 (INT, INT) -이

00000000 t _Z41__static_initialization_and_destruction_0ii 

__static_initialization_and_destruction_0(int, int) /* after c++filt */ 

입니다? 내가이 함수 (그리고 __cxa_atexit()를 호출)의 생성을 해제 할 수 __cxa_atexit()

전화 .ctors.dtors 섹션에 모든 생성자와 소멸자 호출을 넣을 것인가? 내가 grok 수 있습니다 무엇에서 http://www.nsnam.org/docs/linker-problems.doc

은, gcc를 호출 할 수있는 정적 생성자가 필요합니다 모든 번역 단위에 대한 __static_initialization_and_destruction_0를 만듭니다

+2

g ++에는'-fno-use-cxa-atexit' 명령 행 옵션이 있지만 도움이 될 것이라고 생각하지 않습니다. 마치'atexit()'가'cxa_atexit()'대신에 사용되는 것처럼 보입니다. 아마도 더 좋은 질문은 g ++가'.ctors'와'.dtors' ELF 섹션에 생성자와 소멸자 호출을두기보다는'__static_initialization_and_destruction_0()'을 생성하는 이유입니다. 아마도 거기에 좋은 이유가있을 것입니다. – Void

답변

14

이 문서 파일은 싶어 그 기능에 대해 알고 거라고 나중에 모든 당신에게 말할 것 같다. 그런 다음 __do_global_ctors_aux.ctors 섹션에 배치 한 다음 각 번역 단위에서 __static_initialization_and_destruction_0을 호출합니다.

문제는 그보다 훨씬 복잡해 보입니다. gcc는 아카이브의 개별 객체 파일을 다루어야하며, 링커가 이러한 호출을 최적화하지 못하게하는 방법이라고 생각합니다.