C/C++ で配列の内容を関数として実行する.

OSなし環境とかRTOS環境下ではちょくちょくやってましたが、Linux とかではそういえばやったことないなと思い、やってみました.

Segmantation Fault を出しながら、試行錯誤して一応できたのが以下.

※ (1)
mprotect で指定するアドレスは page size 境界にある必要があるので、そのための attribute.

※ (2)
関数のバイナリを含む配列を .text 領域に配置するための attribute. 最初 .bss セクションにおいてやってみたけれど、どうも .bss だと mprotect で PROT_EXEC を付与してもSegmantation Fault が出るのようなので指定.  なんで出来ないのか… linker script とか Intel のアーキテクチャマニュアルとか、詳解 Linux kernel とか、そのへん読み解いたら分かるかもしれませんが、とりあえず今回は .text に配置.

※ (3)
.text 領域はデフォルトで書き込み権限がないため、mprotect で書き込み権限を付与.

※ (4)
配列内に機械語でバイナリーを直接プログラミングするのがしんどかったので、double の乗算を行う関数 mul を buf にコピー (サイズに指定している 128 は適当で多分余分なのもコピーされている)  今回は単純な乗算なので問題ないけれど、相対アドレッシングで外に分岐したり外のデータにアクセスするような関数の機械語をコピーしても変な所にアクセスして期待した動作はしないのでその辺りは注意.

※(5)
buf の先頭を関数ポインター (double(*)(double, doble)) にキャスト.

※(6)
関数ポインタ fp 経由で buf の内容をコードとして実行.

さてこのソースを make してみると…

g++  -g -Wall -Wextra -c main.cpp
/tmp/ccxKSKnq.s: Assembler messages:
/tmp/ccxKSKnq.s:35: Warning: ignoring changed section attributes for .text
g++ main.o -o main

のようになにやら  warning がでていますが、実行した結果は以下のようになっており、buf は  .text 領域に配置され、コピーされた mul の内容も関数として正しく動作しているようです.

./main
0x402000
0x403000
6.000000
広告

Intel NUC NUC5i3RYH に Linux Mint を入れてみた

自宅で使用している NAS が今まさに天寿を全うしようとしておりまして、samba を入れてファイルサーバーにしつつ、ついでに少し遊べればいいかなと言う算段で購入。

開封直後

IMG_0221

アダプターは先が取り替え可能になっていて、いろんな国の仕様に対応しているようです。

IMG_0230

裏蓋を開けた所

IMG_0222

メモリーを刺した所

IMG_0224

SSD を刺した所

IMG_0226

これで蓋を閉めればハードの準備は完了!後は UNetbootin を使って ISO から live usb メモリーを作成してインストールします。

unetbootin

Intel NUC の前モデルでは Linux のインストールにハマったと言う記事がちらほらありましたので、自分もハマるだろうな…

と思っていたら意外と何の問題もなくあっさり Linux Mint が入りました。これから存分に活躍して貰う予定です。

 

VMWare 上の linux mint 17 に Qt の開発環境を構築する

敢て記事にするほどの事では無いかもしれませんが….

VMware 上での mint 17 のインストールは完了しているとの前提で。
「VMWare 上の」と書いていますが、やってみていないだけで mint 17 を直インストールしている場合も同様の手順でイケるはずです。

(1) Qt 開発環境の導入
まず qt-project のページで Qt5.3.2 for linux のインストーラをダウンロードします。

http://www.qt.io/download-open-source/qt-linux-installer-download

次に落としてきたインストーラに実行権限を与えて実行します。

$chmod u+x qt-opensource-linux-x86-5.3.2.run
$sudo ./qt-opensource-linux-x86-5.3.2.run

GUI のインストーラが立ち上がりますので、画面の指示に従ってインストールします。

(2) g++ を導入
Qt の開発には g++ が必要なので導入します。

$sudo apt-get install g++

(3) opengl を導入
Qt ウィジットアプリケーションの開発には opengl が必要ですので opengl も導入します。

$sudo apt-get install update
$sudo apt-get install freeglut3-dev

ちなみに opengl を入れない状態でビルドすると libGL が見つからない「cannot find -lGL」と言って怒られます。(当たり前ですが….)

(4) Qt Creator の起動
1 で指定したインストール先の Qt5.3.2/Tools/QtCreator/bin/qtcreator.sh を実行すると Qt Creator が起動しますので、後は通常通り poject を作成して開発を行います。