2013年4月25日木曜日

FileFind_maptree() for PHP

コード、ちょとメモっとく。


/**
 * ディレクトリツリーを作成する
 *
 * $dir のディレクトリ 下位ディレクトリ を含む ファイル・ディレクトリの一覧を取得します。
 *
 * 注意: 含まれるディレクトリ・ファイルの数によっては処理に時間がかかり、また多くのメモリを必要とする恐れがあります。
 *
 * @param  $dir  検索するディレクトリ
 * @return       ファイル・ディレクトリの配列
 */
function FileFind_maptree($dir){

    $items = glob($dir . '/*');

    for ($i = 0; $i < count($items); $i++) {
        if (is_dir($items[$i])) {
            $add = glob($items[$i] . '/*');
            $items = array_merge($items, $add);
        }
    }

    return $items;
}

elfファイルをリロケーションの仕組み 概要

elfファイルをリロケーションする仕組み 概要

はじめに

MMU のあるアーキテクチャは、
MMU での仮想メモリのアドレスを書き換えてしまえばいいのでそれほど面倒なことではない。
簡単に言っちゃえば、elfファイルのロード先アドレスにロードして、そこに ジャンプ してしまう方法ができる。


MMU の無いアーキテクチャは、
中身の elf に含まれる プログラムコード の命令セットなどの中でメモリアドレス指定箇所を1個づつかきかえていく。これがリロケーションって作業なんだ。


リロケーションするためどう書き換えてくか?

たとえば hello.o というオブジェクトファイルがあれば

$ arm-none-eabi-objdump -x hello.o

と実行すると ファイルのセクション情報が表示される。

その中に、"RELOCATION RECORDS FOR ..." と書かれた箇所がある。

...
RELOCATION RECORDS FOR [.text]:
OFFSET   TYPE              VALUE
00000094 R_ARM_PC24        main
00000098 R_ARM_PC24        exit
00000144 R_ARM_PC24        msg_send
00000178 R_ARM_ABS32       .rodata
0000014c R_ARM_ABS32       .rodata
000034cc R_ARM_PC24        sys_log
...
これらは elf ファイルに有る、 .text セクション内の実際のデータをに対して、移動先アドレスまでのオフセットを加算すればリロケーションできる。

でも単純に加算すればいいわけではなく、これらは プログラムコード(arm命令セット)になっています。
ですから、プログラムコード(arm命令セット)として適切なビットだけを書き換えなければなりません。

実行するとき

1. elfファイルを分解
2. セクション情報を取得
3. memcpy() でセクションを移動して
4. リロケーション情報をもとにアドレスを書き換え

で、実行先エントリーポイントへジャンプすればプログラムは実行できる。
ってことのようです。



これは仕事じゃないから、そのうち試してみます。





2013年4月15日月曜日

Insight 6.8-1 build problem on Cygwin. ビルドできない。

Insight debugger を Cygwin でビルドしてみました。

が、 そう簡単にはビルドが通りません。

Insight のサイトにある insight-6.8-1 や insight-6.7 、そして cvs (2013/04/14時点) のものでも、Cygwin ではビルドできません。
昔は Cygwin で Insight はビルドできましたが、 今は Cygwin のソースコードはメンテナンスされていないようです。


ソースコードの手直しをして、ビルド通すことができ、使えそうな感じなので、公開しておきます。

元となっているのは cvs (2013/04/14時点) のものに対して修正を加えました。
insight-6.8-1 は、古いし、あまりお勧めしません。


ダウンロード


このパッチは Cygwin でビルドするためのものです。
パッチをあて、他の環境 (Linux) ではビルドできなくなる かも しれません。(テストしていないです)

ビルド方法 (arm クロス開発用)


ビルド方法の例です。

$ cd /home/pkg/insight-cvs20130414
$ tar xvjf insight-cvs20130414-src.tar.bz2

$ patch -p1 -d src < insight-cvs20130414-cygwin.patch

$ mkdir /home/pkg/insight-cvs20130414/.BUILD
$ cd /home/pkg/insight-cvs20130414/.BUILD
$  ../src/configure                            \
        --target=arm-none-eabi                    \
        --prefix=/usr/local/arm-none-eabi            \
        --with-mpfr                        \
        --with-gmp                       
$ make
$ make install




パッチを適用していないと、

パッチを適用していないと、Cygwin でビルドの時に、こんなエラーがでてきます。

