Linux下Gcc 的编译过程

         在linux下开发难免会用到gcc编译。GCC(GNU Compiler Collection。GNU编译器套装),是由 GNU 开发的编程语言编译器。它是GNU编译器套装以GPL许可证所发行的自由软件,也是 GNU计划的关键部分。

使用GCC编译程序时,编译过程能够被细分为四个阶段:
◆ 预处理(Pre-Processing)
◆ 编译(Compiling)
◆ 汇编(Assembling)
◆ 链接(Linking)

1、预处理 对源码文件里的文件包括(include)、预编译语句(如宏定义define等)进行分析,编译选项为gcc -E *.c

#define DEBUG "debug"int main()
{char *a = DEBUG;return 1;
}
经过上面的预处理后,能够看到DEBUG被替换成了提前定义的内容

# 1 "hello.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "hello.c"int main()
{char *a = "debug";return 1;
}
2、编译 调用cc1进行编译,使用gcc -S选项就能够生成汇编代码,这个阶段依据输入文件生成以.o为后缀的目标文件。生成的汇编代码例如以下:

        .file   "hello.c".section        .rodata
.LC0:.string "debug".text
.globl main.type   main, @function
main:
.LFB0:.cfi_startprocpushq   %rbp.cfi_def_cfa_offset 16.cfi_offset 6, -16movq    %rsp, %rbp.cfi_def_cfa_register 6movq    $.LC0, -8(%rbp)movl    $1, %eaxleave.cfi_def_cfa 7, 8ret.cfi_endproc
.LFE0:.size   main, .-main.ident  "GCC: (GNU) 4.4.6 20110731 (Red Hat 4.4.6-3)".section        .note.GNU-stack,"",@progbits
3、汇编  汇编过程是针对汇编语言的步骤,调用as进行工作。一般来讲,.S为后缀的汇编语言源码文件和汇编、.s为后缀的汇编语言文件经过预编译和汇编之后都生成以.o为后缀的目标文件。此过程生成ELF格式的目标代码,使用gcc -c进行汇编

使用readelf -a hello.o能够看到具体的elf信息

ELF Header:Magic:   7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 Class:                             ELF64Data:                              2's complement, little endianVersion:                           1 (current)OS/ABI:                            UNIX - System VABI Version:                       0Type:                              REL (Relocatable file)Machine:                           Advanced Micro Devices X86-64Version:                           0x1Entry point address:               0x0Start of program headers:          0 (bytes into file)Start of section headers:          296 (bytes into file)Flags:                             0x0Size of this header:               64 (bytes)Size of program headers:           0 (bytes)Number of program headers:         0Size of section headers:           64 (bytes)Number of section headers:         13Section header string table index: 10Section Headers:[Nr] Name              Type             Address           OffsetSize              EntSize          Flags  Link  Info  Align[ 0]                   NULL             0000000000000000  000000000000000000000000  0000000000000000           0     0     0[ 1] .text             PROGBITS         0000000000000000  000000400000000000000013  0000000000000000  AX       0     0     4[ 2] .rela.text        RELA             0000000000000000  000005680000000000000018  0000000000000018          11     1     8[ 3] .data             PROGBITS         0000000000000000  000000540000000000000000  0000000000000000  WA       0     0     4[ 4] .bss              NOBITS           0000000000000000  000000540000000000000000  0000000000000000  WA       0     0     4[ 5] .rodata           PROGBITS         0000000000000000  000000540000000000000006  0000000000000000   A       0     0     1[ 6] .comment          PROGBITS         0000000000000000  0000005a000000000000002d  0000000000000001  MS       0     0     1[ 7] .note.GNU-stack   PROGBITS         0000000000000000  000000870000000000000000  0000000000000000           0     0     1[ 8] .eh_frame         PROGBITS         0000000000000000  000000880000000000000038  0000000000000000   A       0     0     8[ 9] .rela.eh_frame    RELA             0000000000000000  000005800000000000000018  0000000000000018          11     8     8[10] .shstrtab         STRTAB           0000000000000000  000000c00000000000000061  0000000000000000           0     0     1[11] .symtab           SYMTAB           0000000000000000  0000046800000000000000f0  0000000000000018          12     9     8[12] .strtab           STRTAB           0000000000000000  00000558000000000000000e  0000000000000000           0     0     1
Key to Flags:W (write), A (alloc), X (execute), M (merge), S (strings)I (info), L (link order), G (group), x (unknown)O (extra OS processing required) o (OS specific), p (processor specific)There are no section groups in this file.There are no program headers in this file.Relocation section '.rela.text' at offset 0x568 contains 1 entries:Offset          Info           Type           Sym. Value    Sym. Name + Addend
000000000008  00050000000b R_X86_64_32S      0000000000000000 .rodata + 0Relocation section '.rela.eh_frame' at offset 0x580 contains 1 entries:Offset          Info           Type           Sym. Value    Sym. Name + Addend
000000000020  000200000002 R_X86_64_PC32     0000000000000000 .text + 0There are no unwind sections in this file.Symbol table '.symtab' contains 10 entries:Num:    Value          Size Type    Bind   Vis      Ndx Name0: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT  UND 1: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS hello.c2: 0000000000000000     0 SECTION LOCAL  DEFAULT    1 3: 0000000000000000     0 SECTION LOCAL  DEFAULT    3 4: 0000000000000000     0 SECTION LOCAL  DEFAULT    4 5: 0000000000000000     0 SECTION LOCAL  DEFAULT    5 6: 0000000000000000     0 SECTION LOCAL  DEFAULT    7 7: 0000000000000000     0 SECTION LOCAL  DEFAULT    8 8: 0000000000000000     0 SECTION LOCAL  DEFAULT    6 9: 0000000000000000    19 FUNC    GLOBAL DEFAULT    1 main


