/** * ディレクトリツリーを作成する * * $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; }
2013年4月25日木曜日
FileFind_maptree() for PHP
コード、ちょとメモっとく。
elfファイルをリロケーションの仕組み 概要
elfファイルをリロケーションする仕組み 概要
MMU での仮想メモリのアドレスを書き換えてしまえばいいのでそれほど面倒なことではない。
簡単に言っちゃえば、elfファイルのロード先アドレスにロードして、そこに ジャンプ してしまう方法ができる。
MMU の無いアーキテクチャは、
中身の elf に含まれる プログラムコード の命令セットなどの中でメモリアドレス指定箇所を1個づつかきかえていく。これがリロケーションって作業なんだ。
と実行すると ファイルのセクション情報が表示される。
その中に、"RELOCATION RECORDS FOR ..." と書かれた箇所がある。
でも単純に加算すればいいわけではなく、これらは プログラムコード(arm命令セット)になっています。
ですから、プログラムコード(arm命令セット)として適切なビットだけを書き換えなければなりません。
2. セクション情報を取得
3. memcpy() でセクションを移動して
4. リロケーション情報をもとにアドレスを書き換え
で、実行先エントリーポイントへジャンプすればプログラムは実行できる。
ってことのようです。
これは仕事じゃないから、そのうち試してみます。
はじめに
MMU のあるアーキテクチャは、MMU での仮想メモリのアドレスを書き換えてしまえばいいのでそれほど面倒なことではない。
簡単に言っちゃえば、elfファイルのロード先アドレスにロードして、そこに ジャンプ してしまう方法ができる。
MMU の無いアーキテクチャは、
中身の elf に含まれる プログラムコード の命令セットなどの中でメモリアドレス指定箇所を1個づつかきかえていく。これがリロケーションって作業なんだ。
リロケーションするためどう書き換えてくか?
たとえば hello.o というオブジェクトファイルがあれば$ arm-none-eabi-objdump -x hello.o
と実行すると ファイルのセクション情報が表示される。
その中に、"RELOCATION RECORDS FOR ..." と書かれた箇所がある。
...これらは elf ファイルに有る、 .text セクション内の実際のデータをに対して、移動先アドレスまでのオフセットを加算すればリロケーションできる。
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
...
でも単純に加算すればいいわけではなく、これらは プログラムコード(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) ではビルドできなくなる かも しれません。(テストしていないです)
ビルド方法の例です。
が、 そう簡単にはビルドが通りません。
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 でエラー
linux-2.6.14.6/scripts/kconfig/Makefile を書き換える。
これで回避できる。
この回避方法は次のように
$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 しようとしたら、こんなエラー出てきた。
回避方法は Makefile を修正してしまう。
メモでした♪
$ make menuconfig
Makefile:462: *** 暗黙ルールと通常ルールが混ざりました. 中止.
回避方法は Makefile を修正してしまう。
462c462これで回避できる。
< config %config: scripts_basic outputmakefile FORCE
---
> %config : scripts_basic outputmakefile FORCE
メモでした♪
登録:
投稿 (Atom)