2011-12-15 67 views
21

如果你有一个简单的C程序,像手动运行gcc的步骤,编译,汇编,连接

int main(void) {return 0;} 

它可与gcc -o test test.c进行编译。

据我所知,gcc执行编译,组装和链接。后两个步骤通过运行asld来实现。

我可以使用gcc -S test.c生成汇编代码。

你会在终端中输入什么内容,将汇编代码转换为可执行文件?

(这样做的原因是为了学习汇编)

+2

实际上,它先执行预处理,然后编译,然后组装,然后链接。预处理可能是该过程的一个重要部分,尤其是在您使用Boost时... – 2011-12-15 22:57:08

+2

您可以使用`-v`参数来查看GCC如何调用其子程序,例如, `gcc -o test test.c -v` – mizo 2011-12-15 23:22:48

回答

39

这些是使用gcc

gcc -E --> Preprocessor, but don't compile 
gcc -S --> Compile but don't assemble 
gcc -c --> assemble but don't link 
gcc with no switch will link your object files and generate the executable 
1

你做gcc -S -o test.s test.c,类型gcc -o test test.s后。

3

gcc test.s -o test会为您编译test.stest

NASM也可能值得你花时间 - 编译程序集时,它可能比gcc更容易/更友好。

+0

不是。 `gcc`为你处理了很多依赖系统的官僚作风,完全兼容你处理其他项目的方式。 – vonbrand 2013-01-20 21:16:25

0

您可以让gcc启动并停止编辑进程。 gcc test.s -o test将它从汇编编译test.s到一个可执行文件。

0

,因为你可能或可能不知道的不同阶段,编译的四个阶段是进行预处理(-E),编译到组件(-S),组装到对象代码(-c),最后链接。对我来说最困难的是如何使用预处理器输出。下面是如何做到这一点:

gcc -E hello.c | gcc -S -xc -o hello.s - 
gcc -c hello.s -o hello.o 
gcc hello.o -o hello