昔の最近の出来事(2002.12)

2002/12/31

比較的早く起きて、綾之助氏に最近の同人誌をみせてもらったり。 色々な事実を知った(笑。綾之助氏は午前中に離脱。
DVD鑑賞したりFLASHムービー鑑賞したり。

帰着後、だらだらとTV観たりしながら過ごしたり。

あぁ、そういや今年を振り返るの忘れてた。いや、別に振り返らなくても 良いですが(^^;。今年はppcsimを結構大きくいじっていた感じが します。結局Linuxカーネルは動かす事ができませんでしたが(T_T)。 bison/flexで遊んだり、ppcsimでPPC-Linuxバイナリを動かす様にしたり、 Cygwinのバグに付き合ったりと、まぁだらだらとやってたような 感じですね(^^;
それよりも今年は異常に体調がよろしく無かったのがアレでした。 来年は少し体調に気を付けたいですな。

そんな感じで今年の更新はここまで。

2002/12/30

朝はわりと普通に起きて散髪に。

帰ってから連絡待ちでぐーたら過ごしていたら寝てしまったり。
そして HIROSHI☆邸に出撃。携帯リモコンで一時 モスバーガーに 集合。HIROSHI☆さんと綾之助(旧PN)氏と合流。直接会うのは 両氏共かなり久しぶりだったり。でも、あいも変わらず。そんな感じ(^^;
最近(と言ってもここ二年くらいの話)の出来事を聞いたり。移動して DVD鑑賞会だったり(^^;

2002/12/29

爆睡。「ごくせん」のまとめ番組観てから休出。

帰って来てから連絡取ったり。すまん。

2002/12/28

爆睡。

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

取りあえず、new-cygwin1.dllの生成には成功。でもその後、 cygserver.exeのリンクで、/usr/lib/mingw/libstdc++.aに undefined reference to ????? が大量に出て失敗。 まぁいいか(本当か?)

で、cygwin-1.3.18にアップデートして、fork_copy性能テストを 試してNGを確認した後、snapshotからbuildしたcygwin1.dllを インストール。1.3.19になっている模様。しばらくこれで 使ってみるという事で。

そういや、何気にWebぐるしていると、 以前 書き方がよく判らなかったマクロによる空の可変長引数の 渡し方について、書かれたページを発見。 どうやら、

#define DEBUG(fmt,...)   printf(fmt,##__VA_ARGS__)

という風に「##」を書けば良い事が判りました。これを踏まえてgccの infoを探ってみると、cpp.info-2にそれらしき事がちゃんと書かれて いるようです(^^;

2002/12/27

出張。日付け越えで帰着。

2002/12/26

出張。

2002/12/25

出張。

2002/12/24

少し早めに帰着。

先日の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.

うむぅ。
そんな感じでクリスマス絵。

2002年クリスマス絵

2002/12/23

昼過ぎ起床。今日はお休み。掃除したりごちゃごちゃと。

特に何をするでもなくダラダラ過ごして一日終了。

何気に 以前 問題になったポインタのキャストについての不具合が気になったので、 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

と同じ事らしいです。-d は

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]

で、destination_directoryとなっていますが、build視点では source_directoryのような気がするのは気のせいみたいです(^^; cvs checkout視点ではdestination_directoryで良いと思いますが。 名前を付けるって難しいなぁと思ったりした瞬間。

gcc_buildを実行中、contrib/ChangeLog などを眺めていると、 スクリプト自体は2000/07に新規登録されたようで、その頃はと いうと、ppcsimでやっとこpovrayが動いてまったりしている 辺りだったので、2.95.2には含まれていなかった模様。

2002/12/22

昼過ぎ起床。休出。日付け越え前に帰着。

先日の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

ふぅ。

2002/12/21

昼過ぎ起床。休出。大幅に日付け越え。

先日の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---------

更にbashのconfigure --help を実行してみた所、catが実行できなくてNG。 即興でcatもどきを作って実行してみた所、なんとかOKそう。以下 djpegのconfigure --helpを実行した所。bashのconfigure --helpは 長いので(^^;

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

インタラクティブモードはNG。でもこれ以上(signal関係やpipe関係など)は、 需要として無い気がしています。

2002/12/20

大幅に日付け越え。

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 実行がうまくできなくなっていてヘコリ。

2002/12/19

大幅に日付け越え。

TV観ながらWeb巡回して終了。

2002/12/18

大幅に日付け越え。

灰羽観て終了。

2002/12/17

大幅に日付け越え。

TV観つつWeb巡回して終了。

2002/12/16

大幅に日付け越え。

TV観つつちょっこりppcsimをいじって終了。

2002/12/15

昼過ぎ起床。休出。更に大幅に日付け越え。

眠くて死亡

2002/12/14

昼過ぎ起床。休出。大幅に日付け越え。

JPEG2000についてWeb検索した所、Netscapeプラグインとか画像ビュア でロード対応しているものとかいくつかある事が判りました。 画像ビュアとしてはIEかLaymanしか使っていなかったのですが、 IrfanViewをインストールしてみました。因みに定番である らしいSusieは、以前インストールを試みた事があるのですが、 何を拾って入れれば良いのかイマイチよく判らなくてインストール断念 した記憶があります。
後、IEのJPEG2000プラグインなどが こちら で作成されている様だったので入れてみました。7-zipとかいう 形式になっていてそれは良いのですが、肝心の展開ツールが 見つからず偉く苦労したのは秘密。7-zipの本家と思われるページが 404だったりしたのですが、そういうものなのでしょうか?

なんとなく表示できる様にはなりましたが、見るだけって感じかも。

2002/12/13

大幅に日付け越え。

飯食ってちょろっとWeb巡回して終了。

2002/12/12

日付け越え。

先日の続き。取りあえず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'

なるコンパイラの啓示を受けたので、tmpnamをmkstempに 変更してリンクしたところビルドOKとなりました。でも、 何ですか?これ。初めて遭遇しましたよ。

で、エンコード&デコードを行った所OKそう。うむ。

探偵ナイトスクープを観て大笑い。

2002/12/11

日付け越え。

jasperツールをppcクロスコンパイルしてみたり。でもconfigureで 変数型のサイズをテストするのに、テストプログラムをネイティブ 実行する事ができずエラー終了。ちょっこり手を入れたけど入れ方 が悪くてスクリプトがエラーしたりして終了。
ネイティブ実行する必要のあるconfigureスクリプトは、クロス環境で バイナリを作れないので不便です。コンパイラ予約の変数型宣言は いちいちネイティブ実行しなくても良い様に、コンパイラオプション とかで基本的な情報を出力できるようにすれば良いのに。

2002/12/10

日付け越え。

以前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

とかやれば良いらしい。因みに、rateはcjpegでいう所の -qualityオプションに相当する画質指定オプションのようです。 rate=0.042でcjpeg -quality 50 で生成したファイルとほぼ同等の ファイルサイズになりました。因みに、rateが0.1以下でファイルサイズ と画質に大きな違いが出てくる様です。0.8とか0.5ではあまりファイル サイズに差が出ない様でした。
同程度のファイルサイズになった所で画質を比較したのが以下。 ファイルサイズ:画質比はJPEG2000の方が当然の様に良いって感じ です。

jp2_jpg_diff.png

あぁ、早く世の中の標準になってくれないかなぁと思いました。

2002/12/09

日付け越え。雪降りで寒くて死亡。

先日の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 */

という感じのいい加減なパッチを当ててバイナリがそのまま通る ような事を期待してみました。で、結果は今日の日記をパッチ後のrxvtを 使用してCygEmacsで書いたという事で。「&」とか「々」とか入れられる様に なったので良しとしてみました。本当にこれで良いのかどうかは 判りませんが(^^;

あぁ、今日は寒くて手を表に出して居られない.......

2002/12/08

昼頃起床。休出。日付け越え前に帰着。

何気に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)))

Meadowと.emacsを共用している都合でversionを見ていますが、 そこはどうでも良くて、 set-terminal-coding-systemとset-keyboard-coding-system を設定してやればOKの模様。因みに今日の日記はCygEmacsで 書きました。Meadowとの違いと言えば、IME起動のバインドは Alt+半角/全角 になっているので、それは変更できない点。 Cntl+Oに割り当てて、それにすっかり慣れてしまっている 手が無意識に押してしまうのがアレです(^^;あと、 マウスが使えないとか、ヤンクバッファがWindowsのクリップボード と共用でないので、コピぺが見えている部分でしかできない とか、何故か全角&などいくつかの記号系全角文字が入力 できないとか(^^; ただ、これはEmacsの問題というよりは 日本語rxvtの方の問題の様で、w3mなどでも入れられません。 最初に立ちあがるDOS窓ターミナルの場合はw3mでは問題の 文字も正しく入れられる様ですが、逆にEmacsの方は キーボード入力がすり抜けている様になりうまくないようです。

2002/12/07

昼頃起床。休出。日付け越え。

ppcsimでのARG領域への引数格納時に領域オーバーフローの チェックを入れたり。現在のppcsimでは argcの最大は64個に なってますが、コマンドラインで引数を渡せる様にしたため、 以下の様にすると簡単に数百個とかいう引数を渡せてしまいます。

src> ls * | wc -l
    109
src> ppcsim -L ls * * *

因みにVer0.93でこれをやるとえらい事になる場合があるかも(汗;
でも、こういう使い方を想定すると64個って少ないかなぁとか思ったりして(^^;

2002/12/06

日付け越え。

トークン分離関数を少し改善。 自由なサイズを実現しようと思うとFILEポインタの様にハンドラ を割り当てる関数を用意した方が良いのですが、異なる文字列 を入れて再評価する時は、それまで使用していたハンドラを 開放する様にしないとメモリリークしてしまいます。でも、 それって使うにはちと面倒。そんな感じで今までのを気のせい 程度に改善したけど、微妙に制限が付いてイマイチ。

2002/12/05

日付け越え。

先日解決した事にした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);

なる宣言が挟まっていました。これを見ると戻り値はintである事が 伺えます。で、glibc上のllseek()は、

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);
}

というラッピングを行っているという事の様です。つまる所、 llseek()をglibcの仕様通りにシステムコールで実装するとNGで、 実際には戻り値4byteのllseek()を実装するという事で正解という 事の様です。なんでこんなに中途半端な事になっているのかは不明。 もうひとつ、stat64()のstat構造体の違いについても、類似である 予感がしたのでよく調べてみたら、stat()の実体はxstat()をラッピング した関数になっていて、xstat()の実体はsysdeps/unix/sysv/linux/xstat.c でシステムコールをラッピングしているという二重ラップになって いたのですが、システムコール実行後、xstat_conv()という関数を 呼んでいて、こいつでglibc仕様のstat構造体メンバにLinuxカーネル仕様の stat構造体のメンバをコピーして構造体メンバーの型変換を行って いるという事が判りました。こちらもllseek()と同じく glibcの仕様通りにシステムコールを実装するのはNGという事でした。 それにしても、stat64()と言いつつ、実体はちっとも64bitでないというのは 一体どういう事なのか極めて謎な気分です。

動く様に直した気分のしていたシステムコールエミュレーション でしたが、結果的に仕様通りだったという感じです。うーむ、 これというのも、Linuxのasm/unistd.hが一目で判る様なプロトタイプ宣言 を行っていないのが問題だ!キシャー!!などと思ったのですが、 今までの経緯を踏まえて マクロをよくよく見てみると、戻り値には4byteしか返さない様に なっている様に見えたりするので、単にヲレがヘボだっただけの気分が しなくもない今日この頃。修行が足りません。

2002/12/04

日付け越え。

リクエストがあった為、「以前の表紙とか」のページを軽くしてみたつもり。 CSSとかスタイルシートとか、最新テクノロジは使い方をよく知らんので、 少しだけ解るTABLEタグで書き直してみました。ちっこい画像は netpbmのpnmscaleを 使って作成してみました。

djpeg -ppm foo.jpg | pnmscale -width=80 | cjpeg -q 70 > foo_s.jpg

って感じ。 ソース画像がjpegでなければより綺麗になるのでしょうけど、縮小する分には 実際の所、画質に大した差は出ないものと思われます。

それにしても、自分ではこのページって ローカルファイルでしか見ないので気づきませんでしたが、こんなに 表紙変えたんだっけ?って感じ。

2002/12/03

少し早めに帰着。

高校の時の同級生と電話。事前に連絡をもらっていたのですが、私が ボケていた&体調不良の為、飲みに行けず残念。近況などを聞いたり 色々。次回は是非飲みで。

2002/12/02

体調悪くて休業。

gcc-3.2.1をppcクロスビルドしてみたり。POVRay3.5で scenes/incdemo/colors.povをレンダリングした結果、

gcc-3.2.1 : Total_count  =     1409413706
gcc-3.2   : Total_count  =     1413457812

という感じでほんの少し実行命令数が減っていました。
それよりもgcc-3.2.1でCygwinネイティブgccのキャスト問題が 解決していてくれる方が嬉しいのですが、それはどうかイマイチ よく判らず。

Cntlキー(にスゲ代わっているCapsLock)が潰れるのも時間の 問題かも.....

2002/12/01

昼頃起床。体調悪し。

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系列では性能面を気にしてこうなっているのでしょうか? それともプリコンパイルヘッダを考慮しているのでしょうか?

寒さでぐったり。


TOP PREV