文章目录

  • 1、gcc编译c程序
  • 2、gdb调试
  • 3、gcc补充

1、gcc编译c程序

-c:只生成目标文件,但不进行连接,用于对源文件分别进行编译。
-S:只进行编译,不进行汇编。
-o: 将输出文件存放在何处,默认为./a.out
-g:在编译c文件时加入供程序gdb调试的附加信息
-v:打印编译驱动版本号


需要执行main函数需要编译两个.c文件,再链接到一起执行。
操作如下

#编译
gcc -c mfile.c sq.c   #连接
gcc mfile.o sq.o -o Main#执行
./Main

2、gdb调试

c语言中出现的有编译错误,运行错误,逻辑错误三种,前两种可以通过最初的gcc命令就可以检测到。当出逻辑错误的时候,一种是直接查看源代码进行debug,或者通过gdb调试工具查看一些变量地址是否越界,变量内容是否正确等查找错误原因,当然,错误的类型千百万,具体怎样解决问题,还要具体情况具体分析。
具体案例,地址越界

demo.c文件代码

#include<stdio.h>
#include<stdlib.h>#define BIGNUM 20
void index_m(int ary[], float fary[]);int main()
{int intary[10];float fltary[10];index_m(intary,fltary);return 0;
}void index_m(int ary[], float fary[]){int i;float f = 3.14;for(int i = 0; i < BIGNUM; i++){ary[i] = i;fary[i] = i*f;}
}
gcc -g demo.c -o dbme./dbme
#报错
#*** stack smashing detected ***: terminated
#[1]    6119 abort (core dumped)  ./dbme

下面使用gdb工具对程序调试,通过观察源代码大概就知道是index_m函数中数组越界了,那么我们需要查看两个数组的内容和两个数组的地址。

gdb dbme

输入

list 1, 25

在第21行设置断点。

break 21


再次运行程序

r

再次运行程序,程序会在第21行停止下来,此时对数组ary,fary的操作已经完成了,我们来看一下两个数组的内容和地址信息。
打印ary数组首地址,ary[0], ary数组所有内容

首地址

(gdb) p ary
$1 = (int *) 0x7fffffffde20
(gdb) p &ary[0]
$2 = (int *) 0x7fffffffde20

ary[0]与ary所有内容

(gdb) p ary[0]
$4 = 0
(gdb) p ary[0]@20
$3 = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19}

查看ary[12]与fary[0]的的地址信息

(gdb) p &ary[12]
$5 = (int *) 0x7fffffffde50
(gdb) p &fary[0]
$6 = (float *) 0x7fffffffde50

这里发现ary[12]的地址与fary[0]的地址相重叠了,也就是说从ary[12]到ary[19]内容都将fary[0]到fary[8]的地址覆盖了。我们再查看fary的所有内容看看。

(gdb) p fary[0]@20
$7 = {1.68155816e-44, 1.821688e-44, 1.96181785e-44, 2.1019477e-44, 2.24207754e-44, 2.38220739e-44, 2.52233724e-44, 2.66246708e-44, 25.1200008, 28.2600002, 31.4000015, 34.5400009, 37.6800003, 40.8199997, 43.9600029, 47.1000023, 50.2400017, 53.3800011, 56.5200005, 59.6600037}

能够看到fary前8个内容是出现错误。说明在index_m函数中for循环的上界可能存在问题,20的确是超过了定义数组时10的上界。

3、gcc补充

分步骤编译c语言
g.c文件

#include<stdio.h>int main()
{printf("Hello World!");return 0;
}
  • 预处理
gcc -E g.c -o g.i
  • 编译
gcc -c g.i -o g.o
  • 链接
gcc g.o -o g

