文章目录

  • 一、Linux GCC常用命令
  • 二、GCC编译器背后的故事
  • 总结

一、Linux GCC常用命令

1 新建一个文件test,代码如下:

#include <stdio.h>int main(void) { printf("Hello World!\n"); return 0; }

直接编译指令如下:

 gcc test.c -o test

实际上编译过程有四个阶段,即预处理(也称预编译,Preprocessing)、编译 (Compilation)、汇编 (Assembly)和连接(Linking)。

2 编译过程
2.1 预处理

gcc -E test.c -o test.i 或 gcc -E test.c

gcc 的-E 选项,可以让编译器在预处理后停止,并输出预处理结果。

2.2 编译为汇编代码(Compilation)

gcc -S test.i -o test.s

gcc 的-S 选项,表示在程序编译期间,在生成汇编代码后,停止,-o 输出汇编代码文件。

2.3 汇编(Assembly)

gcc -c test.s -o test.o

gas 汇编器负责将test.s编译为目标文件。

2.4 连接(Linking)

gcc test.o -o test

gcc 连接器将程序的目标文件与所需的所有附加的目标文件(静态连接库和动态连接库)连接起来,最终生 成可执行文件。

2.5 执行命令

./test

显示如下:

3 多个程序文件的编译

3.1编译由test1.c 和 test2.c 两个源文件组成的程序

gcc test1.c test2.c -o test

3.2当需要处理多个文件,GCC 编译过程:预处理、编译和链接依次进行

gcc -c test1.c -o test1.o
gcc -c test2.c -o test2.o
gcc test1.o test2.o -o test

4 检错
4.1 -pedantic 编译选项

gcc -pedantic illcode.c -o illcode

-pedantic 选项无法发现全部错误,只能发现一些不符合 ANSI/ISO C 标准的代码。

4.2 Wall 编译选项

gcc -Wall illcode.c -o illcode

4.3-Werror 选项

gcc -Werror test.c -o test

GCC 会在所有产生警告的地方停止编译。

5 库文件连接
库文件包括头文件(.h)和库文件(so、或 lib、dll)等;位于/usr/lib/目录下。主要有两类,分别是是动态链接库(.so)和静态链接库(.a)。

5.1 编译成可执行文件

gcc –c –I /usr/dev/mysql/include test.c –o test.o

5.2 链接

gcc –L /usr/dev/mysql/lib –lmysqlclient test.o –o test

5.3 强制链接时使用静态链接库
-static 选项

gcc –L /usr/dev/mysql/lib –static –lmysqlclient test.o –o test

二、GCC编译器背后的故事

1.GCC的战友
1.1 Binutils是一组二进制程序处理工具,主要有:addr2line、ar、objcopy、objdump、as、ld、 ldd、readelf、 size 等;

(1) addr2line:帮助调试器在调试的过程中定位对应的源代码位置。
(2) as:用于汇编;
(3) ld:用于链接;
(4) ar:用于创建静态库。

1.2 C 运行库
(1)C 的语法;
(2)另一部分描述 C 标准库。

2.编译过程
2.1事先编译一个hello.c源程序,代码如下:

#include <stdio.h>
int main(void){ printf("Hello World! \n"); return 0; }

2.2预处理命令,生成hello.i文件

gcc -E hello.c -o hello.i

2.3编译命令,生成hello.s文件(此时已经为汇编代码)

gcc -S hello.i -o hello.s

2.4汇编命令,将编译生成的 hello.s 文件汇编生成目标文件 hello.o

gcc -c hello.s -o hello.o

或调用 as 进行汇编

as -c hello.s -o hello.o

此时hello.o 目标文件为 ELF(Executable and Linkable Format)格式的可重定向文件。

2.5链接,将目标文件 hello.o生成 ELF 格式可执行文件

$ gcc hello.c -o hello

此时为动态链接。

gcc -static hello.c -o hello

此时为静态链接。

ELF 文件格式包含
1 .text:已编译程序的指令代码段;
2 .rodata:ro 代表 read only,即只读数据(譬如常数 const);
3 .data:已初始化的 C 程序全局变量和静态局部变量;
4.bss:未初始化的 C 程序全局变量和静态局部变量;
5 .debug:调试符号表,调试器用此段的信息帮助调试。
可以使用如下代码查看汇编ELF各个部分:

readelf -S

可以使用如下代码查看反汇编ELF各个部分:

objdump -D

3.汇编语言格式(.asm)
由于在ubantu下的汇编代码是Intel风格的,此时可以用nasm汇编编译器编译生成执行程序。
3.1安装nasm汇编编辑器
输入如下命令

sudo apt install nasm


此时显示“E:无法定位软件包 nasm”,出现错误;
解决办法如下:
先断开网络重装ubantu(此处我用的是18.04版本的),注意此时不要直接安装下载软件库;
安装完成再连接网络,进入ubantu界面,打开终端命令行,输入如下代码,更新下载软件库;

 sudo apt-get update


此时显示,已经在安装数据包,等待几分钟后,再次输入nasm安装命令:

sudo apt install nasm


此时问题解决,nasm汇编编译器成功安装。
3.2写入hello.asm文件,具体代码如下:

; hello.asm
section .data            ; 数据段声明msg db "Hello, world!", 0xA     ; 要输出的字符串len equ $ - msg                 ; 字串长度
section .text            ; 代码段声明
global _start            ; 指定入口函数
_start:                  ; 在屏幕上显示一个字符串mov edx, len     ; 参数三:字符串长度mov ecx, msg     ; 参数二:要显示的字符串mov ebx, 1       ; 参数一:文件描述符(stdout) mov eax, 4       ; 系统调用号(sys_write) int 0x80         ; 调用内核功能; 退出程序mov ebx, 0       ; 参数一:退出代码mov eax, 1       ; 系统调用号(sys_exit) int 0x80         ; 调用内核功能

3.3由hello.asm生成可执行文件,输入如下命令

nasm -f elf64 hello.asm
ld -s -o hello hello.o
./hello


此时查看该可执行文件的大小:

GCC命令一步形成的可执行文件大小
由此可得,汇编形成可执行文件小的多。

总结

以上就是本文的全部内容,主要介绍了GCC的一些常用工具,命令,以及汇编语言在ubantu下的使用。

gcc编译工具常用命令以及汇编语言相关推荐

  1. Linux中GCC编译工具集中个软件的用途、gcc的简单编译以及ELF文件格式

    文章目录 一.gcc编译工具集中各软件的用途 1.1 GCC 1.2 Binutils 1.3 C运行库 二.简单编译 2.1 代码编译过程 2.2 多个程序文件的编译 2.3 检错 2.4 库文件连 ...

  2. GCC编译工具集和nasm编译器

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 一.gcc编译工具集 1.1gcc工具有哪些 1.2gcc编译过程 1.2.1.这里我们是使用一个hello.c文件进行演 ...

  3. SQLmap工具常用命令

    SQLmap工具常用命令 SQLmap是一款用来检测与利用SQL注入漏洞的免费开源工具.它有一个非常棒的特性,即对检测与利用进行自动化处理,如获取数据库指纹.访问底层文件系统.执行命令等等.

  4. Linux编程之GCC编译工具实战-夏曹俊-专题视频课程

    Linux编程之GCC编译工具实战-6075人已学习 课程介绍         本课程使得学员能够学会在linux中如何编译C/C++程序,使用GCC工具如何编译静态库,动态库,如何配置运行动态库. ...

  5. Ubuntu18.04系统下,gcc编译过程分析、命令参数介绍及ELF文件格式学习

    GCC编译器背后的故事及常用命令.了解ELF文件格式 文章目录 GCC编译器背后的故事及常用命令.了解ELF文件格式 前言 一.GCC简介 二.GCC背后的战友 1.Binutils 2.C运行库 三 ...

  6. Windows 系统中 CMD 工具常用命令

    目录 版本查看命令 Maven的常用命令 MySql 常用的命令 Redis 命令 String 数据类型 哈希 hash 数据类型 列表 list 数据类型 集合 set 数据类型 有序集合 sor ...

  7. GCC编译器的常用命令及使用

    一.用gcc生成静态库和动态库 (1)编辑生成子程序hello.h.hello.c.main.c (2)将hello.c编译成.o文件 (3)由.o文件创建静态库 (4)在程序中使用静态库 (5)由. ...

  8. git 工具常用命令汇总

    git是一个分布式版本控制工具,比svn要强大很多,适用于中大型的团队开发.svn比较适合中小型的团队开发.多个git版本一般用repo工具进行控制. 常用命令: 1. 仓库管理 git init  ...

  9. Linux下Vim工具常用命令

    原文地址: http://www.cnblogs.com/lizhenghn/p/3675011.html 在linux下做开发,甚至是只做管理维护工作,也少不了Vim的使用.作为一个新手,我也是刚刚 ...

最新文章

  1. uniapp设置模板路径页面样式混乱解决办法
  2. 第五章:面向对象(上)
  3. 这几个GraphPad Prism使用的小技巧让你绘图效率直接翻倍
  4. java final static_Java基础之final、static关键字
  5. 转:【HTTP】常见错误码说明
  6. python第三方库安装(复习)
  7. 上海淘财经网要道歉客户的信
  8. ubuntu 启动进入initramfs错误解决办法
  9. 用UCenter Home启动一个垂直的SNS社区
  10. 自测-2 素数对猜想
  11. 冒险岛无敌外挂代码诠释
  12. 在线电子词典程序框架
  13. 如何获取Windows 10的旧默认桌面背景
  14. 10min快速回顾C++语法(六)函数专题
  15. 04 vue3 scss 组件component kepp-alive缓存子组件 nextTick
  16. Spark的宽窄依赖
  17. manjaro 安装搜狗输入法不显示候选词
  18. 单片机音乐盒c语言,基于单片机的音乐盒设计与实现
  19. 自动化基本策略及成熟度定义
  20. 成都百知教育:Shopee虾皮 | 从开店到运营全流程

热门文章

  1. Linux基础 linux账号及权限管理
  2. matlab:图像处理
  3. C# WINFORM 主窗口把数据传给子窗口,编辑后再返回主窗口
  4. 大佬给总结的单片机看门狗详解很有用
  5. 禁用笔记本触摸板功能
  6. 使用华为云服务器搭建一个简单网站(内容全面)
  7. Linux脚本的制作命令
  8. nokia 1320升级到win10预览版
  9. android如何切换主题背景图片,安卓怎么更换主题 安卓手机更换壁纸与主题教程...
  10. 物流是如何用计算机管理的,计算机信息管理在物流业的应用