crt0.o和crt1.o - 有什么区别?

Ear*_*rlz 34 c linker gcc crt avr-gcc

最近我一直在尝试调试一些低级工作,我找不到crt0.S编译器(avr-gcc),但我确实找到了crt1.S(和相应的.o文件一样).

这两个文件有什么区别?是crt1完全不同的东西还是什么?它们似乎都与'bootstrapping'(设置stack frame等)有关,但为什么区别呢?

kri*_*iss 35

crt0/crt1都做同样的事情,基本上在调用main()之前做了所需的事情(比如初始化堆栈,设置irqs等).你应该链接一个或另一个但不是两个.它们不是真正的库,而是真正的内联汇编代码.

据我所知,crt有两种"味道"

  • crt1用于支持构造函数和析构函数的系统(在main和exit之前和之后调用的函数).在这种情况下,main被视为普通函数调用.
  • crt0用于不支持构造函数/析构函数的系统.

  • 这些构造函数/析构函数究竟是什么?这与 C++ 还是其他什么有关?在我的回答中,它在没有 `crtbeginT.o` 和 `crtend.o` 的情况下工作,它们是构造函数和析构函数。 (2认同)