比較的早く起きて、綾之助氏に最近の同人誌をみせてもらったり。
色々な事実を知った(笑。綾之助氏は午前中に離脱。
DVD鑑賞したりFLASHムービー鑑賞したり。
帰着後、だらだらとTV観たりしながら過ごしたり。
あぁ、そういや今年を振り返るの忘れてた。いや、別に振り返らなくても
良いですが(^^;。今年はppcsimを結構大きくいじっていた感じが
します。結局Linuxカーネルは動かす事ができませんでしたが(T_T)。
bison/flexで遊んだり、ppcsimでPPC-Linuxバイナリを動かす様にしたり、
Cygwinのバグに付き合ったりと、まぁだらだらとやってたような
感じですね(^^;
それよりも今年は異常に体調がよろしく無かったのがアレでした。
来年は少し体調に気を付けたいですな。
そんな感じで今年の更新はここまで。
朝はわりと普通に起きて散髪に。
帰ってから連絡待ちでぐーたら過ごしていたら寝てしまったり。
そして
HIROSHI☆邸に出撃。携帯リモコンで一時 モスバーガーに
集合。HIROSHI☆さんと綾之助(旧PN)氏と合流。直接会うのは
両氏共かなり久しぶりだったり。でも、あいも変わらず。そんな感じ(^^;
最近(と言ってもここ二年くらいの話)の出来事を聞いたり。移動して
DVD鑑賞会だったり(^^;
爆睡。「ごくせん」のまとめ番組観てから休出。
帰って来てから連絡取ったり。すまん。
爆睡。
Cygwinの新しいのが出ているらしいのですが、cvsでソースを探ってみる
に、fork_copyの性能問題が直っていなさそうな予感がするので、
インストール前に先日失敗したsnapshotのコンパイルを通せる様に
しておくことに。
まずconfigureに失敗していたのは、何故かgcc/version.cというファイル
を要求されていてずっこけていたため、gccからそのファイルをコピーして
OK。で、configureは通る様になったのですが、makeで何故かxgccを
探していて、それが見つからずにエラーになりました。何故こんな中途
半端なgccを使おうとするのか謎ですが、取りあえずgccからコンパイル
してみることにしました。
リリースパッケージのgccよりソースをダウンロードしてconfigure,make
を実行したのですが、何故か途中でbashがハングしてNG。で、仕方なく
gcc-3.2.1を先日のbuildスクリプトを使って(--enable-languagesをc,c++
変更)buildしました。取りあえずOKそう。
で、Cygwinを以下のような手順でconfigure,makeしてみました。
cd cygwin-snapshot-20021227-1 mkdir gcc cp ~/develop/gcc_cyg/gcc-3.2.1/gcc/version.c gcc/. mkdir BUILD cd BUILD CFLAGS=-O CXXFLAGS=-O ../configure i686-pc-cygwin --prefix=/usr ln -s /develop/gcc_cyg/gcc-3.2.1/BUILD/gcc . make
#define DEBUG(fmt,...) printf(fmt,##__VA_ARGS__)
出張。日付け越えで帰着。
出張。
出張。
少し早めに帰着。
先日のbuildはエラー無く終了した模様。で、xgccの状態でcast不具合
ソースをコンパイルした所、結果NG。へこり。
gcc> ./xgcc.exe -I../../gcc/ginclude -S cast.c gcc> gcc cast.s gcc> ./a.exe 3.141593 -3.141593 gcc> ./xgcc.exe -I../../gcc/ginclude -O2 -S cast.c gcc> gcc cast.s gcc> ./a.exe 3.141593 3.141593 gcc> ./xgcc --version xgcc (GCC) 3.2.1 Copyright (C) 2002 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
昼過ぎ起床。今日はお休み。掃除したりごちゃごちゃと。
特に何をするでもなくダラダラ過ごして一日終了。
何気に
以前
問題になったポインタのキャストについての不具合が気になったので、
gcc-3.2.1をCygwinネイティブコンパイルしてみる事に。
configure中にgcc内ディレクトリを散策していて、contrib/gcc_build
というスクリプトが目に入りました。そういやずっと前にcvsでの
gccのダウンロード方法がイマイチよく判らなかった時、どこからか
このスクリプトを実行すれば良いとして実行していたけど、結局
cvsダウンロード方法の書かれたページを見つけてからは、すっかり
忘却の彼方に葬りさっていました。で、
mkdir build ./contrib/gcc_build -o build -d ~/develop/gcc_cyg/gcc-3.2.1 -c '--prefix=/usr --enable-languages=c' build
mkdir build cd build ../configure --prefix=/usr --enable-languages=c make make bootstrap
gcc-3.2.1> ./contrib/gcc_build -h ./contrib/gcc_build: illegal option -- h gcc_build [-c configure_options] [-d destination_directory] [-m make_boot_options] [-o objdir] [-u username] [-p protocol] [-t tarfile] [bootstrap] [build] [checkout] [configure] [export] [install] [test] [update]
昼過ぎ起床。休出。日付け越え前に帰着。
先日のconfigure --help実行ですが、よく見ると後ろの方の出力が
変でした(^^; 一つはcatもどきのバグで、1024byte単位で
read→writeをしているのですが、最後の1024byte以下の切れ端
も1024byteでwriteしてました。もうひとつは、catを実は二度
実行しているのですが、二度目のcat実行で何故かstdoutへの
writeが失敗していて、正しくメッセージ出力がされていません
でした。前者はさっくり直して良しとして、後者の原因がすぐ
判らず。どうやら「<<」構文をcatに食わせてメッセージ
出力を行っているようですが、一度メッセージを/tmp/t2-xxxと
いう一時ファイルに出力して、それをcatの入力にしているようです。
このとき、一時入力ファイルは親プロセスがオープンし生成するの
ですが、その後fork()によりfildesを引き継いだ後、dupで
stdinにfildesをコピーした後、execve()を実行しているようで、
結果一時ファイルはcat実行では標準入力から入力しているという
イメージになっているようです。この時、fork()時にstdioは何も考えずに
0,1,2を使用していたのですが、それが最初のcat実行でclose()
されてしまっている様だったので、その辺を狙って修正。
でも直らず。いい加減に脊髄反射で直していたら、elfローダ
がエラーする様になったり、入力fdと出力fdが同じになって
catで無限にファイルを大きくし続けるようになったりと、
fildesの繋がりがぐにゃぐにゃになったり(^^;
で、考えを整理して修正。シミュレータ上で開くfildesは全て
dupでコピーしたものをアクセスするようにし、子プロセス
生成では必ず親のfildesをdupでコピーしたものを自分の
持ち物にする事で解決。正しくは以下のような感じ。
jpeg-6b> ~/develop/ppcsim/src/ppcsim.exe -L ../bash-2.04/bash ./configure --help Usage: configure [options] [host] Options: [defaults in brackets after descriptions] Configuration: --cache-file=FILE cache test results in FILE --help print this message --no-create do not create output files --quiet, --silent do not print `checking...' messages --version print the version of autoconf that created configure Directory and file names: --prefix=PREFIX install architecture-independent files in PREFIX [/usr/local] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [same as prefix] --bindir=DIR user executables in DIR [EPREFIX/bin] --sbindir=DIR system admin executables in DIR [EPREFIX/sbin] --libexecdir=DIR program executables in DIR [EPREFIX/libexec] --datadir=DIR read-only architecture-independent data in DIR [PREFIX/share] --sysconfdir=DIR read-only single-machine data in DIR [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data in DIR [PREFIX/com] --localstatedir=DIR modifiable single-machine data in DIR [PREFIX/var] --libdir=DIR object code libraries in DIR [EPREFIX/lib] --includedir=DIR C header files in DIR [PREFIX/include] --oldincludedir=DIR C header files for non-gcc in DIR [/usr/include] --infodir=DIR info documentation in DIR [PREFIX/info] --mandir=DIR man documentation in DIR [PREFIX/man] --srcdir=DIR find the sources in DIR [configure dir or ..] --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names Host type: --build=BUILD configure for building on BUILD [BUILD=HOST] --host=HOST configure for HOST [guessed] --target=TARGET configure for TARGET [TARGET=HOST] Features and packages: --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --x-includes=DIR X include files are in DIR --x-libraries=DIR X library files are in DIR --enable and --with options recognized: --enable-shared build shared library using GNU libtool --enable-static build static library using GNU libtool --enable-maxmem[=N] enable use of temp files, set max mem usage to N MB
昼過ぎ起床。休出。大幅に日付け越え。
先日のfork()での子プロセスへのfdの引継ぎについて。
親プロセスがopen()したfdを覚えておいて、子プロセスをfork()
するときにdupでコピーすれば良いのかなぁと思ったのですが、
ネイティブでopen()を実行する際、fdは指定した番号で開けないので
プロセスIDをベースナンバーにした、単純なテーブルを構成
する事はできず。うーむ。
ふにゃふにゃになりながらppcsim上のプロセスが指定するローカルfdと
scエミュレーションでのネイティブ実行で使用するグローバルfdとを
変換するルーチンを組み込んでみました。微妙な罠にはまりながら
どうにか動く様になった模様。
bash-2.04> cat test.sh echo "--------test start--------" ls -l l*.c set echo "---------test end---------" bash-2.04> ~/develop/ppcsim/src/ppcsim.exe -L bash test.sh --------test start-------- -rw-r--r-- 1 500 544 3510 Aug 5 1999 list.c -rw-r--r-- 1 500 544 7126 Mar 14 2000 locale.c BASH=/bin/bash BASH_VERSINFO=([0]="2" [1]="04" [2]="0" [3]="2" [4]="release" [5]="powerpc-unknown-linux-gnu") BASH_VERSION='2.04.0(2)-release' DIRSTACK=() EUID=500 GROUPS=() HOSTNAME=none HOSTTYPE=powerpc IFS=' ' MACHTYPE=powerpc-unknown-linux-gnu OPTERR=1 OPTIND=1 OSTYPE=linux-gnu PATH=/usr/gnu/bin:/usr/local/bin:/usr/ucb:/bin:/usr/bin:. PIPESTATUS=([0]="0") PPID=0 PS4='+ ' PWD=/cygdrive/c/tane/develop/ppctest/linuppc/bash-2.04 SHELL=/bin/sh SHELLOPTS=braceexpand:hashall:interactive-comments SHLVL=1 TERM=dumb UID=500 _=locale.c ---------test end---------
jpeg-6b> ~/develop/ppcsim/src/ppcsim.exe -L ../bash-2.04/bash configure --help Usage: configure [options] [host] Options: [defaults in brackets after descriptions] Configuration: --cache-file=FILE cache test results in FILE --help print this message --no-create do not create output files --quiet, --silent do not print `checking...' messages --version print the version of autoconf that created configure Directory and file names: --prefix=PREFIX install architecture-independent files in PREFIX [/usr/local] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [same as prefix] --bindir=DIR user executables in DIR [EPREFIX/bin] --sbindir=DIR system admin executables in DIR [EPREFIX/sbin] --libexecdir=DIR program executables in DIR [EPREFIX/libexec] --datadir=DIR read-only architecture-independent data in DIR [PREFIX/share] --sysconfdir=DIR read-only single-machine data in DIR [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data in DIR [PREFIX/com] --localstatedir=DIR modifiable single-machine data in DIR [PREFIX/var] --libdir=DIR object code libraries in DIR [EPREFIX/lib] --includedir=DIR C header files in DIR [PREFIX/include] --oldincludedir=DIR C header files for non-gcc in DIR [/usr/include] --infodir=DIR info documentation in DIR [PREFIX/info] --mandir=DIR man documentation in DIR [PREFIX/man] --srcdir=DIR find the sources in DIR [configure dir or ..] --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names tadir=DIR read-only architecture-independent data in DIR [PREFIX/share] --sysconfdir=DIR read-only single-machine da--enable and --with options recognized: --enable-shared build shared library using GNU libtool --enable-static build static library using GNU libtool --enable-maxmem[=N] enable use of temp files, set max mem usage to N MB
大幅に日付け越え。
ppcsimでbashを動かす為、未実装システムコールだったdup,dup2を追加。
取りあえずファイル指定での実行はできる様になった模様。
子プロセス生成によりlsの実行はできたのですが、子プロセスの
終了後、close()したfdからread()しようとして死亡。truss onの
結果を少し眺めてみた所、
親プロセスと子プロセスで、一瞬だけ同じfdを持つ場合があって、
それを子プロセス側ではfork()からexecve()が実行されるまでに
close()しているのですが、ppcsim内部管理的にはただ一つのfdを
子プロセスがclose()した時点でそのfdは消滅してしまいます。
子プロセス終了後、親プロセスに実行権が戻ってきますが、
親プロセスではopen()したままのハズのfdでread()を
実行したけれど、そのfdは既に子プロセスにclose()されていてread()に失敗
する。という事らしいです。ふーむ。でもこれ、どうすれば
良いのかなぁ......
cygwinのsnapshotをコンパイルしようとした所、何故かconfigure
実行がうまくできなくなっていてヘコリ。
大幅に日付け越え。
TV観ながらWeb巡回して終了。
大幅に日付け越え。
灰羽観て終了。
大幅に日付け越え。
TV観つつWeb巡回して終了。
大幅に日付け越え。
TV観つつちょっこりppcsimをいじって終了。
昼過ぎ起床。休出。更に大幅に日付け越え。
眠くて死亡
昼過ぎ起床。休出。大幅に日付け越え。
JPEG2000についてWeb検索した所、Netscapeプラグインとか画像ビュア
でロード対応しているものとかいくつかある事が判りました。
画像ビュアとしてはIEかLaymanしか使っていなかったのですが、
IrfanViewをインストールしてみました。因みに定番である
らしいSusieは、以前インストールを試みた事があるのですが、
何を拾って入れれば良いのかイマイチよく判らなくてインストール断念
した記憶があります。
後、IEのJPEG2000プラグインなどが
こちら
で作成されている様だったので入れてみました。7-zipとかいう
形式になっていてそれは良いのですが、肝心の展開ツールが
見つからず偉く苦労したのは秘密。7-zipの本家と思われるページが
404だったりしたのですが、そういうものなのでしょうか?
なんとなく表示できる様にはなりましたが、見るだけって感じかも。
大幅に日付け越え。
飯食ってちょろっとWeb巡回して終了。
日付け越え。
先日の続き。取りあえずconfigureがエラーしない様に適当に
直して実行。取りあえずMakefileは作れた模様。でもツール
ビルドでリンクエラー。libtoolsが-lmを勝手に外してしまい
libm系関数のリンクエラー。後、
appl> powerpc-linux-gcc -g -O2 -o jasper.exe jasper.o ../libjasper/.libs/libjasper.a -lm ../libjasper/.libs/libjasper.a(jas_stream.o): In function `jas_stream_tmpfile': /cygdrive/c/tane/develop/ppctest/linuppc/jasper-1.600.0/src/libjasper/base/jas_stream.c:407: the use of `tmpnam' is dangerous, better use `mkstemp'
日付け越え。
jasperツールをppcクロスコンパイルしてみたり。でもconfigureで
変数型のサイズをテストするのに、テストプログラムをネイティブ
実行する事ができずエラー終了。ちょっこり手を入れたけど入れ方
が悪くてスクリプトがエラーしたりして終了。
ネイティブ実行する必要のあるconfigureスクリプトは、クロス環境で
バイナリを作れないので不便です。コンパイラ予約の変数型宣言は
いちいちネイティブ実行しなくても良い様に、コンパイラオプション
とかで基本的な情報を出力できるようにすれば良いのに。
日付け越え。
以前netpbmの新しいのに、JPEG2000のコンバートができるモジュール
が入っているハズだけどみつからなかった話の続き。オンライン
ドキュメントを眺めてみると、JPEG2000のencoder/decoderを実装した
JasPerと呼ばれるライブラリソフトウェアが必要だったらしい。
このjasperツールのドキュメントを読んだ感じ、pnmとの行き来ができる
encode/decodeツールも含んでいるらしいという事でダウンロードして
みました。オプション指定に若干の癖がありますが、
jasper.exe -f cg020924.bmp -t bmp -F test.jp2 -T jp2 -O rate=0.042
日付け越え。雪降りで寒くて死亡。
先日のrxvtで一部の全角文字が入力できない話について。
以前使用させていただいていた
2.6ベースのパッチのrxvtを使用すると&も」も入力する
事ができました。現在、使用させていただいている
2.7ベースのパッチだけの問題の様だったのでちょこーり
ソースを眺めてみました。src/command.c:run_child()で
/dev/ttyをオープンしている様だったので、ここん所を
src> diff -c command.c.org command.c *** command.c.org Sun Oct 6 22:08:48 2002 --- command.c Tue Dec 10 02:00:48 2002 *************** *** 527,533 **** } # endif /* ---------------------------------------- */ ! fd = open("/dev/tty", O_RDWR | O_NOCTTY); D_CMD((stderr, "run_child(): /dev/tty has controlling tty? %s", fd < 0 ? "no (good)" : "yes (bad)")); if (fd >= 0) close(fd); /* ouch: still have controlling tty */ --- 527,533 ---- } # endif /* ---------------------------------------- */ ! fd = open("/dev/tty", O_RDWR | O_NOCTTY | O_BINARY); D_CMD((stderr, "run_child(): /dev/tty has controlling tty? %s", fd < 0 ? "no (good)" : "yes (bad)")); if (fd >= 0) close(fd); /* ouch: still have controlling tty */
昼頃起床。休出。日付け越え前に帰着。
何気にCygEmacsのSJISターミナルでの日本語表示とエディット
について調べてみた所、以下の様にすれば良いらしい事を発見しました。
(if (string-match "windows98" (version)) (progn (mw32-ime-initialize);;; (setq default-input-method "MW32-IME")) (progn (set-terminal-coding-system 'shift_jis-unix) (set-keyboard-coding-system 'shift_jis-unix)))
昼頃起床。休出。日付け越え。
ppcsimでのARG領域への引数格納時に領域オーバーフローの
チェックを入れたり。現在のppcsimでは argcの最大は64個に
なってますが、コマンドラインで引数を渡せる様にしたため、
以下の様にすると簡単に数百個とかいう引数を渡せてしまいます。
src> ls * | wc -l 109 src> ppcsim -L ls * * *
日付け越え。
トークン分離関数を少し改善。
自由なサイズを実現しようと思うとFILEポインタの様にハンドラ
を割り当てる関数を用意した方が良いのですが、異なる文字列
を入れて再評価する時は、それまで使用していたハンドラを
開放する様にしないとメモリリークしてしまいます。でも、
それって使うにはちと面倒。そんな感じで今までのを気のせい
程度に改善したけど、微妙に制限が付いてイマイチ。
日付け越え。
先日解決した事にしたppcsimでのllseek()での戻り値を32bitにすると
gzip -l での表示が正しくなる件がやはり気になって調査。
gzip.c内にコードを仕込んでoff_tのサイズを調べた所、やはり8byteの
型であることが判りました。実際にgzip.cで使用されているのは
lseek()だったので、もしやlseek()とシステムコールであるllseek()
の間に何か秘密があるのでは?という事でglibcのmisc/llseek.d
を見てみた所、sysdeps/unix/sysv/linux/llseek.cが実体になっていて、
その中で、
extern int __syscall__llseek (int fd, off_t offset_hi, off_t offset_lo, loff_t *__unbounded result, int whence);
extern loff_t __llseek (int fd, loff_t offset, int whence); loff_t __llseek (int fd, loff_t offset, int whence) { loff_t result; return (loff_t) (INLINE_SYSCALL (_llseek, 5, fd, (off_t) (offset >> 32), (off_t) (offset & 0xffffffff), __ptrvalue (&result), whence) ?: result); }
日付け越え。
リクエストがあった為、「以前の表紙とか」のページを軽くしてみたつもり。
CSSとかスタイルシートとか、最新テクノロジは使い方をよく知らんので、
少しだけ解るTABLEタグで書き直してみました。ちっこい画像は
netpbmのpnmscaleを
使って作成してみました。
djpeg -ppm foo.jpg | pnmscale -width=80 | cjpeg -q 70 > foo_s.jpg
少し早めに帰着。
高校の時の同級生と電話。事前に連絡をもらっていたのですが、私が
ボケていた&体調不良の為、飲みに行けず残念。近況などを聞いたり
色々。次回は是非飲みで。
体調悪くて休業。
gcc-3.2.1をppcクロスビルドしてみたり。POVRay3.5で
scenes/incdemo/colors.povをレンダリングした結果、
gcc-3.2.1 : Total_count = 1409413706 gcc-3.2 : Total_count = 1413457812
昼頃起床。体調悪し。
gzip -l の結果異常の調査。原因はllseek()の戻り値を64bitで返して
いたのですが、実際は32bitで良かったというものでした。
glibcのinfoにllseek()が見つからなかった為、何故64bit戻り値だと
思ったのかが思い出せずヘコりですが結果オーライという感じで。
後、ニセshにバグがあり、ゴミをexecve()に渡してしまう事があったの
ですが、execve()エミュレーションでそのゴミを食ってしまうと
Segfaultで落ちてしまう事がありました。scエミュレーション全般に
含まれるバグなのですが、
シミュレータメモリへのポインタをそのままネイティブシステムコール
に渡している為、メモリ未実装アドレスを指定するとSegfaultで落ちて
しまいます。そんな感じでアクセスするアドレスのチェックを強化
してみたり。
bzip2もppcネイティブコンパイルしてみましたが、テストも含めて
一発OK。バッチリです。
先日のgccの動きを見ていて、おや?と思ったのがcc1(コンパイラ本体)の
中にcppの機能が含まれている様に見えた点。-E付きの時はcc1の代わりに
cpp0が動いてプリプロセッサを通した結果を出力するという感じに
なっている様です。確か2.95系では cppの一時置きを *.i というファイル
に吐き出して、続いてcc1はそれを食って *.s を生成するという感じでした。
gcc Ver3系列では性能面を気にしてこうなっているのでしょうか?
それともプリコンパイルヘッダを考慮しているのでしょうか?
寒さでぐったり。