• 1.GCC编译过程


    一. GCC编译过程

    gcc -E hello.c -o hello.i        // 预处理。将代码中包含的头文件和宏进行替换

    gcc -S hello.i -o hello.s        // 汇编。将当前文本转换为汇编代码

    gcc -c hello.s -o hello.o          // 编译。将当前汇编代码转换成二进制代码

    gcc hello.o -o hello            // 链接。将生成的二进制代码与系统库函数进行链接,生成可执行文件

    各阶段的代码内容如下:

    hello.c (原始C代码)

    #include <stdio.h>
    
    int main()
    {
      printf("hello, world
    ");
    }

    hello.i (头文件替换后的C代码)

    # 1 "hello.c"
    # 1 "<built-in>"
    # 1 "<命令行>"
    # 1 "hello.c"
    # 1 "/usr/include/stdio.h" 1 3 4
    ...
    ...
    ...
    extern void funlockfile (FILE *__stream) __attribute__ ((__nothrow__ , __leaf__));
    # 940 "/usr/include/stdio.h" 3 4
    
    # 2 "hello.c" 2
    
    int main()
    {
      printf("hello, world
    ");
    }

    hello.s (汇编代码)

    .file    "hello.c"
        .section    .rodata
    .LC0:
        .string    "hello, world"
        .text
        .globl    main
        .type    main, @function
    main:
    .LFB0:
        .cfi_startproc
        pushl    %ebp
        .cfi_def_cfa_offset 8
        .cfi_offset 5, -8
        movl    %esp, %ebp
        .cfi_def_cfa_register 5
        andl    $-16, %esp
        subl    $16, %esp
        movl    $.LC0, (%esp)
        call    puts
        leave
        .cfi_restore 5
        .cfi_def_cfa 4, 4
        ret
        .cfi_endproc
    .LFE0:
        .size    main, .-main
        .ident    "GCC: (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3"
        .section    .note.GNU-stack,"",@progbits

    hello.o (二进制代码)

    457f 464c 0101 0001 0000 0000 0000 0000
    0001 0003 0001 0000 0000 0000 0000 0000
    011c 0000 0000 0000 0034 0000 0000 0028
    000d 000a 8955 83e5 f0e4 ec83 c710 2404
    0000 0000 fce8 ffff c9ff 00c3 6568 6c6c
    2c6f 7720 726f 646c 0000 4347 3a43 2820
    6255 6e75 7574 4c2f 6e69 7261 206f 2e34
    2e36 2d33 7531 7562 746e 3575 2029 2e34
    2e36 0033 0014 0000 0000 0000 7a01 0052
    7c01 0108 0c1b 0404 0188 0000 001c 0000
    00000a0 001c 0000 0000 0000 0017 0000 4100 080e
    00000b0 0285 0d42 5305 0cc5 0404 0000 2e00 7973
    00000c0 746d 6261 2e00 7473 7472 6261 2e00 6873
    00000d0 7473 7472 6261 2e00 6572 2e6c 6574 7478
    00000e0 2e00 6164 6174 2e00 7362 0073 722e 646f
    00000f0 7461 0061 632e 6d6f 656d 746e 2e00 6f6e
    6574 472e 554e 732d 6174 6b63 2e00 6572
    2e6c 6865 665f 6172 656d 0000 0000 0000
    0000 0000 0000 0000 0000 0000 0000 0000
    *
    0000 0000 001f 0000 0001 0000 0006 0000
    0000 0000 0034 0000 0017 0000 0000 0000
    0000 0000 0004 0000 0000 0000 001b 0000
    0009 0000 0000 0000 0000 0000 03e8 0000
    0010 0000 000b 0000 0001 0000 0004 0000
    0008 0000 0025 0000 0001 0000 0003 0000
    00001a0 0000 0000 004c 0000 0000 0000 0000 0000

    二.技术背景

    • 计算机的早期,程序都是直接运行在硬件之上,自己负责硬件的管理工作;程序员也使用二进制进行编程,需要处理各种边界条件和安全问题。
    • 后来人们不能忍受了,于是开发出了操作系统,让它来管理各种硬件,同时发明了汇编语言,减轻程序员的负担。
    • 随着软件规模的不断增大,使用汇编语言编程开始变得捉襟见肘,不仅学习成本高,开发效率也很低,于是C语言诞生了。C语言编译器先将C代码翻译为汇编代码,再由汇编器将汇编代码翻译成机器指令。

     

  • 相关阅读:
    Go从入门到精通——Go语言中程序文件的组织方法
    Go从入门到精通——怎样查看 Go 语言的文档
    AU篇——处理人声混BGM_(尽可能)去BGM提取人声
    【漏洞分析】DDOS攻防分析(一)——DNS篇
    【网络安全设备系列】15、安全网关/统一威胁管理(UTM)
    【网络安全设备系列】14、堡垒机
    【网络安全设备系列】13、网页防篡改
    【网络安全设备系列】12、态势感知
    【网络安全设备系列】11、抗DDOS设备
    【网络安全设备系列】10、安全审计系统
  • 原文地址:https://www.cnblogs.com/yongdaimi/p/7345924.html
Copyright © 2020-2023  润新知