mapped-check - mmapされているかを確認する

目的

ある領域がmmapされているか(アクセスしてもSEGVが起きないか)を、ユーザ空間からチェックしたい。
mincoreシステムコール(ある領域にDDRが割り当てられているかをチェックする)を使って実現できないか?

結果

mmapの有無は、以下のロジックで判定できる:

  1. mincore システムコールの戻り値が 0 → mmap されている
  2. 戻り値が -1 で errno=12(ENOMEM) → mmap されていない、もしくは munmap された
続きを読む

[Ruby][DONE] ローカル変数が生成されるタイミング

疑問: なぜ "ruby -e 'p(v=v)'" が NameError にならないのか?

Rubyのレキシカルスコープのすごさを同僚に説明している中で気づいた。

% ruby -e 'p v'
-e:1: undefined local variable or method `v' for main:Object (NameError)
% ruby -e 'p (v=v)'
nil

なぜ、未定義変数を自分自身に代入するときには、NameErrorにならないのだろう。

答えは、Rubyのパーサが「代入文を見つけた時点で変数が定義される」仕様になっているため。

続きを読む

tiny_printf - 小さいprintf()を作る

目的

組込み用途などで、footprintが小さいprintf関数が欲しい。
ライセンスを気にしなくて良いように、縛りがゆるいものが良い。

結果

printf()の仕様の勉強を兼ねて、自作した。パブリックドメインにするので、扱いはなんでも可。
サイズ縮小のために、一部機能を限定している(%p,%f,%gは非対応など)。
footprintは以下の通り:

命令セット サイズ(byte)
ARM 1426
Thumb-2 862
続きを読む

hello-minimum - libcを使わずに hello world

目的

BINARY HACKS "HACK #26, glibcを使わないで Hello World を書く" のARM版を作りたい。
できるならサイズはとことん削りたい。

結果

ARM命令版で174バイト、Thumb-2命令版で154バイトの Hello World を作った。

ポイントは以下:

  1. system call を直接呼出し
  2. エントリポイントをmain()に変更
  3. 不要セクションとセクションヘッダを削除
続きを読む

fifo-nonwait - FIFO をプロセス間の同期目的で使いたい

目的

Linux上のプロセスの同期待合せ処理として、処理がシンプルなFIFO(名前付きパイプ)を使いたい。
やりたいことは、μuITRONのイベントフラグ相当の処理。
外部仕様を書くと、

  1. 書込み側はいつでも書き込め、読み出し側のopenを待たずに次の処理を続ける
  2. 読み出し側(待つ側)は書き込み側よりも前にopenしても良い
  3. 書き込みデータがロストしない

これが実現できるか、Linux 上での FIFO の動作仕様を確認する。

結果

  1. FIFO作成後、一旦ダミーでO_NONBLOCKフラグを付けてopen()しておく(openしっぱなし)
  2. 書き込み側は O_RDWR|O_NONBLOCK の flag でopen()してwrite()する
  3. 読み込みは、普通にopen()してread()する

という役割分担にすれば良い。

続きを読む

tiny_printf - 小さいprintf()を作る

目的

組込み用途などで、footprintが小さいprintf関数が欲しい。
ライセンスを気にしなくて良いように、縛りがゆるいものが良い。

結果

printf()の仕様の勉強を兼ねて、自作した。パブリックドメインにするので、扱いはなんでも可。
サイズ縮小のために、一部機能を限定している(%p,%f,%gは非対応など)。
footprintは以下の通り:

命令セット サイズ
ARM 1426
Thumb-2 862
続きを読む

find-extlib - 外部関数の呼び出しをリストアップする

目的

あるプログラムからの、外部ライブラリの関数呼び出しをチェックしたい。

たとえば、自作プログラムが多数のオブジェクトから出来ているとして、その中で libc なり libm なりを参照している。
これらをリストアップして、依存を減らしたり、省サイズ化のために置き換えできないかを検討する材料にしたい。

結果

nmを呼び出すスクリプトを作成した。

例)

% find . -name '*.[oa]' | NM=nm xargs find-extlib
./dln.o: __xstat64 dlclose dlerror dlopen dlsym fprintf free fwrite getenv memcpy snprintf stderr strchr strcpy
./version.o: exit fflush puts snprintf stdout
...
続きを読む