2014-10-28 67 views
1

在我被要求修改一個項目,有一個代碼段那無異於只產生一組彙編指令,將它們寫入一個文件,然後用gcc編譯器編譯它。如何通過庫調用C編譯器而不是通過系統調用?

我的問題是,是否有任何方式,將通過公開的API調用做這個工作對我來說是圖書館鏈接?我需要1-1等值以下命令:

的gcc -m32 -c -o OBJFILE generated_asm.asm -masm =英特爾

+0

[c庫x86/x64彙編器]的可能的重複(http://stackoverflow.com/questions/17001094/c-library-x86-x64-assembler) – unwind 2014-10-28 14:57:08

+2

簡潔,沒有。編譯器不是可從程序調用的API;它本身就是一個(相當大的)程序。使用'system()'是完成這項工作的理想方式。 – 2014-10-28 14:57:12

+0

我實際上並沒有加載和運行編譯後的代碼,這是針對二進制級別的分析。 – 2014-10-28 15:09:50

回答

2

你不能這樣做。您可能會使用GCC編譯命令fork。這可能是特定於操作系統的,我假設你在Linux上(或其他POSIX系統)。

然而,也可以選擇:

  • 使用asmjit以產生在使用tinycc及其libtcc庫(存儲器
  • x86機器代碼可以編譯包含C或彙編代碼的字符串;提防,編譯機器代碼是使用JIT庫像libjit,或LLVM,或GNU lightning
  • 在metaprogrammi編碼
  • 由於未優化慢)像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)。

2

一般來說,沒有,因爲Unix的堅持讓我們覺得一切都以文本字符串(包括命令行)。我們都接受了Unix。

技術上GCC只是巨人子程序有一個很大的參數列表。

,你得到它雖然是文本字符串是一個愚蠢的設計決策,我們都傾倒了Multics和/或LISP機器製造的事實。在這些系統上,子程序(甚至是大型程序)都是本地調用的,因此真正構成。

對於Multics,編譯器(很好,Multics已經死了)您可以調用一個子例程。 (是的,有一個命令行界面也可以打這個電話,所以人們可以調用它)。

+0

我不同意「GCC只是一個大參數列表巨大的子程序」的短語。在GCC和調用過程之間沒有公共數據(或者是封閉值)(因爲它們是獨立的地址空間,具有獨立的進程) – 2014-12-02 12:07:45

+1

只是去顯示Unix命令傳遞過程的一個笨拙的參數。 – 2014-12-02 16:53:39

相關問題