Linux系统编程01

news2024/11/23 11:12:19

C语言程序编译过程

多个源文件生成一个可执行文件的过程
预处理阶段主要是将带 # 号的类似于 #include #define #ifdef等进行处理替换
在这里插入图片描述

gcc -S

下面讲解C语言源代码编译成汇编语言之后,之间的对应情况
源代码
在这里插入图片描述
使用gcc -S test15.c -o test15.s指令让源代码进行编译
其中gcc -S是表示生成汇编代码文件 -o test5.s是指定生成的汇编文件的文件名
main函数
在这里插入图片描述
func函数
在这里插入图片描述
总结:
(1)调用一个函数首先是要使用 push 然后 pop ,调用一个函数是用call,调用完之后要用ret,拷贝命令是mov, 加的命令是add ,减的命令是sub, lea是取地址,xor异或,关于跳转的 jmp , je, jlem,每个汇编指令都会有一个后缀,q(8字节)或者 l(4字节)
(2)所有变量,所有数组元素,*p在汇编语言中都是一样的,都是变成地址 + 长度
(3)循环 for , while , 和goto 本质是一样的
(4)函数调用,每个函数的栈帧都是独立的,传递参数值传递

汇编(assembler)

.s的汇编文件生成目标文件
as test.s -o test.o
这条指令就可以帮我们将汇编文件生成目标文件,但是此时的目标文件还不能执行,还需要经过链接
然后可以通过nm指令查看是否有未连接的函数
nm test.o
在这里插入图片描述
我们可以看到途中红点标注的显示U的函数表示我们还不知道其地址是多少,所以如果直接运行的话就会找不到这些函数,所以就不能直接运行
gcc -c test.c -o test.o指令可以直接从
*.c文件直接生成*.o文件
汇编命令可以用objdump -d test.o命令执行反编译,直接将汇编文件转为*.c文件

链接所做的事情,把调用函数的名字转换成地址
可以使用 ld命令进行链接,但是我们一般不会直接使用ld命令进行连接,因为我们使用ld命令进行连接二进制的文件,可能里面又会调用其它的文件,这样给我们进行连接就提高难度,因此一般都是用gcc命令去间接调用
在这里插入图片描述

函数/全局变量 定义0次或者超过2次会报链接错误
缺了main函数也会报链接错误
如果编译器提示第几行出错,那就是编译错误
如果编译器找不到第几行出错,那就是链接错误
报错信息里面出现ld时也是链接错误

执行可执行程序
执行可执行程序一定要加 ./ 这是为了避免和内置命令发生冲突

