最近在寫Pascal編譯器,生成 nasm 匯編代碼,需要調用 nasm 進行匯編,再調用 gcc 與 C 語言標準庫鏈接,從而可以使用 C 語言的庫函數。
1
2 String[] cmdAsm = new String[]{
3 "nasm",
4 fileName + ".asm",
5 "-f",
6 "elf32",
7 "-o",
8 fileName + ".o"
9 };
10 Process child = Runtime.getRuntime().exec( cmdAsm );
11 LineNumberReader errReader = new LineNumberReader(
12 new InputStreamReader(
13 child.getErrorStream()));
14 String errInfo;
15 while ( null != (errInfo = errReader.readLine())) {
16 System.err.println( errInfo );
17 }
18 child.waitFor();
19
20 String[] cmdLd = new String[]{
21 "gcc",
22 fileName + ".o",
23 "-o",
24 fileName
25 };
26 child = Runtime.getRuntime().exec( cmdLd );
27 errReader = new LineNumberReader(
28 new InputStreamReader(
29 child.getErrorStream()));
30 while ( null != (errInfo = errReader.readLine())) {
31 System.err.println( errInfo );
32 }
33 child.waitFor();
34
注意 "-o" 和 fileName 要分開為兩個字符串,不然的話,nasm 沒問題,但 gcc 會出錯,鏈接器找不到輸出文件。
errReader 和 errInfo 用于輸出 nasm 和 gcc 輸出的錯誤信息。