在C语言(GNU/Linux)中运行动态生成的汇编代码

7
我正在使用C语言编写一个概念验证JIT编译器,目前它正在生成一些汇编代码字符串。在C语言中,内联汇编功能仅处理在编译时已知的字符串字面量,因此我无法使用它来运行在运行时生成的代码。
我曾经了解过使用mmap()函数在运行时执行生成的机器码的方法,但是如果可能的话,我想避免使用机器码。
有没有人知道其他的解决方案?我考虑将代码写入文件并调用汇编器和链接器,但这会很麻烦而且速度较慢。

1
你的意思是说你生成汇编源代码?为什么不直接生成机器码呢? - Drew McGowen
@DrewMcGowen 我不太想这样做,因为它会降低可读性,难以测试,而且时间很紧迫,所以如果可能的话,我想避免重构。虽然看起来我可能不得不这样做。 - AlexJ136
有许多库可以用于生成汇编代码。gnu-lightning llvm,... - mathk
2个回答

3

我认为想要实现“JIT编译”,就需要注意时间敏感性,也就是生成机器码。您可以尝试添加一些调试代码来同时生成可运行的机器码和用于验证的汇编代码,然后将汇编语言生成的机器码与您直接生成的机器码进行比较,并使用这种方法来调试/验证机器码(如果可能的话,有时汇编器会按照自己的方式执行,而不是您想要的方式)。


生成可运行的机器码和用于调试/测试的汇编代码是一个好主意。我想这就是我要做的。非常感谢。 - AlexJ136

2
我所做的是生成C/C++/Fortran代码,即时编译并链接成DLL,然后动态加载DLL。整个过程最多只需要几秒钟。 你也可以采用同样的方法,只不过生成ASM而已。 这是一种非常有效的技术,当你需要获得代码速度和所生成语言的灵活性(以及运行时库)时,它就非常有用。

我决定选择机器代码选项,但我觉得这是一个非常有趣的想法,我将考虑在未来的项目中使用。你知道有什么相关的文章/教程等吗? - AlexJ136
@AlexJ136:文章?需要学习的关键是:1)如何编写DLL(任何示例都可以),2)如何“shell out”以在程序控制下运行编译器+链接器,以及3)如何加载DLL并获取其导出的过程地址。 - Mike Dunlavey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接