• Linux预处理、编译、汇编、链接和运行的过程(包括一些基本的命令)


    转自Quinn0918的博客

    一、预编译

    1.将所有的#define删除,并展开所有的宏定义;
    2.处理所有的预编译指令,例如:#if,#elif,#else,#endif;
    3.处理#include预编译指令,将被包含的文件插入到预编译指令的位置;
    4.添加行号信息文件名信息,便于调试;
    5.删除所有的注释:// /**/;
    6.保留所有的#pragma编译指令,因为在编写程序的时候,我们经常要用到#pragma指令来设定编译器的状态或者是指示编译器完成一些特定的动作。
    7.生成.i文件。

    包括(1)去注释 (2)宏替换 (3)头文件展开 (4)条件编译

    二、编译:C语言—>汇编##

    1.扫描,语法分析,语义分析,源代码优化,目标代码生成,目标代码优化;
    2.生成汇编代码;
    3.汇总符号;
    4.生成.s文件

    三、汇编:汇编—>二进制

    1.根据汇编指令和特定平台,把汇编指令翻译成二进制形式;
    2.合并各个section,合并符号表;
    3.生成.o文件

    四、链接##

    1.合并各个.obj文件的section,合并符号表,进行符号解析;
    2.符号地址重定位;
    3.生成可执行文件

    程序示例##

    main.cpp

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

    1.预处理###

    gcc main.c -E -o main.i
    

    表示让gcc只进行“预处理”就行了。 所谓的预处理,就是把程序中的宏展开, 把头文件的内容展开包含进来等等一些编译前的预处理操作,然后-o保存在test.i里。

    2.编译###

     gcc -S main.i -o main.s
    

    表示让gcc只进行“预处理编译”就行了。将test.i翻译成文本文件test.s,它包含一个汇编语言程序。编译会从词法、语法和语义上对文件进行分析, 并进行汇编代码生成, 形成的还是文本文件------汇编语言文件。以.s作为文件扩展名,然后-o保存在test.s里。

    3.汇编###

     gcc -c main.s -o main.o
    

    表示让gcc只进行“预处理编译汇编”就行了。汇编器将test.s翻译成二进制机器语言指令,所以我们就看不懂了,把这些指令打包成一种叫做可重定位目标程序格式,并保存在.o文件中。

    4.链接###

    gcc main.o -o a
    

    表示让gcc只进行“预处理编译汇编链接”。最后将二进制机器语言指令转换成二进制的可执行程序。

    5.运行###

     ./a
    
  • 相关阅读:
    require的特点
    require和load的不同之处
    关于“load”方法
    puts方法要点
    用类解释对象的由来
    以方法调用的原理解释Ruby中“puts ‘Hello‘”
    Ruby中方法的设计理念
    Ruby中puts,print,p的区别
    Ubuntu16.04安装MongoDB的Ruby驱动
    使用spring框架,用xml方式进行bean装配出现“The fully qualified name of the bean's class, except if it serves...”
  • 原文地址:https://www.cnblogs.com/narjaja/p/9117224.html
Copyright © 2020-2023  润新知