- takawata19
- 14450
- 5
- 46
- 3
これが限界な気がする。 int main(){ return 0; } これ以上削る main(){} とか は良くない思うんだけどいいの?
2015-03-24 20:01:00main; だけでコンパイル通ると見たけど、やってみたらセグフォで死にました [Wandbox]三へ( へ՞ਊ ՞)へ ハッハッ melpon.org/wandbox/permli…
2015-03-24 20:21:56@chomado 厳密には、mainという名前のint型グローバル変数が宣言されて、グローバル変数なので0で初期化されます。 その後、リンカはmainという名前のシンボルを探して、そこから本体の場所を探すなり直接ジャンプするなりしようとしますが、0番地なのでいずれにせよ死にます。
2015-03-24 20:29:21@toku51n @chomado ダウト。main変数の番地にジャンプし、その内容であるところの 00h 00h 00h 00h ... を命令であるとみなして実行するか、あるいは実行可能ビットが立っていないためにセグメンテーションフォルトになります。
2015-03-24 20:36:27@NeoCat @chomado あー、なるほど。main=-277;が正常に実行される事から考えて、main=0;も00h 00h 00h 00h...という命令として実行しようとしますね。
2015-03-24 20:40:32main=0; ってのは、多分、 main は特別だから int とは見られてなくて、 mainは実行可能ファイルがメモリにロードされた時に真っ先に実行される関数の先頭のアドレスだと見なされて、 それが0x00 なので、 でも0x00番地に関数なんて無いから、 セグフォった?
2015-03-24 20:55:05@chomado 「それともやはり」のほうでございます。コンパイルして実行ファイルになった時、本当の最初に実行されるのは「mainを呼び出す下準備」(Cランタイム、crtとか言います)で、OSが用意したものが組み込まれていますです。
2015-03-24 20:58:43@masaru0714 あばばば、混乱してきましたヽ(;▽;)ノ 実行 → cランタイム(OSが用意してるもの) → main関数 ということですか?>_<
2015-03-24 21:01:31@chomado はい。最初にOSが用意しているCランタイムが実行されて、その中でmainラベルのある番地に実行を移す、と書かれていて、そこからmainの実行が始まります。
2015-03-24 21:02:43@masaru0714 なるほどです!ありがとうございます! じゃあ、 実行 main; → Cランタイム「mainいるところに実行を移すよ!」 → 0x00 → セグフォ ということでしょうか?>_<
2015-03-24 21:05:11@chomado はい^^ もし0が「なにもしない(無害)」だった場合は、mainの後ろにある謎の領域まで実行しようとして、最後行きつくところまで行ってセグフォです。
2015-03-24 21:06:32@chomado PCだったら int main __attribute__((section(".text")))= 0xc3;とかやってみるといいです。(最近は世知辛い世の中になったのぅ)
2015-03-24 21:18:22@chomado 基本的には mainっていう整数型のグローバル変数に0xc3という値をいれているだけでお。(にやにや)
2015-03-24 21:21:55ちなみに世知辛いといったのは、最近は普通の(データセクションの)変数を実行させてくれないのだ。だから、__attribute__((section(".text")))でテキストセグメントに配置しないといけないのだ。
2015-03-24 21:27:40mainをグローバル変数として宣言するとmainは実行可能バイナリを置く領域(.text)ではなくデータ領域(.data)に置かれるけど、近代的なプロセッサはセグメントに対してアクセス権限を設定できて、.dataに置いてあると実行権限が無くて死ぬ
2015-03-24 21:27:41