库文件
库文件(*.o-->*.a/*.so)也被称为轮子,公用工具;其本质就是特殊的*.o文件,他人写好的公开发行的

静态库和动态库
轮子打包到产品中,静态库
轮子在运行时加入到产品中,动态库
特点:静态路的大小更大,动态库更小;部署难度,静态库容易,动态库难;升级静态库难,动态库容易

生成静态库
在这里插入图片描述
在这里插入图片描述
我们这样单独运行某个文件都是不能成功运行的,但是我们将两个文件在一进行编译就可以成功运行
在这里插入图片描述

生成静态库的第一个不步骤
(1)生成目标文件
gcc -c test16_add.c -o test16_add.o
test16_add.c方法源文件
(2)打包成静态 库文件
ar crsv myAdd.a test16_add.o
myAdd.a库名字
(3)移动到系统搜索目录下 /usr/lib
sudo cp myAdd.a /usr/lib
(4)链接的时候加上 -lmyAdd
如果不加 -l 那么是默认链接目标文件,如果有了-l会链接我们的库文件
在这里插入图片描述

动态库进行链接

生成动态库

(1)编译成目标文件
动态库是加载在栈和堆中件的共享库映射区
生成的地址都是相对地址 ---->生成的代买为位置无关代码
gcc -c test16_add.c -o add.o -fpic在编译的时候加上-fpic就可以实现动态链接
(2)打包,生成动态库文件
gcc -shared add.o -o libadd.so
在这里插入图片描述
(3)移动到系统库目录
sudo cp myAdd.so /usr/lib
(4)链接加上 -myAdd
gcc test.o -o test -myAdd
在这里插入图片描述
(5)编译之后可以通过ldd test查看动态链接库信息
在这里插入图片描述

动态库的运行会受到系统库的影响
如果我们将打包好放在系统目录里面的动态库删除,在重新更改动态库源文件,在进动态库生成,在放入系统目录,只要我们动态库的名字不变,我们直接运行程序的目标文件也可以成功运行,并且运行结果会按照更新的动态库运行

软链接 符号链接

当我们进行动态库更新时,往往会出现我们在更新完动态库之后,程序整体运行会出BUG,这时候我们希望程序能够进行回滚,回到之前没有出BUG的动态库版本,但是我们链接的动态库名称都是一样的,如果我们给新的动态库使用新的名称然后重新链接这样会很麻烦,那么我们可以怎么做呢
使用软链接可以完美解决这个问题,一般我们在更新动态库的时候我们都会在动态库*.so文件末尾加上更新的版本号,这时我们可以将系统库中 myAdd文件用软链接的方式链接到新导入的动态库上,如果出现BUG,我们只需要修改myAdd文件的软链接指向,便能成功切换回原动态库

(1)将刚刚创建的动态库重新改名为其动态库名+版本号,此时在运行程序,程序找不到库
在这里插入图片描述
(2)通过软链接指令将刚刚改名的动态库链接到 libadd.so文件
sudo ln s libadd.so.0.1 libadd.so
在这里插入图片描述
在这里插入图片描述
这是在运行原目标文件又可以正常运行
在这里插入图片描述
(3)修改动态库源文件,重新生成动态库,将动态库命名为动态库名称+版本号,将动态库移动到系统库,删除原先的动态库 libadd.so的软链接 ,重新建立新链接指向新的动态库
在这里插入图片描述
(4)重新运行目标文件,目标文件按照更新的动态库执行结果返回
在这里插入图片描述
如果我们需要回滚,回到之前的动态库,那么在进行重新软链接就可以实现回滚

gcc的其它选项

-D在源文件中添加宏定义
gcc test.c -D DEBUG 添加#define DEBUG
-I增加头文件搜索目录
gcc src/test.c I include/test.c源文件搜索头文件不仅仅是在当前目录下进行搜索,还会在include目录下进行搜索
-O编译优化
是由编译器作者实现的,这个指令会更具一定能的规则区修改指令执行的顺序和内存的位置
(1)结果不会变
(2)指令数量变少,执行速度变快
(3)但是会影响程序员进行调试,因为代码顺序会改变,因此调试就不会按照我们想象的步骤执行,因此给调试增加了难度
优化指令分0,1,2,3级,0一般就是不优化,1一般是普通产品进行优化,2一般是开源项目优化,3更深的优化
优化越大,C与汇编的对应就乱了

GDB

可以启动程序打断点进行单步调试,除了可以单步调试,如果当程序执行时报错,还会返回类似于黑匣子的记录信息,可以让我们更好的定位错误
GDB原理:
(1)不要开代码优化 -O 0就是不开优化
(2)补充调试信息添加 -g
gcc -c test.c -o test.o -o0 -g
gcc test.o -o test
或者一步到位gcc test.c -o test -o0 -g
(3)gdb test调试程序

GDB命令

list / l [文件名:][行号][函数] 默认每次展示10行代码,也可以直接用 l 代替 list
run / r 运行程序
break / b [行号][函数] 打断点
continue /c 继续运行,运行至下一个断点位置
step / s 单步调试,系统调用函数例如printf也会跳进函数一步一步执行,VS的F11
next / n 单步调试,不会跳进系统调用函数VS的F10
finish 跳出本次函数调用
info break / ib 查看断点信息
delete [编号] 删除断点
delete 删除所有断点 (不加参数删除所有,记得再输一个Y)
ignore [num] [count] 忽略num断点count次(对于循环有效)
print / p 表达式 可以查看数据,或者地址等信息
display 表达式 可以自动监视某个值或者表达式的结果,不用手动进行输出
info desplay 查看监视信息
undisplay 编号 删除指定编号的display
在gdb中查看内存
在这里插入图片描述
x/3tw arr
查看arr数组 查看3个单位,以字节形式查看 每次查看4字节
在这里插入图片描述

检查奔溃的程序

”黑匣子“ ----->core文件(记录程序奔溃时刻内存的堆栈情况)
(1)编译加上 -g -o0
gcc
在这里插入图片描述
报错出现段错误,并且告诉我们core文件已经保存
但是当我们查看文件内目录发现没有发现相应的core文件,这是因为系统会默认限制core文件的大小

我们可以看到系统将core的文件限制改为0,同时在这个文件中我们也可以看到其他文件的文件大小限制
在这里插入图片描述
ulimit -c unlimited执行指令将core文件大小限制改为无限大,这样的设置只能影响到当前终端,下次启动又会变成0
更改限制大小之后一般再进行编译一般都是可以看到core文件,如果看不到core文件执行一下操作
更改限制还看不到core文件操作:
进入root账户向文件/proc/sys/kernel/core_pattern中添加core
退出root账户,并且查看系统对core文件的限制
然后在运行
在这里插入图片描述
此刻就可容易看到core文件
在这里插入图片描述
gdb test17 core查看core文件
在这里插入图片描述
在gdb中bt指令查看堆栈情况(以上错误空指针错误)

命令行参数(传递给main函数的参数)

在这里插入图片描述
没有参数只有main函数本身
在这里插入图片描述
有参数传递
在这里插入图片描述

gdb添加命令行参数

在这里插入图片描述

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

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

相关文章

Adaptive AUTOSAR CM模块介绍(五)

Proxy Class API’s proxy class类提供类(静态)方法来FindService() 实例,服务是动态的,因此,AUTOSAR提供了两个方法来提供发现服务。 StartFindService():是一个类方法,它在后台启动一个周期性的“FindS…

联想电脑的Microsoft Edge启动总是百度页面的修改方法

前言 拿到联想电脑,打开浏览器的搜索引擎默认是百度,在浏览器中的设置总是更改不了。这是因为联想管家启动浏览器保护,我们是无法更改的,除非在联想管家中更改启动页的打开网址。操作流程往下看。 操作 🎈打开联想管…

苹果放出快捷指令专题介绍页面,大大提高了 Mac 使用效率

近日,苹果发布 macOS Sonoma 更新的同时,还上线了“《快捷指令》助你效率倍增”专题页面,其目标是在 Mac 上让好用的 App 更强大。 快捷指令功能可以让设备自动完成常用或繁琐的操作,大大提升 Mac 的效率。 快捷指令能帮你在《邮…

4.Python-用Python,Ajax实现MySQL数据库的新增数据

题记 用python,ajax实现mysql数据库的新增数据。以下是一个简单的实例和操作过程。 安装flask模块 pip install flask 安装mysql.connector模块 pip install mysql-connector-python 编写app.py文件 app.py文件如下: 块引用可能显示不完整&#x…

为什么Excel插入图片不显示,点击能够显示

今天在做Excel表格时,发现上传图片后不能显示,但是点击还是能够出现图片的 点击如下 点击能看到,但是不显示?那么只需鼠标右键点击浮动即可显示

fastjson 1.2.24 反序列化导致任意命令执行漏洞

fastjson 1.2.24 反序列化导致任意命令执行漏洞 文章目录 fastjson 1.2.24 反序列化导致任意命令执行漏洞1 在线漏洞解读:2 环境搭建2.1 启动:2.2 已启动:访问端口8090 3 影响版本:4 漏洞复现4.1 访问页面4.2 bp抓包,修改参数4.2.…

每日一题 136. 只出现一次的数字(简单,位运算)

异或运算性质,两个相等的数作异或运算得零,任何数与零作异或运算保持不变 所以整个数组的异或和就是答案 class Solution:def singleNumber(self, nums: List[int]) -> int:ans 0for i in nums:ans ^ ireturn ans一行代码,reduce作累积操…

「AI反诈与智能风控」闭门研讨会报名丨青源Workshop第26期

青源Workshop丨No.26 AI反诈与智能风控:信息安全的矛与盾 AI红利接踵而至,安全风险如影随形。过去几年,人工智能技术的迅速发展催生了包括金融、电子商务、社交网络、医疗保健等众多应用场景。AI应用落地带来新安全风险,安全防护难…

Netty源码编译

Netty源码编译 想了解Netty源码,最好先从 netty-example 开始,多跑几个 example,了解Netty的实际应用。 编译 netty-example 会出现很多乱七八糟的问题,根本原因是因为缺少 io.netty.util.collection 包。 解决方法 1.先 instal…

渗透测试漏洞挖掘技巧

文章目录 一、使用.json进行敏感数据泄漏二、如何查找身份验证绕过漏洞三、在Drupal上找到隐藏的页面四、遗忘的数据库备份五、电子邮件地址payloads六、HTTP主机头:localhost七、通过篡改URI访问管理面板八、通过URL编码空格访问管理面板九、篡改URI绕过403十、Byp…

C# OpenVINO Cls 图像分类

效果 耗时 class idbrown_bear, score0.86 preprocess time: 0.00ms infer time: 2.72ms postprocess time: 0.02ms Total time: 2.74ms项目 代码 using OpenCvSharp; using Sdcb.OpenVINO; using Sdcb.OpenVINO.Natives; using System; using System.Diagnostics; using Sys…

忘记开机密码啦!我教你用ventoy找回密码

文章目录 一、前言二、实战过程三、动态演示四、原理解析五、总结 一、前言 当你有一天突然忘记了开机密码怎么办?又要上电脑店花个几十块让人弄?在上一章《你该自己学学安装操作系统了,小白一学就会(ventoy装系统超详细&#xff…

舍弃Java模式,从头开始,用Rust书写编程的未来

沉迷于Rust之美:类型安全、内存安全、注重正确性,这叫人如何不爱呢? 在开发Apollo(一款Python应用)时,遇到了许多错误。如果我使用Rust,大多数错误都能被编译器捕获(虽然无法做到百…

ubuntu联网图标消失

sudo service NetworkManager stopsudo rm /var/lib/NetworkManager/NetworkManager.statesudo service NetworkManager start执行 sudo rm /var/lib/NetworkManager/NetworkManager.state 命令将删除位于 /var/lib/NetworkManager 目录下的 NetworkManager.state 文件。

(C语言进阶)笔试题详解

一.要点回顾 1.一维整形数组 (1)sizeof()对一维整形数组的应用 #include<stdio.h> int main() {int a[] {1,2,3,4};printf("%d\n", sizeof(a));//16 //sizeof(数组名),数组名表示整个数组&#xff0c;计算的是整个数组的大小&#xff0c;单位是字节printf…

微信小程序备案流程操作详解

1、2023年9月1号小程序开始必须备案了,各位小程序商城只需要按流程自主去微信小程序后台操作即可; 2、对未上架的微信小程序,从2023年9月1号开始需先备案才能上架; 3、对存量已上架的小程序,需在2024年3月31号前完成备案即可。逾期未完成备案,平台将按照备案相关规定于…

英语学习工具推荐

无论您是初学者还是想要巩固英语能力的学习者&#xff0c;我们都为您提供了一个高效而便捷的英语学习工具。 英语复读机&#xff0c;您可以随时输入您想要复读的英语单词、句子或者文章。我们的复读机会循环播放您输入的内容&#xff0c;帮助您加深记忆、提高听力和口语表达能力…

相似性搜索:第 2 部分:产品量化

系列文章前篇&#xff1a;相似性搜索&#xff1a;第 1 部分- kNN 和倒置文件索引_无水先生的博客-CSDN博客 SImilarity 搜索是一个问题&#xff0c;给定一个查询的目标是在所有数据库文档中找到与其最相似的文档。 一、介绍 在数据科学中&#xff0c;相似性搜索经常出现在NLP领…

模式匹配(数据结构)

朴素模式匹配算法 #include <stdlib.h> #include <iostream> #include <stdio.h> #define MaxSize 255typedef struct{char ch[MaxSize];int length; }SString;//初始化 SString InitStr(SString &S){S.length0;return S; } //给串赋值 SString SetStr…

【计算机毕设选题推荐】产品管理系统SpringBoot+SSM+Vue

前言&#xff1a;我是IT源码社&#xff0c;从事计算机开发行业数年&#xff0c;专注Java领域&#xff0c;专业提供程序设计开发、源码分享、技术指导讲解、定制和毕业设计服务 项目名 基于SpringBoot和SSM的产品管理系统 技术栈 SpringBootSSMVueMySQLMaven 文章目录 一、产品…