在没有入口点的情况下执行 Symbian DLL

Execution of Symbian DLLs with no entry point

我的目标是为名为 N-Gage 的基于前 Symbian OS 9 的移动游戏设备创建一个模拟器。不幸的是,设备(Symbian 的)可执行文件的执行似乎比我想象的要复杂。

首先,一些背景信息。该设备基于 ARM920T 处理器,该处理器基于 ARMv4T 架构。为系统制作的游戏以 DLL 形式提供,采用标准的 pre-Symbian 9 .app 格式。 N-Gage 的 SDK 基于 Symbian S60 SDK 第一版。

虽然有些游戏之前会执行其他一些杂七杂八的指令,但我想先看看每个可执行文件的前3条"standard"指令,这些指令似乎一直都在生成:

7C: B 0x1234 // The location of the branch can be anywhere
...
1234: MOV R0, #0
1238: BX LR

所有 DLL 也有 2 个导出:主条目(如上所示)和代码中随机点的另一个导出。

前几条说明和它的其他情况让我感到困惑:

  1. 为什么游戏是 DLL 而不是实际的可执行文件?
  2. 系统如何加载给定的 DLL 以供执行?
  3. 如果 DLL 只有上面提到的 2 个导出,那么 DLL 的实际入口点是什么?
  4. 如果调用主入口点,执行时 LR 的值是多少?

正如 Michael 所提到的,该应用程序被编译为 DLL,然后由 apprun.exe 执行。这条线索让我走上了正确的道路。

现在要回答我自己的观点:

Why would the game be a DLL instead of an actual executable?

似乎这只是 Symbian 的一个怪癖 OS。

How would the given DLL be loaded for execution by the system?

首先将调用 E32Dll() 初始化程序(主要 "entry point"),然后调用 NewApplication() 函数,这应该是第一个导出函数。

大多数应用程序简单地从 E32Dll() 返回 return false (0) 来指示成功,但一些应用程序在 returning 之前进行其他处理。

What would be the actual entry point of the DLL, if it has only the 2 exports mentioned above?

NewApplication() 是 "real" 入口点,尽管一些应用程序在 E32Dll() 中进行更多处理。

What would be the value of LR upon execution, assuming that the main entry point is called?

从apprun.exe调用E32Dll()的地方。