C语言与ELF机器语言之间的关系

C编译过程 以及 ELF文件(学习笔记) 学习C语言编译过程以及生成的ELF文件分析 阅读详情

C语言对机器模型的抽象层次,恰到好处。

C语言使得开发者,刚好从最底层的费力低效的汇编编程中解脱出来,而又没有进一步往上层做抽象。
这样一来既大大提高了开发效率,又不失对程序行为的精确控制能力,还使程序获得了良好的可移植性。可谓一举三得。

同时,基本C库的理念,也是只做确定正确的事。他所提供的,大体都是最小粒度的几乎不会有变数的基础例程。

不过,本文是要谈一谈C源码与ELF之间的一些联系。


C语言中的各种概念,最终都要转换成汇编层次的概念,进而变成实际可运行的机器码。
C语言中的运算符,编译时转换成运算指令,变量类型决定运算操作的数字宽度,引用结构体成员转换成相应的内存操作的偏移。
C代码经过编译,变量与函数,变成了汇编代码中的符号。
汇编代码再经汇编器变成目标文件,即elf文件(当然,可执行文件、动态库、内核模块,也是ELF文件)。

在elf这个层次,一个符号就相当于是给某个地址起了个名字。
不过,编译器编译C代码,生成的汇编代码中,为C中定义的符号,指定了type(并不是C语言中的类型,而是data or code)和size。
这就保存了更多的信息。这样一来,通过nm工具就可以查看符号的大小了。
但是,通过链接脚本中简单赋值创建的符号(例如,__bss_start = .;),并没有大小信息。

由于每一个C文件的编译是孤立的进行的,因此编译器遇到C代码中引用一个外部的变量或函数时,编译器就认为这是在引用一个外部符号。
编译器只是标识一下,这个外部符号的地址需要在链接时确定其实际的地址。
至于C代码中描述自己引用的是什么东东,编译器并不能判断是不是确实如此。因为编译器也不知道那个符号到底是什么样以及在哪里。
所以,对于外部的符号(不管是变量、函数,还是诸如__bss_start等系统符号),把他当成什么声明,怎么访问,完全是C代码说了算。
至于编译器,只能根据C代码声明的引用方式,生成对此符号地址的各种操作指令。


另外需要说明的是,当nm工具显示一个符号的类型为T时,只能说明符号所在section为code/text section,并不表示此符号一定位于名为.text的这个section。

同样,当nm显示一个符号的类型为D时,只能说明符号所在section为data section,并不表示此符号一定位于名为.data的这个section。

HEX文件结构解析与机器语言映射原理 HEX文件是嵌入式固件部署的核心文本格式,本质为带地址、类型和校验的十六进制数据封装,广泛用于STM32、ESP32、8051等MCU烧录。其设计兼顾人类可读性与工具可解析性,通过记录类型(如00数据记录、04扩展线性地址)实现跨架构兼容,支撑大容量Flash映射与Bootloader安全升级。校验和机制保障单行数据完整性,是工业现场鲁棒性的基础防线。理解HEX与机器语言的映射关系,不仅关乎固件调试与OTA实现,更是进行反汇编分析、热修复及安全审计的技术前提。 阅读详情

相关推荐

二进制AI与软件安全:揭秘机器语言大模型在漏洞分析中的突破

本文探讨了二进制AI在软件安全领域的革命性应用,特别是机器语言大模型(MLM)如何通过语义理解和动态分析技术,显著提升漏洞检测与恶意代码分析的效率。文章揭示了MLM在跨架构泛化、语义补全等关键技术的突破,并通过实战案例展示其相比传统方法的巨大优势,为二进制安全分析开辟了新范式。

g2h3i4j5的博客 388

elf文件反编译C语言,如何将ELF可执行文件转换为C代码?生成的C代码不需要是人类可读的...

