TOPOC 开发包使用FAQ,编译问题先看这里



掌叔
2008-06-17 16:17:15

摘自:topoc.5d6d.com

topoc开发包是为了方便psp开发而制作的开发包.目前是有1个安装程序和一个更新包,其中安装程序是针对1.50版程序的,更新包是针对1.50和3xx程序的.
附:
1xx软件针对于1.50核心,对应有1.50原版主机,3.xxOE系列,以及刷了1.50核心的3.71m系统.
3xx对应于3.xx核心,对应于3.71m系统,特别是psp2000主机(psp slim).

一 安装要点:
1.如果需要制作3xx版程序请下载更新包.下载后会有个pspdev.rar解压后覆盖原来的pspdev目录即可.
记得保留原来的psp-gcc.exe和psp-g++.exe别覆盖了.测试新的psp-gcc.exe和psp-g++.exe有问题
安装包下载地址:
[url]http://code.google.com/p/topoc/downloads/list[/url]
更新包下载地址:
[url]http://file.mofile.com/[/url]
用户名pspdev 密码 12345678
或者ftp:
[url]ftp://61.180.11.167:5050/[/url]
psp开发下的pspdev.rar
2.如果制作1.5版程序则不用更新.不过建议更新下,例如使用jge++1.0就需要更新到最新的开发包.
附:jge++1.0下载地址:[url]http://jge.khors.com/[/url]

二使用过程:
1 编译时从开始菜单->所有程序->psp开发->启动psp开发环境进入,有会一个命令行窗口:
[attach]209[/attach]
2 进入需要编译的目录,这里用jge++1.0为例,下载jge++1.0(下一版已征得作者同意会包含在开发包中)
然后解压缩后有一个JGE_1_0目录,然后在上面的那个命令行窗口键入cd JGE_1_0JGETutorials1.HelloWorld 然后依次
make clean
make 1xx或者make 3xx(编译3xx软件请看安装要点1)
[attach]210[/attach]
3 将生成的文件放入psp运行.

FAQ:
1 问:我严格按照上面步骤来了还是报错?
 答:可能是装的开发环境太多,你需要改下start.bat 把%PATH%放到最后,这样优先psp的开发环境,例如我的start.bat 的内容是:
set PATH=%PATH%;G:pspdevmsysin;G:pspdevpspdevin;cmd
改为:
 set PATH=G:pspdevmsysin;G:pspdevpspdevin;%PATH%;cmd
2 问:下载了jge++1.0无法编译通过?
 答:请安装更新包.
3.xx固件要求你的自制软件以prx格式运行。要得到这种格式,需要如下基本步骤:

1. 修改你的Makefile - 你需要添加如下语句至Makefile以编译prx(在 include $(PSPSDK)/lib/build.mak 这一行前):
引用:
BUILD_PRX = 1
PSP_FW_VERSION = 371
2. 设置你的软件为用户模式 - 自制软件需以用户模式启动。要达此目的,将PSP_MODULE_INFO 中的第2个参数改为 0。大多数软件还需要增加堆栈(heap)大小。堆栈大小是指malloc可用的内存量。我自己设为20mb。以下代码应置于你自己的源代码之前(通常是 main.c):
引用:
PSP_MODULE_INFO("My Homebrew", 0, 1, 0);
PSP_HEAP_SIZE_KB(20480);
或者你可以用PSP_HEAP_SIZE_MAX();前提是你用的toolchain是在2007年9月30日以后编译的(修订号2321)。它将尽可能分配最大的堆栈。请注意要使用此方法你需要重新编译整个toolchain(或者至少pspsdk和newlib),否则你的软件会因 Exception - Bus错误(数据)崩溃。

3. 尝试运行你的程序 - 你现在应该能够以通常方式编译程序并覆盖原有的eboot.pbp。3.xx固件不适用kxploit或者%文件夹。如果你从psplink运行你的程序,你需要运行prx文件而不是elf文件,否则无法运行。到了这一步你的自制软件应能正常运行,除非你的代码有核心模式的调用。如果代码有核心调用,启动程序会导致0x8002013C错误。别慌,看第4步。如果你的程序运行没问题,那好,跳过第4步。

4. 找到并处理的你的核心调用 - 你需要了解什么是核心调用,什么不是。你可用 prxtool -f 来验证。以下是一个例证输出:
引用:
$ prxtool -f project.prx
... output left out (it's a lot of output) ...
Import 9, Name UtilsForUser, Functions 1, Variables 0, flags 40010000
Functions:
0x79D1C3FA [0x0008CF34] - UtilsForUser_79D1C3FA
Import 10, Name LoadExecForUser, Functions 2, Variables 0, flags 40010000
Functions:
0x05572A5F [0x0008CF3C] - LoadExecForUser_05572A5F
0x4AC57943 [0x0008CF44] - LoadExecForUser_4AC57943
Import 11, Name IoFileMgrForKernel, Functions 1, Variables 0, flags 00010000
Functions:
0x411106BA [0x0008CF4C] - IoFileMgrForKernel_411106BA
Done
查看上述输出你会发现有一个导入称为 IoFileMgrForKernel。该导入有一个函数。参考下页:

[url]http://silverspring.lan.st/1.5x/kd/iofilemgr.html.[/url]

在该页搜索你会发现0x411106BA匹配函数sceIoGetThreadCwd。你现在可以搜索该函数并有两个选项:
(a) 使用用户模式代码替换核心调用,或者
(b) 将核心调用移入一个核心模式的prx并在程序中载入该核心模式prx。
选项B不在本教程讨论范围内,你可以搜索论坛找到相关方法。选项A是我推荐的方案,除非你必须使用核心调用。


love_xiaolu
2009-11-02 07:12:18

前来支援掌家叔