【Linux】基础开发工具使用 --- gcc

news2024/11/19 18:45:04

目录

预处理

编译

汇编

链接

函数库

协助记忆


🧋GCC(GNU Compiler Collection)是由GNU开发的编程语言编译器。GNU编译器套件包括C、C++、 Objective-C、 Fortran、Java、Ada和Go语言前端,也包括了这些语言的库(如libstdc++,libgcj等。),说那么多就是一个编译器。平时写完的程序就是需要编译之后才能运行。

🧋之前讲过程序的预处理,但之前限制于环境问题无法讲得透彻与直观。在 Linux 中学习 gcc 后,我们终于可以清楚地观察到程序转换至可执行文件时的过程了。

🧋我们都知道,程序要尽量四个步骤才能转换成可执行文件,根据 gcc 的不同选项我们可以得到不同阶段下的文件。

预处理

gcc -E -o printf.i printf.c   //-o后跟着的始终为要生成的文件

🧋选项“-E”,该选项的作用是让 gcc 在预处理结束后停止编译过程,选项 “-o” 之后总是跟着生成的目标文件,输入这串命令,gcc 会自动将程序编译到相应的阶段,此时的文件后缀为  .i  

 🧋可以看到,注释的部分被删去,并且多出来八百多行的代码,就是源程序文件将头文件展开后的结果。

编译

gcc -S -o printf.s printf.i

🧋带上选项 "-S" , gcc 自动将文件编译到编译环节结束,此时的文件的内容已变成了汇编语言,同时文件的后缀为 .s

  1   .file "printf.c"                                                                                                                                         
  2   .section  .rodata
  3 .LC0:
  4   .string "hello world"
  5   .text
  6   .globl  main
  7   .type main, @function
  8 main:
  9 .LFB0:
 10   .cfi_startproc
 11   pushq %rbp
 12   .cfi_def_cfa_offset 16
 13   .cfi_offset 6, -16
 14   movq  %rsp, %rbp
 15   .cfi_def_cfa_register 6
 16   movl  $.LC0, %edi
 17   call  puts
 18   movl  $.LC0, %edi
 19   call  puts
 20   movl  $.LC0, %edi
 21   call  puts
 22   movl  $.LC0, %edi
 23   call  puts
 24   movl  $0, %eax
 25   popq  %rbp
 26   .cfi_def_cfa 7, 8
 27   ret
 28   .cfi_endproc
 29 .LFE0:
 30   .size main, .-main
 31   .ident  "GCC: (GNU) 4.8.5 20150623 (Red Hat 4.8.5-44)"
 32   .section  .note.GNU-stack,"",@progbits

 汇编

gcc -c -o printf.o printf.s

🧋使用 “-c” 选项使文件编译到汇编结束停止,经过汇编后文件已由原来的汇编代码转换成二进制文件了(后缀为 .o ),直接看的话会发现就是一堆乱码。

🧋并且这个文件目前仍无法运行,若强制访问也会被拒绝。

[Alpaca@VM-12-9-centos ~]$ ./printf.o
-bash: ./printf.o: Permission denied

链接

gcc -o printf printf.o   //从.o文件开始编译
gcc -o printf printf.c   //从头开始编译

🧋这一步结束后整个编译环节就算结束了,即从头到尾编译,因此不用带选项就能达到目的效果。生成的文件就可以直接执行了。

[Alpaca@VM-12-9-centos ~]$ ./printf
hello world
hello world
hello world
hello world

函数库

🧋在链接的时候我们所用到的函数并不完全是我们自己的,因此需要与库建立联系,从而可以使用库里面的函数。

🧋函数库又分成了动态库静态库两种,动态库又叫共享库,其提供的能力是被所有人共享的,就像学校外的网吧一样,你给了钱就能上网,但万一有一天网吧倒闭了,所有的学生都不能去那家网吧上网了。

🧋而静态库则是将你所需要的库中的代码拷贝到自己本地的文件中。就像自己的电脑,即便外面的网吧倒闭了,你仍然可以照常上网

[Alpaca@VM-12-9-centos ~]$ ldd printf
	linux-vdso.so.1 =>  (0x00007ffdf3584000)
	libc.so.6 => /lib64/libc.so.6 (0x00007f1d8a320000)
	/lib64/ld-linux-x86-64.so.2 (0x00007f1d8a6ee000)

[Alpaca@VM-12-9-centos ~]$ file printf
printf: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=ab832f77ec91a8a75cf4d749ef046741e5abf2bc, not stripped

