【问题标题】:crt0.o and crt1.o -- What's the difference?crt0.o 和 crt1.o -- 有什么区别?
【发布时间】:2011-02-12 04:36:38
【问题描述】:

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

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

【问题讨论】:

    标签: c gcc linker crt avr-gcc


    【解决方案1】:

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

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

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

    【讨论】:

    • 这些构造函数/析构函数到底是什么?这与 C++ 或其他东西有关吗?在我的回答中,它没有 crtbeginT.ocrtend.o 是构造函数和析构函数。
    • 我在我的回答中写了它。不是它(直接)与 C++ 无关。它是需要在 main 之前和程序结束之后调用的函数。它与程序运行的操作系统有关。但我不是最适合谈论这个问题的人(从来没有写过这样的函数,其他人做过),它可能值得自己给出一些答案。
    • @kriss,感谢您的回复。我现在才看到是因为你没有使用@zboson。析构函数真的是退出后调用的吗?
    猜你喜欢
    • 2010-12-29
    • 2013-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-23
    • 2010-11-12
    • 1970-01-01
    • 2013-04-26
    相关资源
    最近更新 更多