40

最近、私はいくつかの低レベルの作業をデバッグしようとしていcrt0.Sて、コンパイラー(avr-gcc)のを見つけることができませんでしたが、crt1.S(そして対応する.oファイルと同じ)を見つけました。

これら2つのファイルの違いは何ですか?何かcrt1が完全に違うのですか、それとも何ですか?どちらも「ブートストラップ」(セットアップstack frameなど)に関係しているようですが、なぜその違いがあるのでしょうか。

4

1 に答える 1

44

両方のcrt0/crt1は同じことを行い、基本的にmain()を呼び出す前に必要なことを行います(スタックの初期化、irqの設定など)。どちらか一方にリンクする必要がありますが、両方にリンクすることはできません。それらは実際にはライブラリではなく、実際にはインラインアセンブリコードです。

私が理解している限り、crtには2つの「フレーバー」があります

  • crt1は、コンストラクタとデストラクタ(mainとexitの前後に呼び出される関数)をサポートするシステムで使用されます。この場合、mainは通常の関数呼び出しのように扱われます。
  • crt0は、コンストラクタ/デストラクタをサポートしないシステムで使用されます。
于 2010-04-27T19:30:35.127 に答える