2009年4月19日星期日

如何使用gcc编译器?

 
如何使用gcc编译器?
 
如何使用gcc编译器?2007-05-18 16:08
GCC rules
你 能想象使用封闭源代码的私有编译器编译自由软件吗?你怎么知道编译器在你的 可执行文件中加入了什么?可能会加入各种后门和木马。Ken Thompson是一个著名 的黑客,他编写了一个编译器,当编译器编译自己时,就在'login'程序中留下后门 和永久的木马。请到 这里 阅读他对 这个杰作的描述。幸运的是,我们有了gcc。当你进行 configure; make; make install 时, gcc在幕后做了很多繁重的工作。如何才能让gcc为我们工作呢?我们将开始编写一个纸牌游戏, 不过我们只是为了演示编译器的功能,所以尽可能地精简了代码。 我们将从头开始一步一步地做,以便理解编译过程,了解为了制作可执行文件需要 做些什么,按什么顺序做。我们将看看如何编译C程序,以及如何使用编译选项 让gcc按照我们的要求工作。步骤(以及所用工具)如下: 预编译 (gcc -E), 编译 (gcc), 汇编 (as),和 连接 (ld)。
开始...
首先,我们应该知道如何调用编译器。实际上,这很简单。我们将从那个著名的第一个C程序开始。 (各位老前辈,请原谅我)。

[pre]#include <stdio.h>

int main()


{
printf("Hello World!n");
}
[/pre]把这个文件保存为 game.c。 你可以在命令行下编译它:
[pre]gcc game.c
[/pre]在默认情况下,C编译器将生成一个名为 a.out 的可执行文件。 你可以键入如下命令运行它: [pre]./a.out

Hello World

[/pre]每一次编译程序时,新的 a.out 将覆盖原来的程序。你无法知道是哪个 程序创建了 a.out。我们可以通过使用 -o 编译选项,告诉 gcc我们想把可执行文件叫什么名字。我们将把这个程序叫做 game,我们 可以使用任何名字,因为C没有Java那样的命名限制。 [pre]gcc -o game game.c
game

Hello World

[/pre] 到现在为止,我们离一个有用的程序还差得很远。如果你觉得沮丧,你可以想一想我们 已经编译并运行了一个程序。因为我们将一点一点为这个程序添加功能,所以我们必须 保证让它能够运行。似乎每个刚开始学编程的程序员都想一下子编一个1000行的程序, 然后一次修改所有的错误。没有人,我是说没有人,能做到这个。你应该先编一个可以 运行的小程序,修改它,然后再次让它运行。这可以限制你一次修改的错误数量。另外, 你知道刚才做了哪些修改使程序无法运行,因此你知道应该把注意力放在哪里。这可以 防止这样的情况出现:你认为你编写的东西应该能够工作,它也能通过编译,但它就是 不能运行。请切记,能够通过编译的程序并不意味着它是正确的。
下一步为我们的游戏编写一个头文件。头文件把数据类型和函数声明集中到了一处。 这可以保证数据结构定义的一致性,以便程序的每一部分都能以同样的方式看待一切事情。
[pre]#ifndef DECK_H
#define DECK_H

#define DECKSIZE 52

typedef struct deck_t
{
int card[DECKSIZE];
/* number of cards used */
int dealt;
}deck_t;

没有评论: