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

main(int型変数)
27
若年寄(もう若くない) @kikairoya

@fadis_ ここに __attribute__((section(".text"))) があるじゃろ

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

.text とか .data とか初めて聞いたのですが何なんですかΣ(・□・;)

2015-03-24 21:29:12
若年寄(もう若くない) @kikairoya

# pragma text とか # pragma section(".text") とか # asm .text #endasm とかまあ

2015-03-24 21:31:32
Fadis @fadis_

セクション毎に性質の違うメモリに配置してるアーキテクチャだって居るんですよ! (セクションの存在意義を理解する上で大事な事)

2015-03-24 21:35:18
若年寄(もう若くない) @kikairoya

ところでコードとデータのアドレス空間が完全に分離しているプロセッサが世の中にはありましてですね

2015-03-24 21:39:12
Takanori Watanabe 💉💉💉💉💉 @takawata19

特に、ページ属性として実行不能属性を作れるようになったのはx64だからね。x86(32ビット)だとx64のPTEが使えるプロセッサでPAEを使うか、セグメントディスクリプタの属性つかうかになる。

2015-03-24 21:39:20
はぇ~ @haxe

@chomado もうその辺まで理解しようとするとcc(コンパイラーフロントエンド)が cpp → cc1 → as → ld の順に呼び出してるとかそういう内部動作から把握していった方が早いかもです…。

2015-03-24 21:43:01
はぇ~ @haxe

@chomado 0xc3は、本来cc1の出力した内容をasが変換する作業をスキップして直接値を描いてます。 section(".text") は、 ld に渡される情報です。 とかとか。

2015-03-24 21:46:45
はぇ~ @haxe

@chomado って、そういえばちょまどさんはアセンブラとかにも手を出してましたっけ…。だったらもっとわかりやすく説明できましたね。

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

@takehiro_t そうか、const char main[] = {0xc3}; とか書いてコンパイル・実行してどうなるかを見れば、RX領域とR領域を別ページにマップしているかどうかというコンパイラなりOSなりの特性をテストできる…のかな

2015-03-24 23:30:31
ちょまど@ ITエンジニア @chomado

main; コンパイル通るけどセグフォで落ちる(実行時エラー)なんだけど、 なんでコンパイル通っちゃって、なんでセグフォるのかが、なんとなくわかったような分からなかったような、やっぱ分かってない

2015-03-25 08:27:27
NaOHaq(苛性ソーダ) @NaOHaq

@chomado リンカからは int main; も double main; も char main[10]; も ただ _main っていうシンボルがあるようにしか見えないから。

2015-03-25 08:35:26
ちょまど@ ITエンジニア @chomado

C言語のコンパイラ的には「main」ってラベルさえあれば、中身気にせず &main を見に行ってOKってこと??

2015-03-25 08:53:12
ちょまど@ ITエンジニア @chomado

「取り敢えず main あるからOK!」までしかコンパイラはチェックしてないの? (c言語)

2015-03-25 08:53:54
NaOHaq(苛性ソーダ) @NaOHaq

@chomado 例えばトップレベルに int main; って書いた場合「int型いっこ分の領域をメモリ上に確保して、そこにみんなから見えるようにmainっていう名前を付けろ」って意味になる。 リンカは「プログラムの最初にmainって名前の場所に飛ぶ」ことしか考えない

2015-03-25 08:57:53
ちょまど@ ITエンジニア @chomado

main; コンパイル OK「文法OK」 → リンク OK「mainあるぞ!」 → 実行ファイル生成 OK → 実行「あれー?!&main 見に行ったけど実行権限無いんですけどww」→セグフォ

2015-03-25 09:04:49
NaOHaq(苛性ソーダ) @NaOHaq

@chomado コンパイラは型を気にするけど、リンカは名前の一致しか見てない。

2015-03-25 09:04:49
ちょまど@ ITエンジニア @chomado

なるほど…メモリはいくつかのセクションに分かれてて、それぞれ権限がどうのっていう属性を持ってるのね、 .text → 実行可能 .data → 実行はできない ということかな?>_<

2015-03-25 09:16:23
ちょまど@ ITエンジニア @chomado

ネイティブコードって、原始的でハードウェアに依存するプログラミング言語(マシン語など)のことか!(((o(*゚▽゚*)o)))

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

なるほど、 .text → プログラム本体 .data → 初期化が必要で定数でない情報が入っている。C で言うと初期化されているグローバル変数など

2015-03-25 09:33:59