🧋我们有两种方法来判断这个可执行文件是动态链接的还是静态链接的,第一就是使用 ldd 来查询函数的所属关系,当文件是 lib 开头后缀为 .so 则表明是依赖的是动态库,若后缀为 .a 则说明其依赖的是静态库。第二种方法就是使用 file 命令,可以细致地观察文件的属性,在这里便可以看到该文件是由动态库链接而成的。

gcc -static -o printf-static printf.c

🧋 Linux 下是默认使用动态链接的,但我们可以使用这个命令进行静态链接。之后查询出的文件的数据类型就表明其是由静态链接构成的了。

[Alpaca@VM-12-9-centos ~]$ file printf-static
printf-static: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), statically linked, for GNU/Linux 2.6.32, BuildID[sha1]=9444d246f27ba1fed466fb, not stripped

🧋但由此我们可以明显地看出二者不同链接方式之间的区别,静态链接生成的文件所占的空间远大于动态链接的,更加地浪费空间。所以正常情况下还是使用动态链接较好。

[Alpaca@VM-12-9-centos ~]$ ll
-rwxrwxr-x 1 Alpaca Alpaca   8361 Jan 11 21:54 printf
-rwxrwxr-x 1 Alpaca Alpaca 861288 Jan 11 23:45 printf-static

协助记忆

🧋预处理、编译、汇编三个阶段所对应的选项分别是 “E” "S" "c" , 刚好就是键盘左上角那个 “Esc” ,只不过中间的 s 需要改成大写。同时其所对应的文件后缀为 “.i” 、“.s” 、“.o” 就是 “iso” 。只要稍微用一些方法来记忆之间的区别,相信很快就能熟练起来。

好了,这次gcc的介绍就到这里结束了,关注博主共同进步!!

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

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

相关文章

Docker tarsgo

目录 参考: mysql镜像安装 一、安装镜像 二、创建mysql容器 使用 tarscloud/framework 部署框架 拉取最新版本镜像 启动镜像(目前只考虑了 linux 上, 时间和本机同步) 目录说明 参数解释 Docker 部署 Tars 应用节点 开发环境 docker-compose go安装 ubu…

CSS自定义滚动条

大家好,我是半夏👴,一个刚刚开始写文的沙雕程序员.如果喜欢我的文章,可以关注➕ 点赞 👍~ 搞前端的半夏 一起学习交流前端,成为更优秀的前端工程师 前言 之前写过一篇scroll-snap让你的滚动条更…

《c++ primer笔记》第二章 变量和基本类型

前言 最近开始二刷c primer,第一遍很模糊的过了一下,由于前面的基础很多没理解透,从12章到16章基本是懵逼的状态。第二次为了保证质量准备把每个章节个人感觉重要的部分进行一个记录与总结,其中也记录了部分看书过程中遇到的问题&…

[JS]JavaScript基础学习笔记(黑马pink+尚硅谷李立超)

文章目录🥽 前言🥽 JavaScript 简介🌊 JavaScript 是什么🌊 JavaScript 的作用🌊 HTML/CSS/JS 的关系🌊 浏览器执行 JS🌊 JS 的组成🥽 JavaScript 的书写位置🌊 行内式 J…

【C语言】指针进阶(一)