gcc -c -g -O2 -Wall -Wconversion   -I"../../../tcl/win/../generic" -I"../../../tcl/win" -mwin32  -DPACKAGE_NAME=\"\" -DPACKAGE_TARNAME=\"\" -DPACKAGE_VERSION=\"\" -DPACKAGE_STRING=\"\" -DPACKAGE_BUGREPORT=\"\" -DHAVE_NO_SEH=1 -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1   -DBUILD_tcl ../../../tcl/win/../generic/tclAlloc.c -o tclAlloc.o
In file included from /usr/lib/gcc/i686-pc-cygwin/4.5.3/../../../../include/w32api/winsock2.h:56:0,
                 from ../../../tcl/win/../generic/../win/tclWinPort.h:72,
                 from ../../../tcl/win/../generic/tclPort.h:22,
                 from ../../../tcl/win/../generic/tclAlloc.c:29:
/usr/lib/gcc/i686-pc-cygwin/4.5.3/../../../../include/w32api/psdk_inc/_fd_types.h:100:2: 警告: #warning "fd_set and associated macros have been defined in sys/types.      This can cause runtime problems with W32 sockets"
In file included from ../../../tcl/win/../generic/../win/tclWinPort.h:72:0,
                 from ../../../tcl/win/../generic/tclPort.h:22,
                 from ../../../tcl/win/../generic/tclAlloc.c:29:
/usr/lib/gcc/i686-pc-cygwin/4.5.3/../../../../include/w32api/winsock2.h:986:34: error: conflicting types for ‘select’
/usr/include/sys/select.h:31:5: note: previous declaration of ‘select’ was here
Makefile:423: recipe for target `tclAlloc.o' failed
make[3]: *** [tclAlloc.o] Error 1
make[3]: ディレクトリ `/home/pkg/insight-6.8-1/.BUILD/tcl/win' から出ます
Makefile:15: recipe for target `all' failed
make[2]: *** [all] Error 2
make[2]: ディレクトリ `/home/pkg/insight-6.8-1/.BUILD/tcl' から出ます
Makefile:6631: recipe for target `all-tcl' failed
make[1]: *** [all-tcl] Error 2
make[1]: ディレクトリ `/home/pkg/insight-6.8-1/.BUILD' から出ます
Makefile:705: recipe for target `all' failed
make: *** [all] Error 2



2013年4月13日土曜日

NetBeans7.3.0 + Cygwin gdb 7.5.1 breakpoints do not work. ブレイクポイント止まんない。


NetBeans7.3.0 で、Cygwin 上の gdb 7.5.1 を使っていると、C言語でブレイクポイントを張ってもブレイクしない。

回避方法は NetBeans を起動するときに、"-J-Dgdb.breakpoints.shortpaths=true" というオプションを付けて起動することで回避できた。

netbeans.exe -J-Dgdb.breakpoints.shortpaths=true

このバグ、知らなかったわけではなく知っていた。
が、もうとっくに修正されていると思っていたのに、ぜんぜん修正される感じがない。.

https://netbeans.org/bugzilla/show_bug.cgi?id=201670

2013年4月6日土曜日

Building Linux kernel on Cygwin / menuconfig エラー回避 (2)

またまた、menuconfig でエラー

$make menuconfig

(....省略....)

/usr/lib/gcc/i686-pc-cygwin/4.5.3/../../../../i686-pc-cygwin/bin/ld: final link failed: Invalid operation
collect2: ld はステータス 1 で終了しました
scripts/Makefile.host:113: recipe for target `scripts/kconfig/mconf' failed
make[1]: *** [scripts/kconfig/mconf] Error 1
Makefile:463: recipe for target `menuconfig' failed
make: *** [menuconfig] Error 2
この回避方法は次のように
linux-2.6.14.6/scripts/kconfig/Makefile を書き換える。

122a123,125
> HOSTLOADLIBES_conf     = -L/lib -lintl
> HOSTLOADLIBES_mconf    = -L/lib -lintl
>

ifeq ($(qconf-target),1)
qconf-cxxobjs    := qconf.o
qconf-objs    := kconfig_load.o zconf.tab.o
endif

HOSTLOADLIBES_conf     = -L/lib -lintl
HOSTLOADLIBES_mconf    = -L/lib -lintl
ifeq ($(gconf-target),1)
gconf-objs    := gconf.o kconfig_load.o zconf.tab.o
endif


これで回避できる。




Building Linux kernel on Cygwin / menuconfig エラー回避 (1)

Linux のカーネル (linux-2.6.14.6 にカスタマイズが多少入ってると思われるもの)を cygwin 上でビルドするのに、menuconfig しようとしたら、こんなエラー出てきた。
$ make menuconfig
Makefile:462: *** 暗黙ルールと通常ルールが混ざりました.  中止.


回避方法は Makefile を修正してしまう。


462c462
< config %config: scripts_basic outputmakefile FORCE
---
> %config : scripts_basic outputmakefile FORCE
これで回避できる。


メモでした♪