Linux复习-C程序编译工具相关推荐

  1. 【Linux】GCC程序开发工具(上)

    00. 目录 文章目录 00. 目录 01. GNU工具概述 02. 常用文本文件 03. 常用二进制文件 04. Binutils工具集 05. GCC工具 06. 附录 01. GNU工具概述 ​ ...

  2. 【Linux】GCC程序开发工具(下)

    00. 目录 文章目录 00. 目录 01. GCC的二进制工具 02. objdump 03. objcopy命令 04. 总结 05. 附录 01. GCC的二进制工具 objdump 显示目标文 ...

  3. 【Linux】GCC程序开发工具(中)

    00. 目录 文章目录 00. 目录 01. GCC的二进制工具 02. ar命令 03. readelf命令 04. strings命令 05. nm命令 06. strip命令 07. 附录 01 ...

  4. Linux 环境编程 day01 Linux系统介绍、GNU编译工具、静态/共享库、环境变量表

    Linux 环境编程 day01 Linux系统介绍.GNU编译工具.静态/动态库.环境变量表 学习Linux环境编程的原因 UNIX系统介绍 Linux系统介绍 GNU工程 POSIX标准 GNU通 ...

  5. linux嵌入式系统程序加密工具推荐:Virbox Protector.

    linux嵌入式系统程序加密工具推荐:Virbox Protector. 软件开发商 Virbox Protector是由北京深思数盾科技股份有限公司研发,2018年上市的一款加密工具. ARM-Li ...

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

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

  7. Window/linux(Ubuntu)使用反编译工具jad

    安装步骤 步骤: 1. 解压jad158e.linux.static.zip 到/home/XXXX/jad/ 下 2. net.sf.jadclipse_3.3.0.jar 此包copy 到ecli ...

  8. linux桌面应用程序开发工具,极简桌面工具(uTools For Linux)

    uTools For Linux是一个极简.插件化.跨平台的现代桌面软件.通过自由选配丰富的插件,打造你得心应手的工具集合.当你熟悉它后,能够为你节约大量时间,让你可以更加专注地改变世界.uTools ...

  9. Linux 之八 完整嵌入式 Linux 环境、(交叉)编译工具链、CPU 体系架构、嵌入式系统构建工具

      最近,工作重心要从裸机开发转移到嵌入式 Linux 系统开发,由于之前对嵌入式 Linux 环境并不是很了解,因此,第一步就是需要了解如何搭建一个完整的嵌入式 Linux 环境.现在将学习心得记录 ...

  10. Linux 之八 完整嵌入式 Linux 环境及构建工具、(交叉)编译工具链、CPU 体系架构

      最近,工作重心要从裸机开发转移到嵌入式 Linux 系统开发,由于之前对嵌入式 Linux 环境并不是很了解,因此,第一步就是需要了解如何搭建一个完整的嵌入式 Linux 环境.现在将学习心得记录 ...

最新文章

  1. iOS架构设计-URL缓存(下)
  2. 干掉 Postman?测试接口直接生成API文档,这个文档工具真香!
  3. Eclipse ADT 21 Preview 10 发布
  4. SCIP习题 1.21(寻找最小因子)
  5. 程序员之工具杂烩(一)
  6. 使用 Docker 部署 Grafana + Prometheus 监控 MySQL 数据库
  7. 基于二进制粒子群算法的配电网故障诊断- 附代码
  8. django 引入同目录下py文件_第 05 篇:Django 的接客之道
  9. 用猿大师VLC播放程序与海康威视官方播放器在高版本Chrome播放RTSP视频流延迟效果对比!(视频演示)
  10. 结构光扫描仪(维基百科全翻译版)
  11. 为什么我的echarts字体样式这么丑?Echarts 柱状图、饼图 等标签、字体、样式调整
  12. bootstrap文档第一遍
  13. Summernote 上传图片至 SMMS 图床 Api
  14. oscp——five86-1
  15. sqlserver、mysql、oracle各自的默认端口号
  16. IoT 物联网碎片化是云厂商的桎梏,中小企业的机会
  17. 黑盒测试用例的设计与编写
  18. 腾讯T7手记:Android转场动画的前世今生!
  19. ChemDraw绘制苯甲酸钠的生成反应式的方法
  20. lcms质谱仪_LCMS-2020

热门文章

  1. flask-restful 开发API
  2. 迭代求解最优化问题——步长确定
  3. WebSocket 测试
  4. STL之vector去重三步曲(利用unique函数)
  5. Android 5.0 屏幕录制/截屏
  6. 1196971406
  7. WIN2003 IIS6.0+PHP+ASP+MYSQL优化配置
  8. Java运行Shell脚本
  9. 网规:第2章 计算机网络规划与设计-2.8网络故障分析与处理
  10. BZOJ1079 [SCOI2008]着色方案 【dp记忆化搜索】