c - QEMU 是否对从 DATA 部分执行命令有限制?

标签 c arm embedded qemu data-segment

我正在使用 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/

相关文章:

c++ - 为什么我会收到命名空间标识符错误?

c - 使用#include“unit.c”使包含的任何子单元均可访问数组吗?

embedded - 对嵌入式系统编程最合适(最佳)语言的建议?

linux - arm和x86之间的迁移过程

c - ARMv8a 中的这种简单分页是如何工作的

macos - 运行 arm-elf-gcc 编译代码时出现段错误

c - 在进行函数调用之前强制函数恢复所有寄存器

c - "(gdb) run"在 qemu 模拟 arm 架构上运行可执行文件时崩溃

c++ - 关于 C/C++ 中使用的头文件保护和头文件包含的说明

c - 如何遍历char指针来计算特定字符存在的类型数