D0#05初心者でも3日迷走すればなんとかなる(2005-12/30)(その3) | //www.旧型、PSP開発幼稚園.game.jp/(本館)

D0#05初心者でも3日迷走すればなんとかなる(2005-12/30)(その3)

(2005-12/30)(その3)
なんとか動いたけど(5月のバージョンだよ)

初心者でも3日迷走すればなんとかなる

outpatchが判らない

$ make
psp-gcc-4.0.0  -mgp32 -mlong32 -msingle-float 
        -mabi=eabi  -c startup.S -o startup.o
psp-gcc-4.0.0   -Wall -O3 -fomit-frame-pointer 
        -mgp32 -mlong32 -msingle-float 
        -mabi=eabi  -c xmain.c -o xmain.o
psp-gcc-4.0.0 -nostartfiles -Wl,-Ttext=0x08900000 
        startup.o xmain.o  -lc -o out
psp-strip out
outpatch
modulename not found
make: *** [EBOOT.PBP] Error 1

outpatchにモジュール名がみつかんないよって
言われちゃうんだけど、昨日も言われたんだけど
まだ怪しいからって事で切り捨ててたんだけど、
今日も言われてしまった。
んー、設定が何処か基本的におかしいのかな。

(ごちゃごちゃついてるオプション達は、まさか私の頭が、
考えた訳ではなく、単にコピー&ペーストしただけです。
大体、テキストエリアが何処からとか、そんなん全然
知らないのに、書ける筈がないでしょ。
しかも現在のレベルでは、そんなんどうでもいいよっ!
て、余計な事ばかり)

で、outpatchって一体何を探してるのかな。
”out”の中を覗くとsceDisplayとかsceGe_userとか
いかにも私はラベルですってのが入ってんだけど。
user_mainってのはあるけどxmainはないなあ。
なんでだろ。おかしいなあxmain.oにはあるのに、
なんで抜け落ちちゃうんだろ。

とにかくそんな事はどうでも良くって、仕方がないから
outpatchのソース(なんと標準で添付されてた!
ありがとお→だってわかんないからdisになりがちでしょ)

で、”outpatch.cpp”を見た。

#define str_modulename ”HelloWorld”
...
	ofs_modulename=0;
	unsigned long len_modulename=strlen(str_modulename);
	for (i=0; i<filesize; i++) {
		if (memcmp(buf+i,str_modulename,len_modulename)==0) {
			ofs_modulename=i;
			break;
		}
	}
...
	if (ofs_modulename==0) {
		printf(”modulename not found¥n”);
		if (buf) { free(buf); buf=NULL; }
		exit(1);
	}
ってそりゃあ無理でしょ。HelloWorldなんて関数ある訳ない。

あああ、またはまってるなあ。がっくし。ぢゃあ
int HelloWorld(void)
{
	return 0;
}
でも追加するか。とりあえず。

で、やってみたけど駄目、相変わらずモジュール名消えちゃうし
最適化で喰われちゃうのか?
無駄なコード書けばいいのか?
-O3はやめるべきなのか?
うーんどれも違うよな。単に人のせいにしてるよな。
なにかこうもっと根本的な事だな多分。
もっとなーんだっていうようなはづかしい事なんだろうけど
思いつかない。でもなんでHelloWorldなんてツールなのに
書いてあるんだろ不思議。

で、他のソースを”HelloWorld”で検索してみた。
あれえ、出てこないぞ?もしかしてこの
”outpatch”ってとてつもなく古いversionなのか?

でgoo”outpatch”でWeb検索
1行目に出てきた。(5月の情報)

少し検索をしたので少し情報が増えた。
私は3日前から始めたので過去の事は判らないが、
どおも世間には(5月の情報)(7月の情報)(10月の情報)が
あるらしい。とにかく詳しく知らないが、
(5月、7月の情報)についてはPS2のSDKを使って
PSPのプログラムを作っていたらしい。
(今でもそうなのかも知れないが)そんで現時点(12月の末)では、
(5月、7月の情報)にあるPS2のSDKは手に入らない
(回った所は全部だめ、だから迷走してるんだよ、
別に個人的にはとりあえず古い方法でもかまわない)
(10月の情報)もまあかなりリンク切れであやしい。


(5月の情報)によると「Hellopsp_src」というのがあって
それを改造してごにょごにょって書いてある。それは一応落として
きてあるんだけどmakeじゃなくてバッチ”mk.bat”なんだよね。
うちのcygwinは、バッチを実行すると何故かホストOS(W98SE)
ごと落ちる。”$ ./mk.bat↓” だからこれやりたくなかったんだけど。
(だから迷走してるんです。)仕方がない。やってみますか。

c:¥ps2dev¥gcc¥ee¥bin¥ee-gcc  は  psp-gcc-4.0.0  に変えて、
 -march=r4000  はいらないでしょ当たり前だから。
 -xassembler   はいらないでしょ当たり前だから。
