27
最近我一直在嘗試調試一些低級別的工作,並且我找不到編譯器(avr-gcc)的crt0.S,但是我找到了crt1.S(和相應的.o文件一樣)crt0.o和crt1.o - 有什麼區別?
這兩個文件有什麼區別? crt1是完全不同的東西還是什麼?它們似乎都與引導(設置堆棧幀等)有關,但爲什麼區分?
最近我一直在嘗試調試一些低級別的工作,並且我找不到編譯器(avr-gcc)的crt0.S,但是我找到了crt1.S(和相應的.o文件一樣)crt0.o和crt1.o - 有什麼區別?
這兩個文件有什麼區別? crt1是完全不同的東西還是什麼?它們似乎都與引導(設置堆棧幀等)有關,但爲什麼區分?
這兩個crt0/crt1都做同樣的事情,在調用main()之前基本上做了所需的事情(如初始化堆棧,設置irqs等)。你應該鏈接一個或另一個,但不是兩個。它們不是真正的庫,而是真正的內聯彙編代碼。
據我瞭解,CRT有兩種「口味」
+1 http://lists.uclibc.org/pipermail/uclibc/2002-December/025943.html – stacker 2010-05-01 11:24:39
這些構造函數/析構函數究竟是什麼?這與C++或somethingelse有關嗎?在我的回答中,它沒有使用「crtbeginT.o」和「crtend.o」,它們是consructors和destructor。 – 2014-10-22 17:59:49
我在答案中寫到了。不是它與C++沒有(直接)相關。它是在主程序之前和程序結束之後需要調用的函數。它與程序運行的操作系統有關。但我並不是最好的人(從來沒有寫過這樣的函數,其他人也這麼做過),並且可能需要一些自己的答案。 – kriss 2014-10-25 08:56:58