2010-04-25 6 views
27

최근 저수준 작업을 디버깅하려고 시도했지만 컴파일러 (avr-gcc)에서 crt0.S를 찾을 수 없었지만 crt1.S (해당 .o 파일과 동일 함)를 찾았습니다.crt0.o 및 crt1.o - 차이점은 무엇입니까?

두 파일의 차이점은 무엇입니까? crt1은 완전히 다른 것입니까? 둘 다 bootstrapping (스택 프레임 등을 설정)을 위해 무언가와 관련이있는 것처럼 보입니다. 그러나 왜 구별입니까?

답변

27

crt0/crt1은 기본적으로 main() (스택 초기화, irqs 설정 등)을 호출하기 전에 필요한 작업을 수행합니다. 둘 중 하나만 연결해야합니다. 그것들은 실제로 라이브러리가 아니라 실제로 인라인 어셈블리 코드입니다.

는 지금까지 내가 이해, CRT는

  • crt1이 (전 주 종료 후 호출되는 함수) 생성자와 소멸자를 지원하는 시스템에 사용되는 두 개의 "맛"에 온다. 이 경우 main은 일반적인 함수 호출과 같이 처리됩니다.
  • crt0은 생성자/소멸자를 지원하지 않는 시스템에서 사용됩니다.
+2

+1 http://lists.uclibc.org/pipermail/uclibc/2002-December/025943.html – stacker

+0

정확히 생성자/소멸자는 무엇입니까? 이것은 C++ 또는 무언가와 관련이 있습니까? 내 대답은 여기에 'crtbeginT.o'와'crtend.o'가 없는데, 그들은 consructor와 destructors입니다. –

+0

나는 그것을 내 대답에 썼다. C++과 (직접적으로) 관련이있는 것은 아닙니다. 프로그램이 끝나고 메인 전에 호출되어야하는 함수입니다. 프로그램이 실행되는 OS와 관련이 있습니다. 그러나 나는 그것에 대해 말할 수있는 가장 좋은 사람이 아니며 (그러한 기능을 쓴 적이 없으며, 다른 사람들도 그렇게했다), 아마 자신의 것의 답이 될만한 가치가있다. – kriss