链接、装载与库[2]编译和链接

1.GCC编译源程序的4个步骤

1)预处理

主要的处理规则如下:

  • 将所有的“#define”删除,并且展开所有的宏定义;
  • 处理所有条件预编译指令,例如“#if”、“#ifdef”、"#elif"…
  • 处理“#include”预编译指令,将被包含的文件插入到该预编译指令的位置;
  • 删除所有的注释“//”和“/**/”;
  • 添加行号和文件名标识,以便于编译时产生调用的行号信息及用于编译时产生编译错误或警告时能够显示行号;
gcc -E hello.c -o hello.i   //-E表示只进行预编译

2)编译

将预处理完的文件进行一系列的词法分析、语法分析、语义分析和代码优化。

gcc -S hello.c -o hello.s  //

3)汇编

将汇编代码转换成机器码

gcc -c hello.s -o hello.o

4)链接

将许多目标文件.o链接起来,才能得到可执行的out文件

ld -static crt1.o crti.o crtbeginT.o hello.o -start-group -lgcc -lgcc -lgcc_eh -lc -end-group cr

例如,有个全局变量var,它在目标文件A里面。我们在目标文件B里面要访问var:

mov1 $0x2a, var

只有A目标文件跟B目标文件链接起来后,才能知道var在内存的地址,整个程序才能可执行。

猜你喜欢

转载自blog.csdn.net/qq_43118572/article/details/113836979