c:¥ps2dev¥gcc¥ee¥bin¥ee-ld   も  psp-gcc-4.0.0  でいいと思うんだが
念のため psp-ld にしておこう。
あと-g オプションはたぶんgnu互換って意味だろうから取っちゃぇ。
でどおせOS落ちるんだから、最後に
	elf2pbp outp ”null test”
を追記
これでEBOOT.PBPが出来るといいな。→だめだな(OS落ちた)

(注意:cygwinはbashですから、batは実行できません。しかもこれ、
MSDOS用のBATファイルだし、そんなん動く訳ないんだってば!
無理やり動かすと、ホストOSごと暴走します。(危険)
(Unix用の)BATを書きたいのなら、とっととシェルスクリプトに
してください。シェルスクリプト化するには、頭の一行目に、
(2行目では駄目、コメントになってしまう。1行目は特殊な意味がある)
「#!/bin/sh」を追加するだけです。BATと紛らわしいので普通は、
ファイル名の拡張子を「sh」に変更します。例えば「hennyohennyo.sh」)


じゃあ1行づつ手打ちで、

$ psp-gcc-4.0.0 -mgp32 -mlong32 -c hellopsp.c

これはOK。

$ psp-gcc-4.0.0 -mgp32 -mlong32 -c pg.c
pg.c: In function ’pgFillvram’:
pg.c:110: warning: pointer targets in assignment differ in signedness
pg.c: In function ’pgBitBlt’:
pg.c:124: warning: pointer targets in assignment differ in signedness
pg.c: In function ’pgPutChar’:
pg.c:153: warning: comparison is always false due to limited
 range of data type
pg.c:155: warning: pointer targets in assignment differ in signedness

まあこれもOKってことにしよ。(運が悪くても暴走するだけでしょ)

$ psp-gcc-4.0.0 -mgp32 -c  -O -o startup.o startup.s
startup.s: Assembler messages:
startup.s:17: Error: illegal operands `la $v0,_gp’
startup.s:18: Error: illegal operands `move’
startup.s:23: Error: illegal operands `li $v0,1’
startup.s:70: Warning: setting incorrect section attributes
 for .rodata.entrytable

これは致命的だな書き換えなきゃ。

_start:
        la      $v0,_gp
        move    $gp,$v0

        jal xmain
        nop
        jr      $ra
        li      $v0, 1
...
        .section    .rodata.entrytable,”wa”,@progbits
__entrytable:

を

_start:
        la      $2,_gp
        move    $gp,$2

        jal xmain
        nop
        jr      $ra
        li      $2, 1
...
        .section    .xodata.entrytable,”wa”,@progbits
__entrytable:

にしよ(これでいいのかな)

で最後に、
psp-ld -O0 startup.o hellopsp.o pg.o -M -Ttext 8900000 -q -o out

うわてぇ抜いたからでろでろ出てきた。仕方ない。手抜きしないで。

psp-ld -O0 startup.o hellopsp.o pg.o -M -Ttext 8900000 -q -o out > map.txt

まあよしとしよ。で、outpatch
$ outpatch
successed filesize:00010494 modulename:0000F084 scemoduleinfo:0000F36B

お、”modulename not found” ぢゃないもんが、なんかでてる(わざとらしい)

じゃあ
$ elf2pbp outp ”taihen desuuu”
BASH: elf2pbp: command not found

あり、HDDもったいないから消ちゃったんだっけ(せこ)気を取り直して

$ elf2pbp outp ”otukare sama”
Elf2Pbp v0.3  -  loser 2005
successfully generated pbp file

さてこれで動くもんかね。で、XMASパーティーに連れてったっきり
ほっぽっといたPSPを取り出して、えーとコード、コード、USB
に繋いで、転送する。(WinXPのSP2以降なら何も考えずOK、
うちはWin98SEだけどドライバ入れてあるからOKなんよ)

で、動いた。で、サターン何たらって何?あっゲームラボだ。
最近読んでないなあ。


(本日のレベル単細胞生物、乾き気味)
(状態:やっと迷走から首一つ上に出た、でも死にかけ)

■補足(2006-01/19) Outpatchが判らないのは、当たり前です。 Outpatchは複数のVerがあり、互換性がありません。 その互換性がない部分というのは、「モジュール名」のみです。 モジュール名「HelloWorld」のタイプと、 モジュール名「USERPROG」のタイプの2種類が存在する様です。 ここの「モジュール名」はコンパイルさせたいStartup.Sの中身と一致する 必要があります。 現在のOutpatchの標準モジュール名は「USERPROG」に 統一されているようですので、 もし「HelloWorld」のタイプのOutpatchなら、 バイナリエディターで強制的に書き換えちゃえ。 (注:書き換えて余った名称は、ゼロ(0x00)で埋める事。)