2016-06-14 3 views
4

は、次のCプログラムを取ります。
私は-nostdlibでリンクを無効にできると仮定しました。プログラムをリンクするのにstdlibが必要なのはなぜですか?それは、C標準ライブラリから何かを使用していない</p> <pre><code>int main(){} </code></pre> <p>:

しかし、これは、次のエラーが発生:

$ gcc -nostdlib -o main main.c 
/usr/bin/ld: warning: cannot find entry symbol _start; defaulting to 0000000000400150 

誰かが_startシンボルであり、誰がそれを提供する責任が何であるかを明確にすることはできますか?
-nostdlibを使用するにはどうすればよいですか?ドキュメント毎の


、私も試してみました:

$ gcc -nostdlib -o main main.c -lgcc 

同じ動作を打ち鳴らすと見られています。

+1

最初に気づくべきことは、それが*リンカー*エラーだということです。つまり、コンパイルに失敗したわけではありません。 – Dmitri

+0

@ドミトリーはい、タイトルを修正します。 –

+2

'-lgcc'は最後に行かなければなりません。 Gccは、ライブラリが検出した時点でライブラリを処理するため、前述のオブジェクトからシンボルを解決するためにのみ使用されます。 – rici

答えて

1

_startは、プログラムのエントリポイントです。 this answer。 libcには、コマンドライン引数をオペレーティングシステムが置く場所から読み取って、mainを呼び出す小さなスタブが含まれています。したがって、通常のプラットフォームで通常のCプログラムを実行するには、libcとリンクする必要があります。

libcを使わないでプログラムを書くことができますが、あなた自身で_startを提供する必要があります。あなたは何もすることはできません、あなたが戻って何もないので、あなたは戻ってくることさえできません。あなたの唯一の選択肢は、アセンブリを使用して、_exit関数のように必要なlibcの部分を苦労せずに再作成することです。

+2

"したがって、Cプログラムを実行するにはlibcとリンクする必要があります。" - 申し訳ありませんが、それは間違っています!それが必要な場合は環境に依存します。ほとんどの組み込みシステムではそうではなく、リンクする標準ライブラリもありません。 – Olaf

+0

@Olaf C標準ライブラリのない組み込みシステムは、標準に準拠していません。とにかく、私は少し答えを書き直しました。これはあなたに受け入れられますか? – fuz

+1

私は正直なところ私の埋め込みコードは普通のCプログラムであると思います。実際には、標準でその用語を見つけてはいけません。 – Olaf

関連する問題