入门底层
汤奕铄 2019-01-31 02:38:47 学习gcc的基本概念与简单用法。
1、GCC与gcc
GCC (GNU Compiler Collection)
GNU 编译器集合,包含众多语言的编译器,包括C,C++,Java等等
GCC多用于嵌入式操作系统的编译,如Linux,VxWorks,Android等等
gcc 单指GCC中的C语言编译器
gcc 多用于内核开发以及少数应用程序开发
2、gcc的幕后工作
想了解更多更详细的关于编译链接深层次内容,请阅读书籍《CSAPP》第7章与《程序员的自我修养》,因为这里我的学习记录只记录结果与常用的几个编译方法。
我们先来看一个简单的程序:
test.c源程序:
#include <stdio.h>
#include "func.h"
int g_global = 0;
int g_test = 1;
int main(int argc, char *argv[])
{
func();
printf("&g_global = %p\n", &g_global);
printf("&g_test = %p\n", &g_test);
printf("&func = %p\n", &func);
printf("&main = %p\n", &main);
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
func.h头文件:
#include <stdio.h>
void func()
{
#ifdef TEST
printf("TEST = %s\n", TEST);
#endif
return;
}
1
2
3
4
5
6
7
8
9
10
在Linux下使用gcc进行编译:
gcc test.c -o test
1
然后运行:
./test
1
结果如下:
&g_global = 0x804a020
&g_test = 0x804a014
&func = 0x80483c4
&main = 0x80483c9
1
2
3
4
很明显,上述程序很简单,大一的新生都知道为什么。但是今天我们不是学习这个程序的,而是想要了解,运行 gcc test.c -o test 这个命令后,是如何一步一步生成可执行文件test的。
实际上,上述C程序从源文件到二进制可执行文件,有以下四个步骤:
预处理 cpp
C编译 cc
汇编 as
链接 ld
大概编译一个源程序为二进制文件的过程如下图所示:
在这里插入图片描述