我有一个ELF文件,我想反编译成C代码,并对生成的C代码进行简单的更改,并将其重建为ELF.反编译的C代码不需要完全是人类可读的.例如,如果变量和函数名称被混淆,那就没关系.我可以使用哪些工具在Linux上完成此操作?PS:如果反编译为C不可能或不容易,我愿意考虑反编译为汇编语言,虽然调整汇编源对我来说非常困难.更新:您可以假设我正在使用以下C程序来获取我的a.out ELF.现在,进一步假设我已...

weixin_39526564的博客 2188

Android逆向工程-基础概念:Arm、Art、Dalvik、Smali、dex、NDK、JNI之间的关系

Android逆向工程-基础概念:Arm、Art、Dalvik、Smali、dex、NDK、JNI之间的关系 接触逆向以来遇到过Smali、dex几个概念,接触脱壳的时候又遇到ART、Dalvik、的概念,.so文件逆向的时候接触到Arm汇编、NDK、JNI的概念,今天简单梳理下这几者的关系。 一、Dalvik虚拟机 安卓(Android)是google收购的...

siphre 1556

c编译程序是一组机器语言指令,C语言、汇编语言、机器指令、CPU之间是怎么联系起来的?...

http://toutiao.com/group/6821726284553388296/?iid=0&app=news_articleCPU的全称是中央处理单元,是计算机进行运算的核心,根据使用的技术不同,CPU又分为X86,X64,ARM、DSP、单片机等不同的体系结构。在每种CPU上都有一套特定的指令集,这就是人们常说的机器指令,直接使用机器指令编写的程序就是机器语言程序。理论上来说...

weixin_35626077的博客 1542

机器指令与高级语言的对应关系

问题回答GCC如何生成汇编?gcc -S命令如何查看机器码?objdump -d反汇编目标文件机器码从哪来?汇编器(assembler)将汇编指令翻译成二进制编码为什么机器码不完全一样?寄存器分配、优化、语法差异会影响具体编码CPU怎么执行?从内存读取这些字节,控制单元解码后触发ALU执行相应操作。

老韩的Linux云计算架构师进阶之路 534

第 1 章 编译基础:从高级语言到机器码-机器指令与高级语言的对应关系

抽象层级:高级语言 → 汇编语言 → 机器语言 → 微指令 → 硬件电路编译过程:预处理 → 编译 → 汇编 → 链接优化目标:在程序语义不变的前提下,提高执行效率。

老韩的Linux云计算架构师进阶之路 507

c语言 机器语言,C语言与ELF机器语言之间的关系

在elf这个层次,一个符号就相当于是给某个地址起了个名字。这里没有数据类型信息,也没有大小。但程序员一定知道这地方的数据是怎么组织的,有多大。 对于C语言而言,有static变量/函数,全局变量/函数。这些东西,编译时都是要生成elf符号的,即为这些元素的起始地址起了名字。C语言中,对这些东西的引用,在构建出可执行程序后,就变成了对这些符号的对应地址的操作。至于用何种指令操作,则由C编译器,根据代...

weixin_30458701的博客 302

Linux进程内存布局与ELF文件解析

进程是操作系统资源分配的基本单位,其核心在于内存管理与执行环境构建。ELF(Executable Linkable Format)作为Linux标准可执行文件格式,通过文本段、数据段等结构化存储实现高效加载。现代操作系统采用虚拟内存技术,将进程地址空间划分为栈、堆等逻辑区域,分别处理函数调用和动态内存分配。通过/proc文件系统可实时监控进程状态和资源使用情况,这种机制在性能调优和系统监控中具有重要价值。本文以x86架构为例,详细解析了Linux进程从ELF加载到内存布局的全过程,并演示了通过命令行工具分析

weixin_42234168的博客 464

【Android 逆向】使用 Python 解析 ELF 文件 ( Capstone 反汇编 ELF 文件中的机器码数据 | 完整代码示例 ) ★★★

使用 Python 解析 ELF 文件完整代码示例

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) 3217

第2章 C语言系列-从晶体管到程序:计算机执行模型

