【发布时间】:2016-03-15 17:20:37
【问题描述】:
我的目标是为基于 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 个导出:主条目(如上所示)和代码中随机点的另一个导出。
前几条指令和它的其他情况让我感到困惑:
- 为什么游戏会是 DLL 而不是实际的可执行文件?
- 如何加载给定的 DLL 以供系统执行?
- 如果 DLL 只有上面提到的 2 个导出,它的实际入口点是什么?
- 假设调用主入口点,执行时 LR 的值是多少?
【问题讨论】:
-
“开发 Symbian OS 软件”声称,在 Symbian 9 之前,将应用程序作为 DLL 文件是常见的做法,这些文件将由系统应用程序
apprun.exe加载。 -
如果第二个导出没有通用名称,那么我猜这个名称会被指定为游戏在其他地方的入口点,例如在已安装应用程序的数据库中。 LR 中的值可能是调用主条目的函数的返回地址,如果它是 DLL 的入口点,通常是操作系统本身。我猜入口点的工作方式类似于 Windows 的 DLLMain,因此通常不需要做任何事情。 (尽管 Windows DLL 会返回 TRUE,而不是 0 (FALSE))。
-
迈克尔和罗斯,非常感谢你们!你带领我走上了正确的道路。我已经找到答案并自己发布了一个答案,这回答了我自己的观点。
标签: assembly dll arm symbian s60