【发布时间】:2015-10-19 14:06:34
【问题描述】:
要求:对于某个项目,我们有独特的要求。该应用程序支持一种表达式语言,允许用户定义他们自己的复杂表达式,这些表达式可以在运行时进行评估(每秒数百次),并且它们需要在机器级别执行以提高性能。
WORKING:我们的表达式解析器完美地将脚本翻译成相应的汇编语言程序。我们通过静态链接我们的 C 测试程序生成的目标文件来检查它,它们产生了正确的结果。 由于客户端可以随时更改脚本,我们的程序(在运行时)检测到更改,调用生成相应汇编例程的解析器。然后我们从后端调用汇编器来创建目标代码。
问题
我们如何从 C++ 程序中动态调用这个汇编例程 (加载器)?
我们不应该调用 C++ 编译器来将它与加载程序链接,因为加载程序已经运行了其他子例程,我们不能关闭加载程序,重新编译然后执行新的加载程序程序。
我尝试在线搜索解决方案,但每次结果都充斥着 .NET 程序集动态调用。我们的应用与 .NET 无关。
【问题讨论】:
-
所以基本上,您想获取一些输入,生成程序集(您已经完成并且正在工作),然后从生成它的应用程序中开始执行程序集?对吗?
-
我从来没有想过要尝试这样做......所以可能有更好的方法,但我想你可以将程序集写入一个简单的 DLL 文件并在运行期间加载 DLL -time,找到包含你刚才写的程序集的函数对应的正确函数地址,然后开始调用吧……
-
对...就像我说的那样,这不是最优雅的方式,但是您可以在带有任何参数/返回的函数内部编写一个包含您创建的可执行程序集的 DLL你需要,然后让程序 C 在运行时加载它(通过 LoadLibrary()),这将在 Windows 上完成。我相信你可以在 linux 上对共享对象做类似的事情,但我不是 linux 人,所以我不知道。
-
Linux 可以使用
dlopen函数加载共享库,您可以使用dlsym查找符号。如果您的汇编代码是独立的,您可以要求汇编程序生成一个普通的二进制文件,然后您可以简单地将其加载到内存中并执行(注意设置权限)。对于 windows 和 linux,这应该是最小的不同。 -
你应该看看GModule。
标签: c++ assembly dynamic linker