应用程序] ← Python / Java / Web App↓[高级语言程序] ← C/C++/Go 源码↓[汇编语言] ← mov, add, jmp ...↓[机器指令] ← 二进制编码(0101...)↓[数字逻辑电路] ← 寄存器、ALU、控制器↓[逻辑门电路] ← AND, OR, NOT, XOR↓[晶体管] ← MOSFET 开关,控制电流↓[硅基材料] ← 半导体物理实现每一层都建立在下一层之上,形成强大的协同效应 —— 我们可以用几行代码完成极其复杂的任务。

老韩的Linux云计算架构师进阶之路 564

elf解析工具及源代码

压缩包中parseElf.exe可读取节表、程序表、文件头、动态符号及相应的函数体机器码。如果没问题,欢迎批评指正,谢谢!

C程序编译过程与ELF可执行文件及gcc常见编译选项

预处理:参数“-E”编译:参数"-S"汇编:参数"-c";

顺顺崽的博客 2005

IMDb影评数据集:从下载到情感分析实战指南

本文提供了IMDb影评数据集从下载、探索到情感分析建模的完整实战指南。详细介绍了数据预处理、TF-IDF向量化方法,并对比了逻辑回归、随机森林、SVM及LSTM深度学习模型在情感分析任务上的应用与效果评估,帮助读者系统掌握自然语言处理的核心流程。

weixin_29052717的博客 450

C语言基本常识

C语言基本常识 1.为什么说计算机是“二傻子”? 答:因为计算机的“大脑”是 CPU,CPU 负责计算机大部分日常的计算功能,而 CPU 原理上只认识 0 和 1。 简而言之,CPU 是由晶体管组合而成的,晶体管就是微型电子开关,它们是构建CPU的基石,你可以把一个晶体管当作一个电灯开关,它们有个操作位,分别代表两种状态:ON(开)和 OFF(关)。这一开一关就相当于晶体管的连通与断开,而这两种状态正好与二进制中的基础状态 0 和 1 相对应!但计算机是由电驱动,而 CPU 内部又有几亿到十几亿个晶体管,因

qq_48374573的博客 927

LaTeX参考文献格式apsrev4-1,增加文献标题

