gcc编译c⽂件的⼏个过程
wwwblogs/zhangpengshou/p/3587751.html
m.elecfans/article/663750.html
wwwblogs/LiuYanYGZ/p/5548855.html
blog.csdn/qq_33160790/article/details/78887349
c语⾔编译分为4个过程:
1:预编译:预编译做的事情为:把伪指令转换为实际指令  命令 gcc -E   a:#define a b
  b:#条件编译指令,如#ifdef,#ifndef,#else,#elif,#endif等
  c:#include 头⽂件加⼊到编译的⽂件中
  d:⼀些符号处理如file local 等等;
# 1"/usr/lib/gcc/x86_64-redhat-linux/4.4.7/include/stddef.h"134
# 211"/usr/lib/gcc/x86_64-redhat-linux/4.4.7/include/stddef.h"34
typedef long unsigned int size_t;
# 35"/usr/include/stdio.h"234
# 1"/usr/include/bits/types.h"134
# 28"/usr/include/bits/types.h"34
# 1"/usr/include/bits/wordsize.h"134
# 29"/usr/include/bits/types.h"234
typedef unsigned char __u_char;
typedef unsigned short int __u_short;
linux下gcc编译的四个步骤typedef unsigned int __u_int;
typedef unsigned long int __u_long;
typedef signed char __int8_t;
typedef unsigned char __uint8_t;
typedef signed short int __int16_t;
typedef unsigned short int __uint16_t;
typedef signed int __int32_t;
typedef unsigned int __uint32_t;
typedef signed long int __int64_t;
typedef unsigned long int __uint64_t;
可以看出⼀个很⼩的程序经过编译以后把所有的头⽂件包含进来都是很⼤的
2:编译    命令是  gcc -S
  把预编译好的⽂件逐条转化为汇编语⾔
  优化阶段,经过预编译得到的输出⽂件中,只有常量;如数字、字符串、变量的定义,
  以及c语⾔的关键字,如main,if,else,for,while,{,}, +,-,*,\等等。
  编译程序所要作得⼯作就是通过词法分析和语法分析,在确认所有的指令都符合语法规则之后,
  将其翻译成等价的中间代码表⽰或汇编代码。如下都是汇编代码;操作寄存器
.file  "test7.c"
.
text
.globl power
.type  power, @function
power:
.LFB0:
.cfi_startproc
pushq  %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq    %rsp, %rbp
.cfi_def_cfa_register 6
movl    %edi, -20(%rbp)
movl    %esi, -24(%rbp)
movl    $1, -8(%rbp)
movl    -20(%rbp), %eax
movl    %eax, -4(%rbp)
jmp    .L2
.L3:
movl    -4(%rbp), %eax
movl    -20(%rbp), %edx
imull  %edx, %eax
movl    %eax, -20(%rbp)
addl    $1, -8(%rbp)
3:汇编  命令gcc -c
  将.c⽂件直接编译成.o的⼆进制⽂件:
4:链接命令是 gcc *.c    链接命令是ld 链接的时候要考虑代码和数据所要放的内存位置,可以通过链接脚本来设置(这⾥下次课再说)
链接程序的主要⼯作就是将有关的⽬标⽂件彼此相连接,也即将在⼀个⽂件中引⽤的符号同该符号在另外⼀个⽂件中的定义连接起来,使得所有的这些⽬标⽂件成为⼀个能够诶操作系统装⼊执⾏的统⼀整体。
根据开发⼈员指定的同库函数的链接⽅式的不同,链接处理可分为两种:
(1)静态链接
在这种链接⽅式下,函数的代码将从其所在地静态链接库中被拷贝到最终的可执⾏程序中。这样该程序在被执⾏时这些代码将被装⼊到该进程的虚拟地址空间中。静态链接库实际上是⼀个⽬标⽂件的集合,其中的每个⽂件含有库中的⼀个或者⼀组相关函数的代码。
(2)动态链接
在此种⽅式下,函数的代码被放到称作是动态链接库或共享对象的某个⽬标⽂件中。链接程序此时所作的只是在最终的可执⾏程序中记录下共享对象的名字以及其它少量的登记信息。在此可执⾏⽂件被执⾏时,动态链接库的全部内容将被映射到运⾏时相应进程的虚地址空间。动态链接程序将根据可执
⾏程序中记录的信息到相应的函数代码。
对于可执⾏⽂件中的函数调⽤,可分别采⽤动态链接或静态链接的⽅法。使⽤动态链接能够使最终的可执⾏⽂件⽐较短⼩,并且当共享对象被多个进程使⽤时能节约⼀些内存,因为在内存中只需要保存⼀份此共享对象的代码。但并不是使⽤动态链接就⼀定⽐使⽤静态链接要优越。在某些情况下动态链接可能带来⼀些性能上损害。
=====================
gcc -o 指定⽂件名如 gcc -c hello.c  -o hello.a
gcc -M  只输出编译信息不编译
gcc -MM  只输出编译信息不编译

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。