This question already has answers here:
Convert assembly to machine code in C++

(3个答案)


4年前关闭。




我想将NASM本身(汇编程序)包含在C++项目中。我可以将NASM编译为共享库吗?如果不是,是否还有另一个可以用作C或C++库的汇编程序?

我检查了libyasm,但不明白如何使用它来汇编代码。

最佳答案

哇,当我不在时,这个爆炸了。

我已经通过篡改YASM源代码解决了这个问题,并且完全忘记了SO中的问题,因为8个月前它根本没有受到关注。以下是详细信息,然后是更好的建议

对于我想到的项目,我需要使用YASM作为库,因此我很着急,因为我正在为一家公司这样做。那时,我没有意识到好的图书馆。而且我得出的结论是,习惯LLVM框架对于该任务来说是一个过大的选择(因为我想要的只是组装单数的x86-x86_64指令并接收字节)。

因此,我下载了YASM的源代码。

经过一段时间的代码干预,我注意到可执行文件接收到输入和输出文件的文件路径。并传递这两个字符串。我希望在内存中使用char数组作为输入和输出。不是文件。所以我想,也许如果我能找到传递的所有FILE指针,就可以将它们转换为char指针,并将每个文件的读/写更改为数组操作。

事实证明,这比听起来要麻烦得多。显然,YASM不会一次打开输入/输出文件,而是使用相同的FILE指针。相反,它传递文件路径字符串的拷贝。我需要一个可以为我做所有必要更改的脚本,这对我不利。

最终,我用脚本找到了程序中所有的fopen/fclose调用,并用my_fopen/my_fclose替换了它们。对于我进行这些替换的每个文件,我都包含了我的头文件,在其中实现了这两个功能。

在这两个函数中,我检查了传入的字符串,并将其与“fake_file”进行比较。如果它们相等,则传递一个“假” FILE指针,该指针指向内存的两个部分,该指针从函数fmemopen和open_memstream获得。否则,我只是简单地调用了实际的fopen/fclose函数。换句话说,我将这两个调用(仅针对给定的文件名)重定向到了一个内存文件。然后,我将filename参数设置为'fake_file'的库调用了。

由于那时我只限于Linux,所以这种方法对我有用。我还发现(使用Valgrind)库版本中存在内存泄漏,因此我为此编写了一个非常原始的垃圾收集器。基本上,我包装了malloc的等等,以跟踪所有未释放的分配,并在每次执行后清理它们。

这种方法还允许我使用脚本自动执行这些更改。不幸的是,我在一家公司中做了所有这些工作,所以我不会泄漏任何实际的代码。

更好的建议:
截至2016年5月31日;您可以改用Keystone Engine。它“基于LLVM,但是它提供了更多的功能,而且功能更进一步”。拆卸引擎Capstone和这对 assembly 和拆卸来说是近乎完美的一对。如果您需要这些组件中的任何一个,我建议您使用这些组件,而不要进行我描述的技巧。目前正在开发这两种发动机。尽管Keystone有一些小错误,但Capstone目前非常强大。

TL; DR:使用keystone

关于c++ - 如何将NASM用作图书馆?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33473811/

10-11 09:27