美文网首页
C 语言编译链接过程

C 语言编译链接过程

作者: l蓝色梦幻 | 来源:发表于2018-12-28 11:46 被阅读5次

C 语言从源代码变成可执行文件经过了以下步骤: 预处理(preprocessing)、编译(compilation)、汇编(assembly)、和连接(linking).

下面, 我们以 hello.c 为例, 看一下整个链接过程.

hello.c

#include <stdio.h>

int main() {
    printf("hello world\n");
    return 0;
}

  1. 预处理 ==> .c -> .i

    预处理包含有以下三种操作

    • 将要包含(include)的文件插入原文件中
    • 将宏定义展开
    • 根据条件编译命令选择要使用的代码操作
    $ gcc -E hello.c -o hello.i
    

    由于最后的预处理后的 .i 文件过大, 这里只展示一部分:

    # 1 "hello.c"
    # 1 "<built-in>" 1
    # 1 "<built-in>" 3
    I# 68 "/usr/include/_stdio.h" 3 4
    # 1 "/usr/include/sys/cdefs.h" 1 3 4
    # 587 "/usr/include/sys/cdefs.h" 3 4
    # 1 "/usr/include/sys/_symbol_aliasing.h" 1 3 4
    # 588 "/usr/include/sys/cdefs.h" 2 3 4
    # 653 "/usr/include/sys/cdefs.h" 3 4
    # 1 "/usr/include/sys/_posix_availability.h" 1 3 4
    
    .......
    
    extern int __vsnprintf_chk (char * restrict, size_t, int, size_t, const char * restrict, va_list);
    # 412 "/usr/include/stdio.h" 2 3 4
    # 2 "hello.c" 2
    int main() {
        printf("hello world\n");
        return 0;
    }
    
  2. 编译 ==> .i -> .s

    编译过程是将上面预处理过后的文件翻译成汇编代码.

    $ gcc -S hello.i -o hello.s
    $ vi hello.s    
    
    .section    __TEXT,__text,regular,pure_instructions
    .macosx_version_min 10, 13
    .globl  _main                   ## -- Begin function main
    .p2align    4, 0x90
        _main:                                  ## @main
    .cfi_startproc
        ## %bb.0:
    pushq   %rbp
    .cfi_def_cfa_offset 16
    .cfi_offset %rbp, -16
    movq    %rsp, %rbp
    .cfi_def_cfa_register %rbp
    subq    $16, %rsp
    leaq    L_.str(%rip), %rdi
    movl    $0, -4(%rbp)
    movb    $0, %al
    callq   _printf
    xorl    %ecx, %ecx
    movl    %eax, -8(%rbp)          ## 4-byte Spill
    movl    %ecx, %eax
    addq    $16, %rsp
    popq    %rbp
    retq
    .cfi_endproc
                                        ## -- End function
    .section    __TEXT,__cstring,cstring_literals
        L_.str:                                 ## @.str
    .asciz  "hello world\n"
    
    .subsections_via_symbols
    
  3. 汇编 ==> .s -> .o

    将汇编代码翻译成符合一定格式的机器代码.

    gcc -c hello.s -o hello.o
    
  4. 链接 ==> .o -> app

    链接就是将汇编生成的OBJ文件、系统库的OBJ文件、库文件链接起来,最终生成可以在特定平台运行的可执行程序.

    gcc hello.o -o app
    

相关文章

  • C语言程序内存布局

    C语言笔记之02-C语言程序内存布局 我们知道C语言的编译过程分为:预处理-编译-汇编-链接-生成可执行文件,而这...

  • C 语言编译链接过程

    C 语言从源代码变成可执行文件经过了以下步骤: 预处理(preprocessing)、编译(compilation...

  • C语言编译过程详解

    C语言编译过程详解C语言的编译链接过程是要把我们编写的一个C程序(源代码)转换成可以在硬件上运行的程序(可执行代码...

  • 【初识C语言】编译过程

    C语言编译过程 认识C编译执行过程,是C学习的开端。 我们来简单说C语言从编码编译到执行要经历一下过程: C源代码...

  • Java不能单文件编译的原因之一

    前言 1.一些语言编译的过程是【编译】+【链接】,如c语言 2.java作为一种后来的语言却不具备单文件编译的特性...

  • C语言编译过程详解

    C语言编译过程详解

  • C语言编译 - 编译过程

    一、C语言编译过程简介: 预处理:替换 编译:生成目标文件的汇编文件 汇编:生成目标文件的二进制文件 连接:生成可...

  • C语言的编译链接过程详解

    学过C语言的人都应该知道,我们所编辑的C语言程序是不能直接放到机器上运行的,它只不过是一个带".c"后缀的文件(也...

  • 编译与链接

    编译与链接 代码运行背后的过程 经典C语言程序: Linux下,使用gcc来编译这个程序,进入命令行输入: 可以看...

  • 【C】C语言编译过程

    1,编译预处理(gcc -E main.c -o main.i) 文件包含复制 将源文件中一"#include"格...

网友评论

      本文标题:C 语言编译链接过程

      本文链接:https://www.haomeiwen.com/subject/dcsslqtx.html