C言語でmain()なしのプログラムをコンパイルして実行する
2023-08-28 12:50:22
質問
以下のプログラムを
main()
関数が
C
. 以下のコマンドでプログラムをコンパイルしてみました。
gcc -nostartfiles nomain.c
そして、コンパイラは警告を出します。
/usr/bin/ld: warning: cannot find entry symbol _start; defaulting to 0000000000400340
OK、問題なし。では、実行ファイル(a.out)を実行すると、両方の
printf
ステートメントが正常にプリントされ、その後
セグメンテーションフォールト
.
そこで質問なのですが printステートメントが正常に実行された後、なぜセグメンテーションフォールトが発生するのでしょうか?
私のコードです。
#include <stdio.h>
void nomain()
{
printf("Hello World...\n");
printf("Successfully run without main...\n");
}
を出力します。
Hello World...
Successfully run without main...
Segmentation fault (core dumped)
注意
ここで
-nostartfiles
gccフラグは、コンパイラがリンク時に標準的なスタートアップファイルを使用しないようにします。
どのように解決するのですか?
生成された アセンブリ を見てみましょう。
.LC0:
.string "Hello World..."
.LC1:
.string "Successfully run without main..."
nomain:
push rbp
mov rbp, rsp
mov edi, OFFSET FLAT:.LC0
call puts
mov edi, OFFSET FLAT:.LC1
call puts
nop
pop rbp
ret
この
ret
文に注目してください。あなたのプログラムのエントリーポイントは、以下のように決定されます。
nomain
に決定され、それですべてがうまくいきます。しかし、一旦関数が戻ると、コールスタック上のアドレスにジャンプしようとします...それは入力されていません。これは不正なアクセスであり、セグメンテーションフォールトが発生します。
手っ取り早い解決策は
exit()
を呼び出すことです (C11 では、この関数を
_Noreturn
):
#include <stdio.h>
#include <stdlib.h>
_Noreturn void nomain(void)
{
printf("Hello World...\n");
printf("Successfully run without main...\n");
exit(0);
}
実際、この関数は通常の
main
から戻った後
main
から戻った後
exit
関数は
main
の戻り値で呼び出されます。
関連
-
libc++abi.dylib: NSException タイプの捕捉されない例外で終了するエラー
-
[解決済み] 1ビットのセット、クリア、トグルはどのように行うのですか?
-
[解決済み] Could not find or load main class "とはどういう意味ですか?
-
[解決済み] C言語で配列のサイズを決定するにはどうすればよいですか?
-
[解決済み] CとC++でmain()は何を返すべきですか?
-
[解決済み] 演算子 *, /, +, -, % を使わずに 3 で割る。
-
[解決済み] while ( !feof (file) ) 」は、なぜいつも間違っているのですか?
-
[解決済み] printfは、フォーマット文字列の中に改行がないと、呼び出し後にフラッシュしないのはなぜですか?
-
[解決済み] フリーは、どのように無料化を知っているのですか?
-
[解決済み] 2次元配列の反復処理において、ループの順序がパフォーマンスに影響するのはなぜですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] C++でmainの適切な宣言は何ですか?
-
[解決済み] Windows用Cコンパイラ?[クローズド]
-
[解決済み] Linux Socket write() によるBad File Descriptor C
-
[解決済み] Linuxカーネルにおけるcontainer_ofマクロの理解
-
[解決済み] C関数から文字列を返す
-
[解決済み] C言語で関数型プログラミングを行うためのツールにはどのようなものがありますか?
-
[解決済み] CとC++でmain()は何を返すべきですか?
-
[解決済み] printfは、フォーマット文字列の中に改行がないと、呼び出し後にフラッシュしないのはなぜですか?
-
[解決済み] C言語のi++と++iに性能差はあるのでしょうか?
-
[解決済み] なぜ16進数には0xがつくのですか?