我的目标是为基于Symbian OS 9的移动游戏设备N-Gage创建一个模拟器。遗憾的是,设备(Symbian)可执行文件的执行似乎比我想象的要复杂得多。
首先,一些背景资料。该器件基于ARM920T处理器,该处理器基于ARMv4T架构。为系统制作的游戏以DLL形式提供,它们采用标准的Symbian 9 .app格式。 N-Gage的SDK基于Symbian S60 SDK第1版。
虽然有些游戏之前执行过其他一些杂项指令,但我首先想看看每个可执行文件的前3个“标准”指令,这些指令似乎一直都是生成的:
7C: B 0x1234 // The location of the branch can be anywhere
...
1234: MOV R0, #0
1238: BX LR
所有DLL也有2个导出:主条目(如上所示)和另一个导出代码中的随机点。
前几条指令及其他情况让我感到困惑:
答案 0 :(得分:0)
正如Michael所说,应用程序被编译为DLL,然后由apprun.exe执行。这条线索让我走上了正确的道路。
现在回答我自己的观点:
为什么游戏是DLL而不是实际的可执行文件?
似乎它只是Symbian操作系统的一种奇怪。
如何加载给定的DLL以供系统执行?
首先调用E32Dll()初始值设定项(主"入口点"),然后调用NewApplication()函数,它应该是第一个导出的函数。
大多数应用程序只是从E32Dll()返回false(0)表示成功,但某些应用程序在返回之前会执行其他处理。
DLL的实际入口点是什么,如果它只有上面提到的2个出口?
NewApplication()是真实的"入口点,虽然有些应用程序在E32Dll()中进行了更多处理。
假设主入口点被调用,执行时LR的值是多少?
从apprun.exe调用E32Dll()的地方。