- takawata19
- 14467
- 5
- 46
- 3
# pragma text とか # pragma section(".text") とか # asm .text #endasm とかまあ
2015-03-24 21:31:32特に、ページ属性として実行不能属性を作れるようになったのはx64だからね。x86(32ビット)だとx64のPTEが使えるプロセッサでPAEを使うか、セグメントディスクリプタの属性つかうかになる。
2015-03-24 21:39:20@chomado もうその辺まで理解しようとするとcc(コンパイラーフロントエンド)が cpp → cc1 → as → ld の順に呼び出してるとかそういう内部動作から把握していった方が早いかもです…。
2015-03-24 21:43:01@chomado 0xc3は、本来cc1の出力した内容をasが変換する作業をスキップして直接値を描いてます。 section(".text") は、 ld に渡される情報です。 とかとか。
2015-03-24 21:46:45@takehiro_t そうか、const char main[] = {0xc3}; とか書いてコンパイル・実行してどうなるかを見れば、RX領域とR領域を別ページにマップしているかどうかというコンパイラなりOSなりの特性をテストできる…のかな
2015-03-24 23:30:31main; コンパイル通るけどセグフォで落ちる(実行時エラー)なんだけど、 なんでコンパイル通っちゃって、なんでセグフォるのかが、なんとなくわかったような分からなかったような、やっぱ分かってない
2015-03-25 08:27:27@chomado リンカからは int main; も double main; も char main[10]; も ただ _main っていうシンボルがあるようにしか見えないから。
2015-03-25 08:35:26@chomado 例えばトップレベルに int main; って書いた場合「int型いっこ分の領域をメモリ上に確保して、そこにみんなから見えるようにmainっていう名前を付けろ」って意味になる。 リンカは「プログラムの最初にmainって名前の場所に飛ぶ」ことしか考えない
2015-03-25 08:57:53main; コンパイル OK「文法OK」 → リンク OK「mainあるぞ!」 → 実行ファイル生成 OK → 実行「あれー?!&main 見に行ったけど実行権限無いんですけどww」→セグフォ
2015-03-25 09:04:49なるほど…メモリはいくつかのセクションに分かれてて、それぞれ権限がどうのっていう属性を持ってるのね、 .text → 実行可能 .data → 実行はできない ということかな?>_<
2015-03-25 09:16:23ネイティブコードって、原始的でハードウェアに依存するプログラミング言語(マシン語など)のことか!(((o(*゚▽゚*)o)))
2015-03-25 09:24:21なるほど、 .text → プログラム本体 .data → 初期化が必要で定数でない情報が入っている。C で言うと初期化されているグローバル変数など
2015-03-25 09:33:59