APS的LaTeX参考文献格式apsrev4-1是隐藏标题的,如果想要出现标题,需要更改apsrev4-1.bst文件内容 在apsrev4-1.bst文件靠后部分,定义不同类型文献格式的地方,将article类型的内容替换为, FUNCTION {article} { output.bibitem format.authors booktitle empty$ { "author" output.check }{ output } if$ author format.

loading1234567的博客 5032

H.264 Profile与Level详解:如何为不同应用场景选择合适的编码配置

本文深入解析了H.264编码标准中的Profile与Level概念,指导开发者如何为不同应用场景选择合适的配置。文章对比了Baseline、Main和High三大Profile的特性与适用场景,并解释了Level如何限定视频的分辨率、帧率与码率上限。通过实战指南,帮助读者在视频通话、在线点播和专业制作等场景中,平衡画质、兼容性与性能,实现高效编码。

rgv2345678的博客 239

关于底层开发中的ELF文件解析器实现读取segment和section的映射关系

linux下的c语言或c++编程涉及底层开发的内容首先,segment是section的集合,一个segment可以映射到section。ELF文件解析是机器语言。程序的实现过程包括,程序编译、链接、装载、运行。ARM的可执行文件格式是ELF文件解析格式...

github_38595636的博客 1238

告别CANoe?手把手教你用Python+PCAN搭建汽车诊断脚本(附完整代码)

本文详细介绍了如何利用Python和PCAN硬件搭建高性价比的汽车诊断自动化方案,替代昂贵的CANoe工具。通过开源库python-can和udsoncan实现UDS诊断协议,涵盖硬件选择、环境配置、核心功能实现及性能优化,附完整代码示例,助力开发者快速构建诊断脚本。

weixin_42551227的博客 373

进程、CPU、MMU与PCB之间的关系

进程、CPU、MMU与PCB之间的关系

hutaotaotao的博客 1951

微软推出突破性AI医疗诊断系统MAI-DxO:诊断准确率85.5%,是医生的4倍,成本更低

微软推出医疗AI系统MAI-DxO,通过多AI模型协作实现高效诊断,准确率达85.5%,是传统医生团队的4倍。该系统整合自然语言处理、计算机视觉等技术,模拟专家会诊流程,显著降低医疗成本60%。具备罕见病识别、基层医疗支持等功能,同时注重伦理安全和可解释性。微软计划开放部分架构,推动医疗AI普惠化。这一突破标志着医疗AI从单点工具向系统级智能的跨越,有望重塑更精准、高效的智能医疗未来。

这里汇聚了前沿的技术分享与实用的开发技巧,带你探索从创意到企业的技术创业之路。 638

DSP篇--C6678功能调试系列之EDMA3调试

EDMA主要用于数据的搬运,发送、接收,其搬运数据的形式有;AB模式,ABC模式以及ping-pong模式。 EDMA3分初始化、参数配置、以及中断配置。其中中断配置则需要注意的内容主要有:挂载的TC通道,对应的触发事件,以及中断的使能。

nanke_yh的博客 1720

机器语言、汇编语言与高级语言:从源码到CPU的三层翻译

程序从源代码到CPU执行,核心是机器语言、汇编语言与高级语言之间严格对应的翻译链路。机器语言由操作码、操作数和寻址方式组成,是CPU唯一识别的字节序列;汇编语言以助记符与机器指令一对一映射,保留寄存器、栈帧和调用约定等底层控制;高级语言则通过编译器完成指令选择、寄存器分配、指令调度与内联优化,把复杂度打包给开发者。理解三层关系,能在崩溃栈分析、反汇编定位、性能剖析、跨平台字节序处理和链接期符号解析等工程场景中快速判断问题所在。抽象会泄漏,但底层知识让调试与优化有据可依,也构成从源码到硅片翻译链路的实践基础。

weixin_33462167的博客 140

人形机器人开源资源大盘点(四):硬件开源平台

开源人形机器人平台推动技术民主化 本期聚焦四大开源人形机器人平台:斯坦福的ToddlerBot以6000美元低成本实现30自由度运动,支持仿真到现实的零样本迁移;法国Reachy2被HuggingFace收购,融合开源AI与硬件,适配医疗、工业等场景;国内OriginMan基于ROS2全开源,集成大模型能力,支持深度改造;OAN框架则为经典NAO机器人注入开源活力,扩展交互功能。这些平台通过不同路径降低研发门槛,推动人形机器人技术走向开放共享的未来。

Studying…… 370

1.初学C语言(day1)

一、初学C语言 (1)C语言与汇编语言的关系? 程序员编写的C语言代码,首先要经过C语言编译器,生成汇编代码,这个过程称为编译阶断,当C语言编译器生成汇编代码后,再调用汇编器来将汇编代码编译成汇编指令。 这是一种站在巨人肩人的作法,最早的C++编程语言也是这样的实现方法,只不过那时候叫Cfront程序,Cfront程序的作用是将C++代码转换成C语言代码,类似于一个文本处理器,然后再调用C语言编译...

qq_43636258的博客 305

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

C代码变成可执行文件的过程

C代码是如何变成程序的 C语言是一门典型的编译语言,源代码文件需要编译成目标代码文件才能运行。可以认为程序文件就是编译好的目标代码文件。以GCC的编译过程为例。GCC的翻译过程可以分成四个阶段:预处理器、编译器、汇编器、链接器,执行这四个阶段的程序一起构成了一个编译系统。 预处理器 预处理器(cpp)负责对源代码进行文本处理。它根据以字符#开头的命令,修改原始的C代码。如: 1. #i...

方大锤 1万+

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

上一篇: Linux下进程的退出
下一篇: 利用libbfd获取elf可执行文件的section(节)及symbol(符号)信息
无忧老猪
博客等级 码龄18年 200粉丝 112原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值