ちょまどネイティブプログラム入門

main(int型変数)
27
ちょまど@ ITエンジニア @chomado

・stdio.h使ってないから不要 ・引数void書かなくていい >RT

2015-03-24 19:59:35
ちょまど@ ITエンジニア @chomado

これが限界な気がする。 int main(){ return 0; } これ以上削る main(){} とか は良くない思うんだけどいいの?

2015-03-24 20:01:00
ちょまど@ ITエンジニア @chomado

main; だけでコンパイル通ると見たけど、やってみたらセグフォで死にました [Wandbox]三へ( へ՞ਊ ՞)へ ハッハッ melpon.org/wandbox/permli…

2015-03-24 20:21:56
ちょまど@ ITエンジニア @chomado

そうか、セグフォってことは、コンパイルは通ったのか!(??)

2015-03-24 20:27:44
ちょまど@ ITエンジニア @chomado

コンパイルは通って実行時にこけたってことか

2015-03-24 20:28:20
TokusiN @toku51n

@chomado 厳密には、mainという名前のint型グローバル変数が宣言されて、グローバル変数なので0で初期化されます。 その後、リンカはmainという名前のシンボルを探して、そこから本体の場所を探すなり直接ジャンプするなりしようとしますが、0番地なのでいずれにせよ死にます。

2015-03-24 20:29:21
NeoCat @NeoCat

@toku51n @chomado ダウト。main変数の番地にジャンプし、その内容であるところの 00h 00h 00h 00h ... を命令であるとみなして実行するか、あるいは実行可能ビットが立っていないためにセグメンテーションフォルトになります。

2015-03-24 20:36:27
TokusiN @toku51n

@NeoCat @chomado あー、なるほど。main=-277;が正常に実行される事から考えて、main=0;も00h 00h 00h 00h...という命令として実行しようとしますね。

2015-03-24 20:40:32
ちょまど@ ITエンジニア @chomado

main=0; ってのは、多分、 main は特別だから int とは見られてなくて、 mainは実行可能ファイルがメモリにロードされた時に真っ先に実行される関数の先頭のアドレスだと見なされて、 それが0x00 なので、 でも0x00番地に関数なんて無いから、 セグフォった?

2015-03-24 20:55:05
ちょまど@ ITエンジニア @chomado

@chomado それともやはり main は グローバルで宣言されたint変数だと見なされるのだろうか?

2015-03-24 20:56:03
勝(まさる) @masaru0714

@chomado 「それともやはり」のほうでございます。コンパイルして実行ファイルになった時、本当の最初に実行されるのは「mainを呼び出す下準備」(Cランタイム、crtとか言います)で、OSが用意したものが組み込まれていますです。

2015-03-24 20:58:43
ちょまど@ ITエンジニア @chomado

@masaru0714 あばばば、混乱してきましたヽ(;▽;)ノ 実行 → cランタイム(OSが用意してるもの) → main関数 ということですか?>_<

2015-03-24 21:01:31
勝(まさる) @masaru0714

@chomado はい。最初にOSが用意しているCランタイムが実行されて、その中でmainラベルのある番地に実行を移す、と書かれていて、そこからmainの実行が始まります。

2015-03-24 21:02:43
ちょまど@ ITエンジニア @chomado

@masaru0714 なるほどです!ありがとうございます! じゃあ、 実行 main; → Cランタイム「mainいるところに実行を移すよ!」 → 0x00 → セグフォ ということでしょうか?>_<

2015-03-24 21:05:11
勝(まさる) @masaru0714

@chomado はい^^ もし0が「なにもしない(無害)」だった場合は、mainの後ろにある謎の領域まで実行しようとして、最後行きつくところまで行ってセグフォです。

2015-03-24 21:06:32
とみながたけひろ @takehiro_t

みんな変数の配置されている領域が実行可能と無条件に考えるんだなあ

2015-03-24 21:11:19
ちょまど@ ITエンジニア @chomado

「0を実行」というのは「NOPを実行」ということ?

2015-03-24 21:12:48
ちょまど@ ITエンジニア @chomado

@tmyt あばばば ありがとうございます!

2015-03-24 21:13:31
Takanori Watanabe 💉💉💉💉💉 @takawata19

@chomado PCだったら int main __attribute__((section(".text")))= 0xc3;とかやってみるといいです。(最近は世知辛い世の中になったのぅ)

2015-03-24 21:18:22
ちょまど@ ITエンジニア @chomado

何ですかこれΣ(・□・;)難しい! >RT

2015-03-24 21:19:22
Takanori Watanabe 💉💉💉💉💉 @takawata19

@chomado 基本的には mainっていう整数型のグローバル変数に0xc3という値をいれているだけでお。(にやにや)

2015-03-24 21:21:55
ちょまど@ ITエンジニア @chomado

__attribute__(format) でコンパイル時になにかするみたい

2015-03-24 21:27:25
Takanori Watanabe 💉💉💉💉💉 @takawata19

ちなみに世知辛いといったのは、最近は普通の(データセクションの)変数を実行させてくれないのだ。だから、__attribute__((section(".text")))でテキストセグメントに配置しないといけないのだ。

2015-03-24 21:27:40
Fadis @fadis_

mainをグローバル変数として宣言するとmainは実行可能バイナリを置く領域(.text)ではなくデータ領域(.data)に置かれるけど、近代的なプロセッサはセグメントに対してアクセス権限を設定できて、.dataに置いてあると実行権限が無くて死ぬ

2015-03-24 21:27:41