【问题标题】:Execution of Symbian DLLs with no entry point没有入口点的 Symbian DLL 执行
【发布时间】: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 个导出:主条目(如上所示)和代码中随机点的另一个导出。

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

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

【问题讨论】:

  • “开发 Symbian OS 软件”声称,在 Symbian 9 之前,将应用程序作为 DLL 文件是常见的做法,这些文件将由系统应用程序 apprun.exe 加载。
  • 如果第二个导出没有通用名称,那么我猜这个名称会被指定为游戏在其他地方的入口点,例如在已安装应用程序的数据库中。 LR 中的值可能是调用主条目的函数的返回地址,如果它是 DLL 的入口点,通常是操作系统本身。我猜入口点的工作方式类似于 Windows 的 DLLMain,因此通常不需要做任何事情。 (尽管 Windows DLL 会返回 TRUE,而不是 0 (FALSE))。
  • 迈克尔和罗斯,非常感谢你们!你带领我走上了正确的道路。我已经找到答案并自己发布了一个答案,这回答了我自己的观点。

标签: assembly dll arm symbian s60


【解决方案1】:

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

现在回答我自己的观点:

为什么游戏是 DLL 而不是实际的可执行文件?

似乎这只是 Symbian OS 的一个怪异之处。

如何加载给定的 DLL 以供系统执行?

首先调用 E32Dll() 初始化程序(主要的“入口点”),然后调用 NewApplication() 函数,这应该是第一个导出的函数。

大多数应用程序只是简单地从 E32Dll() 返回 false (0) 以指示成功,但有些应用程序在返回之前会执行其他处理。

如果 DLL 只有上面提到的 2 个导出,那么它的实际入口点是什么?

NewApplication() 是“真正的”入口点,尽管一些应用程序在 E32Dll() 中执行更多处理。

假设调用主入口点,执行时 LR 的值是多少?

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-02
    • 2011-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-18
    • 1970-01-01
    相关资源
    最近更新 更多