2010-04-25 88 views
27

最近我一直在嘗試調試一些低級別的工作,並且我找不到編譯器(avr-gcc)的crt0.S,但是我找到了crt1.S(和相應的.o文件一樣)crt0.o和crt1.o - 有什麼區別?

這兩個文件有什麼區別? crt1是完全不同的東西還是什麼?它們似乎都與引導(設置堆棧幀等)有關,但爲什麼區分?

回答

27

這兩個crt0/crt1都做同樣的事情,在調用main()之前基本上做了所需的事情(如初始化堆棧,設置irqs等)。你應該鏈接一個或另一個,但不是兩個。它們不是真正的庫,而是真正的內聯彙編代碼。

據我瞭解,CRT有兩種「口味」

  • CRT1是在支持(之前和之後的主要退出調用的函數)構造函數和析構函數系統中使用。在這種情況下,main被視爲正常的函數調用。
  • crt0用於不支持構造函數/析構函數的系統上。
+2

+1 http://lists.uclibc.org/pipermail/uclibc/2002-December/025943.html – stacker 2010-05-01 11:24:39

+0

這些構造函數/析構函數究竟是什麼?這與C++或somethingelse有關嗎?在我的回答中,它沒有使用「crtbeginT.o」和「crtend.o」,它們是consructors和destructor。 – 2014-10-22 17:59:49

+0

我在答案中寫到了。不是它與C++沒有(直接)相關。它是在主程序之前和程序結束之後需要調用的函數。它與程序運行的操作系統有關。但我並不是最好的人(從來沒有寫過這樣的函數,其他人也這麼做過),並且可能需要一些自己的答案。 – kriss 2014-10-25 08:56:58

相關問題