0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

单片机编程中的可执行文件链接

电子工程师 来源:单片机匠人 作者:黄忠老师 2021-08-13 15:02 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

在最开始人们编写程序时,都将所有的代码都写在同一个源文件中,经过长期的积累,程序可能包含了N多行的代码,程序员维护起来非常困难。迫切地希望将程序源代码分散到多个文件中,一个文件一个模块,能够更好地阅读和维护程序,这个时候,链接器就闪亮登场了。

我们知道,数据是保存在存储器中的,对于单片机来说,必须知道这些数据的地址才能使用。变量名、函数名等仅仅是地址的一种代名词儿,旨在编程时更加方便地使用数据,当源文件被编译成可执行文件后,这些标识符都不存在了,它们都被替换成了数据的地址。

任何程序的执行,最终都要依靠计算机硬件来完成,单片机是大规模集成电路,它只认识高低两个电平(电压),假设高电平为 3.3V,用1表示,低电平为 0V,用0表示。也就是说,在单片机底层,只有 0 和 1 两个二进制数字,这就是机器语言。

使用机器语言编程,十分繁琐又耗时,并且很容易出错。如果程序包含了多个源文件,就很可能会有跨文件的跳转、在程序拥有多个模块时会导致更加严重的问题。于是大神们发明了汇编语言,这相比机器语言来说是个很大的进步。汇编语言使用接近人类的各种标号来帮助记忆,比如用jmp表示跳转指令,用func表示一个子程序(C语言中的函数就是一个子程序)的起始地址,标号的方法使得人们从具体的机器指令和二进制地址中解放出来。标号这个概念随着汇编语言的普及被广泛接受,它用来表示一个地址,这个地址可能是一段子程序的起始地址,也可以是一个变量的地址。

随着软件规模的日渐庞大,代码量开始疯长,汇编语言的缺点逐渐暴露出来。汇编虽然提供了多种标号,但它依然非常接近计算机硬件,程序员要考虑很多细节问题和边界问题,而且不利于模块化开发,所以后来人们发明了C语言。C语言是比汇编更加高级的编程语言,极大地提高了开发效率,以加法为例,C语言只需要一条语句,汇编却需要四五条。

单片机编程中,程序员通过会把很多功能分散到成许多个模块中。这些模块之间相互依赖又相互独立,原则上每个模块都可以单独开发、编译、测试,改变一个模块中的代码不需要编译整个程序。在程序被分隔成多个模块后,需要解决的一个重要问题是如何将这些模块组合成一个单一的可执行程序。在C语言中,模块之间的依赖关系主要有两种:一种是模块间的函数调用,另外一种是模块间的变量访问。函数调用需要知道函数的首地址,变量访问需要知道变量的地址,所以这两种方式可以归结为一种,那就是模块间的符号引用。这种通过符号将多个模块拼接为一个独立的可执行程序的过程就叫做链接(Linking)。

在一个STM32项目中,代码被分为多个文件时,链接器可以链接ARM代码、Thumb代码、Thumb-2 代码,并自动生成交互操作中间代码,以便在需要时切换处理器状态。链接器还可以在需要时自动生成内联中间代码或长跳转中间代码,以扩展跳转指令的范围。

链接器还可以生成关于链接文件的调试和引用信息、生成静态调用图并列出堆栈的使用情况、控制输出映像中符号表的内容、显示输出中代码和数据的大小。链接器针对下一次文件编译提供反馈信息,提示编译器有关未使用函数的情况。可以根据提示在后续编译中将未使用的函数放置在各自的节中,以便链接器将来删除这些函数。

使用链接器构建可执行映像时,链接器将解析输入对象文件之间的符号引用,从库中提取对象模块来满足还未满足的符号引用的需要,根据属性和名称排序输入节,并将属性和名称相似的节合并为相邻块,删除未使用节,删除重复的公共组和公共代码、数据及调试节,根据提供的分组和布局信息将对象片段组织为内存区,给可重定位值分配地址,最终生成可执行映像。

责任编辑:haq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    6074

    文章

    45340

    浏览量

    663617
  • 计算机
    +关注

    关注

    19

    文章

    7764

    浏览量

    92688
  • 编程
    +关注

    关注

    90

    文章

    3708

    浏览量

    96765

