Linux复习-C程序编译工具
文章目录
- 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程序编译工具相关推荐
- 【Linux】GCC程序开发工具(上)
00. 目录 文章目录 00. 目录 01. GNU工具概述 02. 常用文本文件 03. 常用二进制文件 04. Binutils工具集 05. GCC工具 06. 附录 01. GNU工具概述 ...
- 【Linux】GCC程序开发工具(下)
00. 目录 文章目录 00. 目录 01. GCC的二进制工具 02. objdump 03. objcopy命令 04. 总结 05. 附录 01. GCC的二进制工具 objdump 显示目标文 ...
- 【Linux】GCC程序开发工具(中)
00. 目录 文章目录 00. 目录 01. GCC的二进制工具 02. ar命令 03. readelf命令 04. strings命令 05. nm命令 06. strip命令 07. 附录 01 ...
- Linux 环境编程 day01 Linux系统介绍、GNU编译工具、静态/共享库、环境变量表
Linux 环境编程 day01 Linux系统介绍.GNU编译工具.静态/动态库.环境变量表 学习Linux环境编程的原因 UNIX系统介绍 Linux系统介绍 GNU工程 POSIX标准 GNU通 ...
- linux嵌入式系统程序加密工具推荐:Virbox Protector.
linux嵌入式系统程序加密工具推荐:Virbox Protector. 软件开发商 Virbox Protector是由北京深思数盾科技股份有限公司研发,2018年上市的一款加密工具. ARM-Li ...
- Linux编程之GCC编译工具实战-夏曹俊-专题视频课程
Linux编程之GCC编译工具实战-6075人已学习 课程介绍 本课程使得学员能够学会在linux中如何编译C/C++程序,使用GCC工具如何编译静态库,动态库,如何配置运行动态库. ...
- Window/linux(Ubuntu)使用反编译工具jad
安装步骤 步骤: 1. 解压jad158e.linux.static.zip 到/home/XXXX/jad/ 下 2. net.sf.jadclipse_3.3.0.jar 此包copy 到ecli ...
- linux桌面应用程序开发工具,极简桌面工具(uTools For Linux)
uTools For Linux是一个极简.插件化.跨平台的现代桌面软件.通过自由选配丰富的插件,打造你得心应手的工具集合.当你熟悉它后,能够为你节约大量时间,让你可以更加专注地改变世界.uTools ...
- Linux 之八 完整嵌入式 Linux 环境、(交叉)编译工具链、CPU 体系架构、嵌入式系统构建工具
最近,工作重心要从裸机开发转移到嵌入式 Linux 系统开发,由于之前对嵌入式 Linux 环境并不是很了解,因此,第一步就是需要了解如何搭建一个完整的嵌入式 Linux 环境.现在将学习心得记录 ...
- Linux 之八 完整嵌入式 Linux 环境及构建工具、(交叉)编译工具链、CPU 体系架构
最近,工作重心要从裸机开发转移到嵌入式 Linux 系统开发,由于之前对嵌入式 Linux 环境并不是很了解,因此,第一步就是需要了解如何搭建一个完整的嵌入式 Linux 环境.现在将学习心得记录 ...
最新文章
- iOS架构设计-URL缓存(下)
- 干掉 Postman?测试接口直接生成API文档,这个文档工具真香!
- Eclipse ADT 21 Preview 10 发布
- SCIP习题 1.21(寻找最小因子)
- 程序员之工具杂烩(一)
- 使用 Docker 部署 Grafana + Prometheus 监控 MySQL 数据库
- 基于二进制粒子群算法的配电网故障诊断- 附代码
- django 引入同目录下py文件_第 05 篇:Django 的接客之道
- 用猿大师VLC播放程序与海康威视官方播放器在高版本Chrome播放RTSP视频流延迟效果对比!(视频演示)
- 结构光扫描仪(维基百科全翻译版)
- 为什么我的echarts字体样式这么丑?Echarts 柱状图、饼图 等标签、字体、样式调整
- bootstrap文档第一遍
- Summernote 上传图片至 SMMS 图床 Api
- oscp——five86-1
- sqlserver、mysql、oracle各自的默认端口号
- IoT 物联网碎片化是云厂商的桎梏,中小企业的机会
- 黑盒测试用例的设计与编写
- 腾讯T7手记:Android转场动画的前世今生!
- ChemDraw绘制苯甲酸钠的生成反应式的方法
- lcms质谱仪_LCMS-2020