4、链接 链接过程。生成可运行代码。链接分为两种,一种是静态链接,第二种是动态链接。

使用静态链接的优点是,依赖的动态链接库较少,对动态链接库的版本号不会非常敏感,具有较好的兼容性。缺点是生成的程序比較大。使用动态链接的优点是,生成的程序比較小,占用较少的内存。

gcc hello.o -o hello 就能够完毕最后的链接操作并生成可运行文件,至于怎样生成动态库和静态库,以及怎样链接动态库和静态库,以后会再作介绍。


转载于:https://www.cnblogs.com/lxjshuju/p/6928091.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/283464.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用.NET简单实现一个Redis的高性能克隆版(七-完结)

译者注该原文是Ayende Rahien大佬业余自己在使用C# 和 .NET构建一个简单、高性能兼容Redis协议的数据库的经历。首先这个"Redis"是非常简单的实现&#xff0c;但是他在优化这个简单"Redis"路程很有趣&#xff0c;也能给我们在从事性能优化工作时带来一些启…

解决 Vue 里 Script 标签首层不缩进 - VS Code

问题&#xff1a; 在 vscode 使用 vue 的时候&#xff0c;发现 script 标签首层不缩进&#xff1f;&#xff1f;&#xff1f; 下载扩展&#xff1a;prettier 解决方法一&#xff1a; 打开 setting.json文件 添加&#xff1a;"prettier.vueIndentScriptAndStyle": tru…

Android应用开发性能优化完全分析

1 背景 其实有点不想写这篇文章的&#xff0c;但是又想写&#xff0c;有些矛盾。不想写的原因是随便上网一搜一堆关于性能的建议&#xff0c;感觉大家你一总结、我一总结的都说到了很多优化注意事项&#xff0c;但是看过这些文章后大多数存在一个问题就是只给出啥啥啥不能用&am…

ZBLOG-ASP2.2如何给图片增加ALT标签说明文字?

2019独角兽企业重金招聘Python工程师标准>>> 一直以来&#xff0c;我们在建设网站的时候&#xff0c;都容易犯下一个大错误&#xff0c;那就是没有重视图片的文字说明&#xff0c;而大多数时候&#xff0c;技术方面并不能很好的识别图片的内容&#xff0c;这也是受限…

养成这个习惯,学习.NET可以少走很多弯路

随着时代的发展&#xff0c;很多曾经风靡一时的编程语言后来被新的开发语言取代、慢慢走向没落&#xff0c;如&#xff1a;Delphi、Perl、Adobe Flash、Ruby等&#xff0c;但 .NET 始终坚若磐石&#xff0c;它作为一款备受受欢迎的开发平台&#xff0c;到底有什么优势呢&#x…

[asp.net mvc 奇淫巧技] 04 - 你真的会用Action的模型绑定吗?

在QQ群或者一些程序的交流平台&#xff0c;经常会有人问&#xff1a;我怎么传一个数组在Action中接收、我传的数组为什么Action的model中接收不到、或者我在ajax的data中设置了一些数组&#xff0c;为什么后台还是接收不了、还有一些怎么传送一个复杂的对象或者Action怎么接收一…

拒绝“高冷”词汇!初学C#中的委托

拒绝“高冷”词汇&#xff01;初学C#中的委托 有一天&#xff0c;你写了好多好多带“形参”的构造函数&#xff08;就是“方法”&#xff0c;同义&#xff09;&#xff0c;而且需要向这些构造函数里传递同样的“实参”&#xff0c;然后你就憨憨地一个一个函数的调用并赋予同样的…

JAVA企业级应用TOMCAT实战视频课程