原文标题:单片机生成可执行文件之链接

文章出处:【微信号:CanaanTech,微信公众号:嘉楠科技】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    单片机程序的执行

    更快的SRAM,以得到更快的执行速度。而对于,单片机而言工作频率也就几M,几十M,从Flash与从RAM读的差异可能并不明显,不会成为
    发表于 12-04 06:20

    为什么单片机还在用C语言编程

    的存储空间。前提是确保程序的规范性和完整性。 2.我们在进行单片机编程时,主要是通过对单片机的端口和内部寄存器的操作和配置,这个需要比较精确的时序控制。 3.在需要单片机
    发表于 11-28 07:37

    51单片机RS485编程实例资料

    详细介绍51单片机RS485通信接线和编程代码
    发表于 10-20 14:57 2次下载

    飞凌嵌入式ElfBoard-Vim编辑器之GCC的基本使用

    条件编译到文件;编译:将预处理的代码编译转换为汇编语言;汇编:将汇编语言翻译成二进制文件链接:将汇编出来的多个二进制目标文件和库
    发表于 10-16 09:05

    单片机怎么驱动电机?

    在各类自动化设备和智能装置,电机是重要的执行部件,而单片机作为控制核心,需要通过特定的方式驱动电机运转。单片机驱动电机并非直接连接即可,而是要根据电机类型和功率,搭配合适的驱动电路,
    的头像 发表于 07-25 09:31 439次阅读

    【Milk-V Duo S 开发板免费体验】移植lrzsz方便使用zmodem进行文件传输

    生成的可执行文件位于src下三. 测试导出文件到开发板scp src/lrz root@192.168.42.1:/root 需要输入密码milkv scp src/lsz
    发表于 07-08 15:01

    飞凌嵌入式ElfBoard ELF 1板卡-uboot编译原理介绍

    用编译工具将源码文件编译成可执行文件的过程并不是一步到位的,其中要经过一个类似工厂流水线的过程,交叉编译工具包含负责处理各个环节的功能工具,所以叫做交叉编译工具链。编译的一般过程分为:预编
    发表于 05-22 11:17

    如何在Visual Studio 2022运行FX3吞吐量基准测试工具?

    Visual Studio 2022 运行此工具的步骤吗? 此外,是否有我可能错过的可执行文件(例如在 GitHub 上)? 预先感谢您的帮助!
    发表于 05-13 08:05

    单片机c语言编程实例大全

    单片机c语言编程实例大全_18
    发表于 04-30 16:11 6次下载

    STM32F10xxx单片机编程手册

    电子发烧友网站提供《STM32F10xxx单片机编程手册.pdf》资料免费下载
    发表于 04-14 14:56 17次下载

    PADS导出.318文件遗漏器件

    使用PADS LAYOUT的CAM PLUS功能导出贴片可执行文件的时候会忽略这个器件的坐标,因为软件识别为NO SMD了,这怎么解决,我需要的是 YES SMND
    发表于 04-12 14:14

    创建OpenVINO™ Python脚本,运行可执行文件时遇到的报错怎么解决?

    ;Devices:\", ie.available_devices) 执行以下行以使用 PyInstaller 构建可执行文件: pyinstaller test.py --onefile 运行
    发表于 03-05 10:20

    NIRSCANEVM在dlp_nirscan下执行make命令时,产生了报错怎么解决?

    /example-applications下两个文件夹(dlp_nirscan和dlp_nirscan_demo)下面的程序,在dlp_nirscan_demo下执行make命令,顺利执行,产生了
    发表于 02-19 08:04

    怎么提升单片机代码执行效率

    ​ 提升单片机代码执行效率需要从多个方面入手,包括代码优化、硬件资源利用、编译器设置、中断处理优化以及其他技巧等。在实际应用,需要根据具体需求和硬件条件综合考虑这些因素,以实现最佳的性能表现。 ​
    的头像 发表于 01-10 11:06 941次阅读

    labview打包可执行文件后安装出错

    在 labview 写程序时使用到了ni-imaqdx模块,最终将其打包为可执行文件和安装包后,在其它电脑安装后会提示ni-imaqdx软件未激活,请问这是安装环境没有配置好吗?
    发表于 12-17 19:23