D0#05初心者でも3日迷走すればなんとかなる(2005-12/30)(その3)
(2005-12/30)(その3)
なんとか動いたけど(5月のバージョンだよ)
なんとか動いたけど(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)で埋める事。)