首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将固定大小内存边界上的本机代码与GCC/G++/AS对齐?

将固定大小内存边界上的本机代码与GCC/G++/AS对齐?
EN

Stack Overflow用户
提问于 2009-07-30 14:45:24
回答 3查看 1.3K关注 0票数 4

我有一个C函数,它包含实现字节码解释器字节码的所有代码。

我想知道是否有一种方法可以在固定大小的边界上对齐内存中编译后的代码段,这样我就可以直接从字节码的值计算出要跳转到的地址?与数组的工作方式类似,但我不是从计算出的地址中读取,而是跳转到它。

我意识到,我必须将执行下一跳的代码放在每个“字节码”段的末尾,并且我必须使边界大小至少与最大段的大小相同。

如果这是可能的,我如何告诉编译器/汇编程序(gcc / g++ / as)以这种方式对齐?

EN

回答 3

Stack Overflow用户

发布于 2009-07-30 14:57:19

我知道这不完全是你想要的,但这是用GCC实现字节码解释器的标准方法。

GCC的"computed goto“或"labels as values”功能允许您将标签放入一个数组中,并高效地跳转到不同的字节码指令。参见Fast interpreter using gcc's computed goto。另请看这个相关的堆栈溢出问题:C/C++ gotoGCC documentation on labels as values

执行此操作的代码将如下所示:

代码语言:javascript
复制
void* jumptable[] = {&&label1, &&label2};

label:
  /* Code here... */

label2:
  /* Other code here... */

然后,您可以使用该表跳转到不同的指令:

代码语言:javascript
复制
goto *jumptable[i];
票数 7
EN

Stack Overflow用户

发布于 2009-07-30 23:00:50

这里有两个问题,但答案是相同的。首先,将(二进制)数据写入(二进制)文件。其次,将该(二进制)数据加载到内存中。您可以控制它在磁盘上的位置,也可以控制它在内存中的位置。你可以很容易地计算出你要找的是什么。

就我个人而言,在将数据加载到内存中时,我可能会使用数组,并且我会确保所有数据都从该数组中的有效索引开始。数组的布局是连续的,并且相对容易使用。Kernighan和Ritchie的书The C Programming Language提到了一种使用union进行对齐的技术,但这并没有使指针运算变得更容易。

票数 0
EN

Stack Overflow用户

发布于 2009-08-27 11:35:50

如果您使用的是linux,请使用posix_memalign()。我相信Windows也有类似的功能。

如果你想对齐你自己的代码,看看gcc的__attribute__语法。

ld -Ttext选项也可能会有所帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1207082

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档