我正在使用 QEMU 来模拟 ARM11 CPU。
我的程序太复杂了,无法在这里解释,所以我会把这个问题投影到一个更简单的程序中。 所以我的程序包含 2 个 c 文件:
- 主程序
- some_code.c
我正在编译 some_code.c(到 some_code.o),然后我将它转换为一个十六进制数组变量,它表示 some_code.c 的代码。
现在我正在链接两个目标文件(main.o 和 some_code.o)。 该变量(HEX数组变量)位于DATA段。
现在我从 main.c 中的代码调用 HEX 数组变量(我的意图是此时 some_code.c 的代码将开始执行)。 当程序计数器 (PC) 到达 HEX 数组变量时,它得到一个异常(我没有关于异常的更多细节)。
如果我将此 HEX 数组变量从 DATA 部分复制到 CODE 部分,现在当 PC 到达此行时,它可以毫无异常(exception)地成功执行它。
所以我的问题是:
- QEMU 是否对从 DATA 部分执行命令有限制?
- 如果是这样,我该如何解除这个限制?
提前致谢
暗利
最佳答案
它将是链接器和操作系统的组合。链接器很可能将数据部分标记为“数据”,然后加载程序将创建一个没有执行权限的内存区域来包含数据。这是 QEMU 正在模拟的硬件的一个特性,而不是 QEMU 本身,即如果你在真实机器上运行它,你会看到同样的问题。
可以将数据部分更改为可执行文件,但详细信息将取决于您运行的操作系统以及您使用的编译器工具链。任何具有 JIT 编译器的解释器都必须做类似的事情。
请注意,一般来说,让数据部分可执行被认为是不好的做法,因为这会导致各种安全漏洞。
关于c - QEMU 是否对从 DATA 部分执行命令有限制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32500734/