1. Tomcat简介Tomcat是Apache软件基金会&#xff08;Apache Software Foundation&#xff09;的Jakarta 项目中的一个核心项目&#xff0c;由Apache、Sun和其他一些公司及个人共同开发而成。Tomcat服务器是一个免费的开放源代码的Web应用服务器&#xff0c;属于轻量级应用服务器…

WPF 系列-01默认程序结构

WPF应用程序启动项创建一个WPF应用程序&#xff0c;系统为我们自动生成了App.xaml和一个普通的MainWindow.xaml窗体文件。App.xaml 和cs 文件文件如下&#xff1a;<Application x:Class"Example_01.App"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/…

纳税服务系统【角色与用户】

用户与角色之间的关系 我们在做用户模块的时候&#xff0c;漏掉了最后一个功能。在新增功能中是可以选择角色的。 用户与角色之间的关系也是多对多 一个用户对应多个角色一个角色可以被多个用户使用。现在呢&#xff0c;我们的用户表已经是写的了。我们最好就不要修改原有的用户…

flex-grow flex-shrink 解决最后一行个数不足无法对齐

正常情况下&#xff0c;每页大小15个&#xff0c;设置每行3列&#xff0c;刚好5行。 当外部容器宽度不足以放3列时&#xff0c;自动换行&#xff0c;但最后一行元素自动撑满 &#xff0c;会造成元素块大小不一致&#xff0c;不是想要的效果 原始代码示例&#xff1a; <ul …

POJ 1562深搜判断连体油田个数

http://poj.org/problem?id1562 大意&#xff1a;输入mp二维矩阵&#xff0c;规定‘’连体的包括对角线为一片油田&#xff0c;统计共有多少油田。深搜方向数组dir设置8个方向遇到继续搜索把当前位置赋值*避免重复遍历即可 #include <iostream> #include <cmath> …

C# 并行编程避坑指南之-Try Catch系列

自从.NET Framework 4.5(含4.5)提供了Task开启线程后&#xff0c;基本上Thread的使用频率就大幅度降低了&#xff0c;但是一些老项目&#xff0c;或者老程序还是习惯用Thread去做&#xff0c;如果一定要使用Thred&#xff0c;那我们就必须在代码中使用try、catch块去处理异常的…

系统配置vue.config.js(通用)和vue3中的vite.config.js的通用配置

vue配置大全 本人实例自用&#xff0c;不喜勿喷 vue.config.js的配置 module.exports {devServer: {host: ,hot: true,port: 8086,disableHostCheck: true,//新版的webpack-dev-server出于安全考虑&#xff0c;默认检查hostname&#xff0c;//如果hostname不是配置内的&#x…

.NET 6应用程序适配国产银河麒麟V10系统随记

最近想在麒麟系统上运行.NET 6程序&#xff0c;经过一番折腾最终完成了&#xff0c;简单记录一下。目标系统:CPU: aarch64架构&#xff08;ARM64)操作系统&#xff1a;银河麒麟V10高级服务器系统银河麒麟V10系统&#xff08;以下简称麒麟&#xff09;使用的是redhat类似的dnf包…

SQL优化大法

一、查询SQL尽量不要使用select *&#xff0c;而是具体字段 1、反例 SELECT * FROM user2、正例 SELECT id,username,tel FROM user3、理由 节省资源、减少网络开销。 可能用到覆盖索引&#xff0c;减少回表&#xff0c;提高查询效率。 注意&#xff1a;为节省时间&#x…

spring boot 整合mybatis

1、添加依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><dependency><groupId>com.oracle</groupId><artifactId>ojdbc6</art…

Mac系统之----教你怎么显示隐藏文件,或者关闭显示隐藏文件

显示&#xff1a;defaults write com.apple.finder AppleShowAllFiles -bool true隐藏&#xff1a;defaults write com.apple.finder AppleShowAllFiles -bool false转载于:https://www.cnblogs.com/akiha/p/6936332.html

k8s 读书笔记 - CRI(容器运行时接口)详解

k8s Node 节点&#xff08;kubelet&#xff09;的主要功能就是启动和停止容器的组件&#xff0c;这组件我们称之为 容器运行时&#xff08;Container Runtime&#xff09;&#xff0c;这其中最知名的就是 Docker 了。为了更具扩展性&#xff0c;k8s 从 v1.5 版本开始就加入了容…

HTML5_02之视频、音频、Canvas

1、HTML5新特性之视频播放——video&#xff1a; ①例&#xff1a;<video src""></video> ②video标签默认为300*150的inline-block&#xff1b; ③成员属性&#xff1a; autoplay&#xff1a;是否自动播放&#xff1b; controls&#xff1a;是否显示播…