2编译和链接

温度而知新

  1. 北桥:负责CPU,GPU,内存等高速设备。南桥:负责键盘,鼠标,硬盘等低速设备
  2. 运行库使用操作系统提供的系统调用接口(System Call Interface),系统调用接口在实现中往往以软件中断(Software Interrupt)的方式提供,比如Linux使用0x80号中断作为系统调用接口,Windows使用0x2E号中断作为系统调用接口(从Windows XP Sp2开始,Windows开始采用一种新的系统调用方式)。
  3. 操作系统的一个功能是提供抽象的皆苦,另外一个主要功能是管理硬件资源。
  4. 线程优先级改变一般有三种方式:
    • 用户指定优先级
    • 根据进入等待状态的频繁程序提升或降低优先级
    • 长时间得不到执行而被提升优先级

编译步骤

编译分为4个步骤:预处理、编译、汇编、链接

预处理

预处理过程主要处理那些源代码文件中的以“#”开始的预编译指令。比如“include”,“#define”等

1
2
gcc -E hello.c -o hello.i
cpp hello.c > hello.i

编译

编译过程就是把预处理完的文件进行一系列词法分析,语法分析,语义分析及优化后生成的相应的汇编代码文件,这个过程往往是我们所说的整个程序构建的核心部分,也是最复杂的部分之一。

1
2
gcc -S hello.i -o hello.s
/usr/lib/gcc/x86_64-linux-gnu/8/cc1 hello.c

汇编

汇编器是将汇编代码转变成机器可以执行的指令,每一个汇编语句几乎都对应一条机器指令。

1
2
as hello.s -o hello.o
gcc -c hello.s -o hello.o

链接

链接过程主要包括了地址和控件分配、符号决议和重定位等这些步骤。最基本的静态链接,每个模块的源代码文件(如.c)文件经过编译器编译成目标文件(ObjectFile,一般扩展名为.o或.obj),目标文件和库(Library)一起链接形成最终可执行文件。而最常见的库就是运行时库

  1. 为什么汇编器不直接输出可执行文件而是输出一个目标文件呢?
  2. 链接过程到底包含了什么内容?
  3. 为什么要链接?
0%