web-dev-qa-db-ja.com

crt0.oとcrt1.o-違いは何ですか?

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

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

36
Earlz

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

私の知る限り、crtには2つの「フレーバー」があります

  • crt1は、コンストラクタとデストラクタ(mainとexitの前後に呼び出される関数)をサポートするシステムで使用されます。この場合、mainは通常の関数呼び出しのように扱われます。
  • crtは、コンストラクタ/デストラクタをサポートしないシステムで使用されます。
37
kriss