学好指针✊✊✊还有,男孩子在外面要保护好自己一、字符指针字符也有地址,当然可以将其储存——字符指针,是储存字符地址的指针对于普通的单个字符:char ch a;char* pc1 &ch;这里的pc是单个变量ch‘(单个字符&…

防火门监控系统在智能建筑消防的重要性及应用介绍

【摘要】: 安全、舒适的生活及办公环境是人们所追求的,因此,在建筑中各种智能化的设备及布控系统显得尤为重要。近年各种频发的高危火灾事件严重威胁到了国民的生命安全,所以火灾监控系统在建筑中的应用显得尤为重要。本文主要从智…

【涵子来信python大全】——第二季——opencv第一篇

各位亲爱的读者,博主: 首先恭喜大家,涵子来信已经到达第二季——2023年篇。今天,我们要步入机器学习的初级内容:python opencv图片! 目录 一、提前准备 二、程序代码学习 2.1.如何读取图片 2.2.显示图…

MySQL架构,以及redo log、undo log和binlog的区别(六)

一、Mysql的基本架构图 二、连接器 连接器负责跟客户端建立连接,获取权限、维持和管理连接: 用户名密码验证;查询权限信息,分配对应的权限;可以使用show processlist查看现在的连接;如果太长时间没有动静…

【rt-thread网络】第0篇:使用paho-mqtt软件包连接腾讯云mqtt服务器

文章目录一、mqtt介绍二、paho mqtt介绍三、连接腾讯云的步骤3.1 在腾讯云控制台的IOT HUB创建产品和设备(略)3.2 根据产品信息填充MQTTClient的连接参数3.3 编译和下载到开发板(略)四、测试五、参考一、mqtt介绍 MQTT(消息队列遥…

【Linux操作系统】如何实现Linux中软件安装进度条?

文章目录一.回车与换行二.缓冲区问题三.倒计时小程序四.进度条小程序Linux下安装软件时,经常会看到类似上图的进度条,今天带大家用C语言来演示其原理! 一.回车与换行 俗话:回车换行,实际是回车和换行的组合 回车是回…

助力工业物联网,工业大数据项目之数据采集

文章目录01:Sqoop命令回顾02:YARN资源调度及配置03:MR的Uber模式04:Sqoop采集数据格式问题05:问题解决:Avro格式06:Sqoop增量采集方案回顾01:Sqoop命令回顾 目标:掌握Sqo…

TypeScript环境搭建 下载/安装 ,编译运行的三种方式:tsc命令行/tsc-node库/webpack搭建环境

目录 什么是TypeScript? 首先来进行全局安装 : 编译运行 方式一:命令行(cmd终端)--->tsc命令行 1.将代码编译为JavaScript的代码,使用cmd终端或者命令行运行以下命令: 2.在浏览器或者Node环境下运行JavaScript代码 方式…

声纹识别与声源定位(一)

针对目前智能计算机及大规模数据的发展,依据大脑处理语音、图像数据方法的deep learning技术应运而生。deep learning技术是应用于音频信号识别,模仿大脑的语音信号学习、识别的模式。在音频信号处理的过程中,运用deep learning进行音频数据的…

极海APM32F072RB开发环境测试

极海APM32F072RB开发环境测试通过自制的开发板进行测试。 🎬基于STM32cubemx工程配置 Keil MDK编译 ST-LINK/V2烧录 🌻基于APM32F0xx_SDK Keil MDK编译 ST-LINK/V2烧录 🌿官方的SDK包下载地址:https://www.geehy.com/support/…

DMDW主备集群搭建备库先open引发的问题

一、问题描述及配置主备集群搭建成功后,主备库启动脚本中START_MODEmount,备库的lsn号大于等于备库,N_OPN打开次数主库大于备库。假如搭建主备集群后,备库首先OPEN一下后引发的问题如下图:启动脚本中START_MODEopen3、…

tcp紧急指针,mss,rto,零窗口探测等

三次握手、四次挥手、重传机制、滑动窗口、流量控制、拥塞控制、TCP/UDP全解析-蒲公英云 (dandelioncloud.cn)(511条消息) TCP零窗口探测_redwingz的博客-CSDN博客_tcp0窗口TCP系列32—窗口管理&流控—6、TCP zero windows和persist timer - 走看看 (zoukankan.com)TCP协议…

VUE-Axios-解决跨域问题.

vue-axios跨域问题发现: https://github.com/Aealen/TopicSelection-VUE 使用vue-axios向后端发送请求的时候遇到如下报错: vue-axios跨域问题原因: 什么是跨域 **跨域:**指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器…

从零开始编写一个上位机(串口助手)QT Creator + Python

提示:本博客作为学习笔记,有错误的地方希望指正,此文可能会比较长,作为学习笔记的积累,希望对来着有帮助。   绪论:笔者这里使用的是QTCreator和Python来实现一个简单的串口上位机的开发的简单过程&#…

软件测试复习02:静态测试

作者:非妃是公主 专栏:《软件测试》 个性签:顺境不惰,逆境不馁,以心制境,万事可成。——曾国藩 文章目录评审评审过程角色和职责评审类型静态分析控制流分析数据流分析编码标准一致性检查桌面检查代码走查…

Unity 之 资源加载 -- 可寻址系统面板介绍 -- 入门(二)

可寻址系统面板介绍 -- 入门(二)一,可寻址系统目录介绍1.2 创建分组1.2 目录介绍二,可寻址系统设置介绍2.1 Profile - 配置文件2.2 Catalog - 目录2.3 Content Update - 内容更新2.4 Downloads - 下载2.5 Build - 构建2.6 Build a…