百度网站权重,织梦网站打开速度慢,领域网站建设,网站开发公司网站gcc 编译过程从 hello.c 到 hello(或 a.out)文件#xff0c; 必须历经 hello.i、 hello.s、 hello.o#xff0c;最后才得到 hello(或a.out)文件#xff0c;分别对应着预处理、编译、汇编和链接 4 个步骤#xff0c;整个过程如图 10.5 所示。 这 4 步大致的工作内容如下 必须历经 hello.i、 hello.s、 hello.o最后才得到 hello(或a.out)文件分别对应着预处理、编译、汇编和链接 4 个步骤整个过程如图 10.5 所示。 这 4 步大致的工作内容如下1 预处理 C 编译器对各种预处理命令进行处理包括头文件包含、宏定义的扩展、条件编译的选择等2 编译将预处理得到的源代码文件进行“翻译转换”产生出机器语言的目标程序得到机器语言的汇编文件3 汇编将汇编代码翻译成了机器码但是还不可以运行4 链接处理可重定位文件把各种符号引用和符号定义转换成为可执行文件中的合适信息通常是虚拟地址。 下面根据 hello.c 这个示例跟踪一下其中的细节。1预处理在 gcc 命令加上-E 参数可以得到预处理文件。输入下列命令vmuserLinux-host:hello$ gcc -E hello.c –o hello.i将会产生 hello.i 文件这就是 hello.c 经过预处理后的文件。实际操作结果见图 10.6。 图 10.6 预编译得到 hello.i 文件一个原本连同空行才 8 行的代码经过预处理得到了一个 800 多行的预处理文件文件开的内容如图 10.7 所示。 图 10.7 hello.i 文件开头hello.i 文件末尾处的内容如图 10.8 所示。 图 10.8 hello.i 文件末尾其余部分内容请用 Vi 打开后进行查看。可以看到 hello.c 经过预处理后得到的 hello.i文件除了原本的几行代码之外还包含了很多额外的变量、函数等等这些都是预处理器处理的结果。2编译在 gcc 编译参数加上-S可以将 hello.i 编译成 hello.s 文件。命令如下vmuserLinux-host:hello$ gcc -S hello.i 实际操作和结果如图 10.9 所示。 图 10.9 编译得到 hello.s 文件hello.s 是一个汇编文件可用 Vi 编辑器打开查看如图 10.10 所示。 图 10.10 hello.s 文件内容可以看到该文件内容都是汇编语句。这里不对汇编进行解释。3汇编得到了汇编文件后通过 gcc 就可以得到机器码了。在终端输入下列命令可以得到hello.o 文件。vmuserLinux-host:hello$ gcc -c hello.s实际操作和结果如图 10.11 所示。 图 10.11 汇编得到 hello.o 文件4链接尽管已经得到了机器码但这个文件却还是不可以运行的必须要经过链接才能运行。在终端输入下列命令将会得到可执行文件 a.out。vmuserLinux-host:hello$ gcc hello.o操作和结果如图 10.12 所示。 图 10.12 链接得到 a.out 文件a.out 是 gcc 默认输出文件名称可以通过-o 参数指定新的文件名。例如加上“-o hello”参数将会生成 hello 文件这个文件和 a.out 实际上是一样的用 md5sum 命令计算文件校验值两者完全一样如图 10.13 所示。 图 10.13 a.out 和 hello 文件链接可分为动态链接和静态链接 动态链接使用动态链接库进行链接生成的程序在执行的时候需要加载所需的动态库才能运行。动态链接生成的程序小巧但是必须依赖动态库否则无法执行。 Linux 下的动态链接库实际是共享目标文件shared object一般是.so 文件作用类似于 Windows 下的.dll 文件。 静态链接使用静态库进行链接生成的程序包含程序运行所需要的全部库可以直接运行不过体积较大。 Linux 下静态库是汇编产生的.o 文件的集合一般以.a 文件形式出现。gcc 默认是动态链接加上-static 参数则采用静态链接。再来看 hello.c 示例在链接的时候加上-static 参数vmuserLinux-host:hello$ gcc hello.o -static -o hello_static操作命令和结果如图 10.14 所示可以看到动态链接生成的文件大小是 7155 字节而静态链接生成的文件却有 616096 字节体积明显大了很多。 图 10.14 静态链接和动态链接结果对比转载于:https://www.cnblogs.com/wjchao/p/7460375.html