如何将NASM用作库?

时间:2015-11-02 08:51:57

标签: c++ assembly nasm

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

我检查了libyasm,但无法理解如何使用它来汇编我的代码。

1 个答案:

答案 0 :(得分:2)

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

我通过篡改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函数。换句话说,我将这两个调用(仅针对给定的文件名)重定向到内存文件。然后,我调用了库,文件名参数设置为' fake_file'。

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

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

更好的建议: 截至2016年5月31日;你可以改用Keystone Engine。它基于LLVM,但它可以提供更多功能。"拆卸发动机Capstone,这是一个近乎完美的装配和拆卸耦合。如果您需要这些组件中的任何一个,我建议这些而不是我所描述的黑客攻击。目前正在开发这两种发动机;虽然Keystone有一些小错误,但Capstone目前非常强大。

TL; DR:使用keystone