最近,我一直在尝试调试一些底层工作,并且找不到编译器的crt0.S(avr-gcc),但确实找到了crt1.S(与相应的.o文件相同)。

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

最佳答案

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

据我了解,crt有两种“味道”

  • crt1 用于支持构造函数和析构函数(在main和exit之前和之后调用的函数)的系统上。在这种情况下,将main视为普通函数调用。
  • crt0 用于不支持构造函数/析构函数的系统。
  • 关于c - crt0.o和crt1.o-有什么区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2709998/

    10-11 15:43