最近在写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 输出的错误信息。