我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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

目录

预处理

编译

汇编

链接

函数库

协助记忆


🧋GCC(GNU Compiler Collection)是由GNU开发的编程语言编译器。GNU编译器套件包括C、C++、 Objective-C、 FortranJavaAdaGo语言前端,也包括了这些语言的库(如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 ~]$ ./printfhello worldhello worldhello worldhello world

函数库

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

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

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

[Alpaca@VM-12-9-centos ~]$ ldd printflinux-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 printfprintf: 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-staticprintf-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的介绍就到这里结束了,关注博主共同进步!!

来源地址:https://blog.csdn.net/Lin_Alpaca/article/details/128648508

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

基于node的cli工具开发使用详解

这篇文章主要为大家介绍了基于node的cli工具开发使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-05-13

基于node的cli工具怎么开发使用

本篇内容介绍了“基于node的cli工具怎么开发使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!背景公司内部有维护admin和h6两套基础
2023-07-05

vue开发使用什么工具

vue开发工具有:1、BootstrapVue,是用于为Vue构建Bootstrap接口的开源库;2、VueX,是Vue应用程序的状态管理库;3、Vue Devtools;4、Vue CLI;5、Vue Router;6、Vuetifyjs;7、Nuxt Js;8、Vue Element Admin;9、Vue Apollo;10、Element UI;11、Quasar等等。
2023-05-14

小程序开发工具基础库更新了哪些内容

本篇内容主要讲解“小程序开发工具基础库更新了哪些内容”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“小程序开发工具基础库更新了哪些内容”吧!最新版本 2017.03.29 (0.15.152900
2023-06-26

嵌入式linux开发工具怎么用

今天小编给大家分享一下嵌入式linux开发工具怎么用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。
2023-03-19

C#开发工具SharpDevelop怎么使用

使用SharpDevelop进行C#开发的步骤如下:1. 安装SharpDevelop:从官方网站(https://www.icsharpcode.net/OpenSource/SD/Download/)下载并安装SharpDevelop。
2023-09-29

使用Rust开发命令行工具

生成二进制文件,将其扔到环境变量的path下即可~ 用rust打造实时天气命令行工具[1] 找到合适的API 使用该api[2] 如请求 api.openweathermap.org/da
2023-08-30

Linux下常用的开发工具有哪些

这篇文章将为大家详细讲解有关Linux下常用的开发工具有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Linux是一个优秀的开发环境,但是如果没有好的开发工具作为武器,这个环境给你带来的好处就会大打折
2023-06-28

一个基于C#开发的Excel转Json工具使用教程

JSON吸引了工具构建者的注意,它们开发了用于重新格式化、验证和解析JSON的众多工具,这不足为奇,下面这篇文章主要给大家介绍了一个基于C#开发的Excel转Json工具的相关资料,需要的朋友可以参考下
2022-11-13

微信开发者工具使用教程

近段时间有很多小伙伴问微信小程序怎么开发啊?开发的第一步就是安装微信web开发者工具,今天就来教你设置好开发者工具。 一、下载开发者工具 https://developers.weixin.qq.com/miniprogram/dev/de
2023-08-19

PHP扩展开发——ext_skel 工具的使用

如何快速的搭建一个PHP扩展骨架?其实PHP源码中自带了一个工具 ext_skel,可以快速的创建PHP扩展的骨架,从而使开发者可以快速进入扩展的实现。 下面就来说一说ext_skel的使用。我们以php5.6为例。并且下载PHP源码:/h
PHP扩展开发——ext_skel 工具的使用
2024-02-27

vue开发使用的工具有哪些

这篇“vue开发使用的工具有哪些”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“vue开发使用的工具有哪些”文章吧。vue开发
2023-07-04

web开发者使用的工具有哪些

本文小编为大家详细介绍“web开发者使用的工具有哪些”,内容详细,步骤清晰,细节处理妥当,希望这篇“web开发者使用的工具有哪些”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。  一、Java 线上诊断工具 Art
2023-06-02

编程热搜

目录