我有一个C函数,它包含实现字节码解释器字节码的所有代码。
我想知道是否有一种方法可以在固定大小的边界上对齐内存中编译后的代码段,这样我就可以直接从字节码的值计算出要跳转到的地址?与数组的工作方式类似,但我不是从计算出的地址中读取,而是跳转到它。
我意识到,我必须将执行下一跳的代码放在每个“字节码”段的末尾,并且我必须使边界大小至少与最大段的大小相同。
如果这是可能的,我如何告诉编译器/汇编程序(gcc / g++ / as)以这种方式对齐?
发布于 2009-07-30 14:57:19
我知道这不完全是你想要的,但这是用GCC实现字节码解释器的标准方法。
GCC的"computed goto“或"labels as values”功能允许您将标签放入一个数组中,并高效地跳转到不同的字节码指令。参见Fast interpreter using gcc's computed goto。另请看这个相关的堆栈溢出问题:C/C++ goto和GCC documentation on labels as values。
执行此操作的代码将如下所示:
void* jumptable[] = {&&label1, &&label2};
label:
/* Code here... */
label2:
/* Other code here... */然后,您可以使用该表跳转到不同的指令:
goto *jumptable[i];发布于 2009-07-30 23:00:50
这里有两个问题,但答案是相同的。首先,将(二进制)数据写入(二进制)文件。其次,将该(二进制)数据加载到内存中。您可以控制它在磁盘上的位置,也可以控制它在内存中的位置。你可以很容易地计算出你要找的是什么。
就我个人而言,在将数据加载到内存中时,我可能会使用数组,并且我会确保所有数据都从该数组中的有效索引开始。数组的布局是连续的,并且相对容易使用。Kernighan和Ritchie的书The C Programming Language提到了一种使用union进行对齐的技术,但这并没有使指针运算变得更容易。
发布于 2009-08-27 11:35:50
如果您使用的是linux,请使用posix_memalign()。我相信Windows也有类似的功能。
如果你想对齐你自己的代码,看看gcc的__attribute__语法。
ld -Ttext选项也可能会有所帮助。
https://stackoverflow.com/questions/1207082
复制相似问题