首页 > 其他分享 >编译链接过程

编译链接过程

时间:2023-01-20 11:44:06浏览次数:36  
标签:汇编 gcc 编译 指令 main 过程 链接

编译链接过程分析

Linux中程序的链接过程如下:
image

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

预编译

gcc -E main.c -o main.i
  1. 删除#define,展开宏定义
  2. 处理条件编译指令,#if,#ifdef,#else
  3. 处理#include预编译指令,将被包含的文件插入到该编译指令的位置。(递归执行)
  4. 删除所有的注释,// /* */
  5. 添加行号和文件名标识,以便出现错误或者警告能显示行号
  6. 保留#pragma编译器指令
    image

编译

gcc -S main.i -o main.s
  1. 词法分析
  2. 语法分析
  3. 语义分析
  4. 中间代码生成
  5. 目标代码优化

汇编代码

image

汇编

gcc -c main.s -o main.o

翻译成二进制文件

二进制文件
image

链接

gcc main.o -o main

合并符号表 合并section 调整段大小和段起始位置

  1. 地址和空间分配
  2. 符号决议(绑定)
  3. 符号重定位

编译的优化

array[index] = (index + 4) * (2 + 6)

原先汇编
image
优化后汇编:
乘法由基址比例变址寻址的lea指令完成,最后由mov指令完成赋值
image

标签:汇编,gcc,编译,指令,main,过程,链接
From: https://www.cnblogs.com/baobaobashi/p/17060609.html

相关文章

  • 编译 datax
    下载DataX首先,访问DataX官网地址https://github.com/alibaba/DataX/进行下载编译DataX下载后解压DataX,在确保已经安装了maven之后,进入DataX目录,执行mvn-Uclea......
  • SOFAJRaft模块启动过程
    本篇文章旨在分析SOFAJRaft中jraft-example模块的启动过程,由于SOFAJRaft在持续开源的过程中,所以无法保证示例代码永远是最新的,要是有较大的变动若有纰漏或者错误的地方,欢......
  • 基于64QAM调制解调的LDPC编译码算法误码率matlab仿真
    1.算法描述LDPC译码从译码算法的实现角度可以将译码类型分为硬判决译码和软判决译码两种类型。其中,硬判决译码方式实现过程较为简单,其通过一个预先设置的阈值对译码信息进......
  • 基于64QAM调制解调的LDPC编译码算法误码率matlab仿真
    1.算法描述       LDPC译码从译码算法的实现角度可以将译码类型分为硬判决译码和软判决译码两种类型。其中,硬判决译码方式实现过程较为简单,其通过一个预先设置的阈......
  • 记一次UOS系统下休眠后自动唤醒的排查过程
    故障现象UOS电脑在执行手动休眠后大概20~30秒左右自动唤醒回到登录界面日志分析通过关键字过滤分析日志cat/var/log/syslog|grep-iE"sleeprequest|wakerequest"......
  • Visual Studio 2022安装过程
    官网下载地址:VisualStudio:面向软件开发人员和Teams的IDE和代码编辑器(microsoft.com) 1.下载,我的是windows系统,下载自己想要的版本  2.双击,下载的.exe安装......
  • scrapy框架安装过程报错
    FailedcleaningbuilddirforcryptographyFailedtobuildcryptographyCouldnotbuildwheelsforcryptographywhichusePEP517andcannotbeinstalleddirectl......
  • 单机版hadoop搭建过程记录
    1、添加hadoop1用户组[root@localhost~]#groupaddhadoop12、添加hadoop1用户,并设置密码[root@localhost~]#useradd-ghadoop1hadoop1[root@localhost~]#passw......
  • C++的Visual Studio编译
    当我在使用C++创建控制台项目的时候我想把创建的一个HelloWorld!基本控制台编译完,发给其他人,让其在其他电脑上运行结果,当其他电脑打开我编译好的exe程序时...就出现了......
  • oracle存储过程返回结果集SYS_REFCURSOR
    createorreplaceprocedureproc_query_rent(param_regionvarchar2,--定义区param_roomnumber,--定义室param_hallnumber,--定义厅param_rentMinnumber,--定义租金上......