如何通过库而不是通过系统调用来调用C编译器?

时间:2014-10-28 14:52:56

标签: gcc assembly

在我被要求修改的项目中,有一段代码等于只生成一组汇编指令,将它们写入文件,然后使用gcc编译器进行编译。

我的问题是,是否有任何方法可以通过公开的API调用链接到可以为我工作的库中?我需要1-1等同于以下命令:

gcc -m32 -c -o objfile generated_asm.asm -masm = intel

2 个答案:

答案 0 :(得分:2)

你无法做到这一点。您可以fork GCC编译命令。它可能是特定于操作系统的,我假设您使用的是Linux(或其他POSIX系统)。

然而,还有其他选择:

  • 使用asmjit在内存中生成x86机器代码
  • 使用tinycc及其libtcc库(可以编译包含C或asm代码的字符串;注意,编译后的机器代码因未经优化而变慢)
  • 使用JIT库,例如libjitLLVMGNU lightning
  • 使用Common Lisp等元编程语言进行编码(例如SBCL)或MetaOcaml

此外,您可以简单地将一些生成的C文件genfoo.c的GCC编译分叉到共享对象(gcc -Wall -O -fPIC genfoo.c -shared -o genfoo.so)中,然后使用dlopen ./genfoo.so文件动态加载(另见this

PS。下一个GCC 5.0版本将有JIT librarylibgccjit)。

答案 1 :(得分:2)

一般来说,不,因为Unix坚持认为我们将所有内容都视为文本字符串(包括命令行)。我们都接受了Unix。

从技术上讲,GCC只是一个具有大参数列表的巨型子程序。

通过文本字符串实现它是一个愚蠢的设计决定我们都是通过转储Multics和/或LISP机器来实现的。在这些系统中,子程序(甚至是大程序)都是本机调用的,因此真正构成。

使用Multics,编译器 (好吧,Multics已经死了)你可以调用的子程序。 (是的,有一个命令行界面也可以进行调用,所以人们可以调用它。)