我们可以用C语言在动态分配的内存中存储指令吗?

我们可以用C语言在动态分配的内存中存储指令吗?,c,heap-memory,C,Heap Memory,众所周知,我们可以在动态分配的内存中存储数据 但是,我想知道我们是否可以在堆上存储新指令或新函数?有真正的应用程序吗 为面试做准备,如果这不是一个明智的问题,请容忍我 一般来说,答案是否定的;因为代码指令必须在编译时知道 动态链接库可以更接近,更自由。当程序加载到内存中时,它主要被组织到内存的三个区域,称为段: 文本段 堆栈段 堆段 文本段(也称为代码段)是程序本身的编译代码所在的位置。因为“新指令”或“新函数”在编译时是已知的,所以我们不能将它们存储到堆中 希望这有助于回答您的问题。当然可

众所周知,我们可以在动态分配的内存中存储
数据

但是,我想知道我们是否可以在堆上存储
新指令
新函数
?有真正的应用程序吗


为面试做准备,如果这不是一个明智的问题,请容忍我

一般来说,答案是否定的;因为代码指令必须在编译时知道


动态链接库可以更接近,更自由。

当程序加载到内存中时,它主要被组织到内存的三个区域,称为段:

  • 文本段
  • 堆栈段
  • 堆段
文本段(也称为代码段)是程序本身的编译代码所在的位置。因为“新指令”或“新函数”在编译时是已知的,所以我们不能将它们存储到堆中


希望这有助于回答您的问题。

当然可以。你认为a是什么?有些工作原理类似(在堆栈而不是堆上执行代码)。这是现代操作系统具有防止执行“数据”页面的保护的原因之一。(合法的动态代码生成器必须禁用这种保护。)另请参阅Wikipedia上的文章。

问题是关于C语言的,因此答案应该是-仅在该语言中没有定义类似于在堆上存储函数的任何内容


然而,如果我们增加了关于实现细节和操作系统(重定位表、页面保护等)的知识,那么是的,这是可能的。例如,自定义动态代码加载程序(不使用操作系统提供的DLL/SO加载)就是这样工作的。

您当然可以将任何内容存储为数据,包括指令,但您是否能够实际执行这些指令以及如何执行在很大程度上取决于编译器和平台。您必须深入了解两者的底层细节,才能在不破坏或挂起程序或环境(例如,缺乏应用程序保护的原始操作系统)的情况下正确完成这项工作

是一个将x86 BSWAP指令作为数据存储在数组中(不是动态分配的,但这通常不重要)并执行它的示例。该示例实际上不是将单个BSWAP指令存储为数据,而是一个完整的C-callable例程,该例程遵循编译器规定的调用约定,该约定控制参数如何传递到指令中以及返回值如何从指令中返回


该示例是一个32位Windows应用程序,由于它要在Windows上运行,因此它还必须确保包含指令的区域标记为可读和可执行(前者是因为指令位于可以读写的数组中,后者是通过调用VirtualProtect()来确保的)函数告诉操作系统将该区域标记为可执行文件,这是必要的,因为操作系统试图保护我们免受恶意代码(例如来自互联网的不可信数据)的意外执行。

+1在“不,不好,远离”的海洋中,唯一的答案是“好的,是的,事实上。”同意。JVM提供了在运行时在堆栈中加载.class并动态调用其函数的机制。但是Aditya要求用C语言在堆中添加函数,非常感谢大家!谢谢你的帮助。