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

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

    关注

    6030

    文章

    44504

    浏览量

    632314
  • 计算机
    +关注

    关注

    19

    文章

    7389

    浏览量

    87662
  • 编程
    +关注

    关注

    88

    文章

    3578

    浏览量

    93546

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

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

收藏 人收藏

    评论

    相关推荐

    C语言生成可执行二进制文件的具体过程

    C语言源码到生成可执行文件的过程通常包括预处理(Preprocessing)、编译(Compilation)、汇编(Assembly)、链接(Linking)等多个步骤,每个步骤都有其特定的任务
    的头像 发表于 10-21 14:30 322次阅读
    C语言生成<b class='flag-5'>可执行</b>二进制<b class='flag-5'>文件</b>的具体过程

    labview怎么生成可执行文件

    生成可执行文件(EXE)是LabVIEW程序开发的一个重要步骤,它允许用户将LabVIEW项目打包成一个独立的应用程序,便于在没有安装LabVIEW的计算机上运行。 1. 准备工作 在开始生成
    的头像 发表于 09-04 17:07 718次阅读

    labview生成可执行程序后vi都在同一路径下吗

    在LabVIEW,当您生成可执行程序(exe文件)后,VI(虚拟仪器)并不直接以文件的形式存在于可执行文件的同一物理路径下。实际上,Lab
    的头像 发表于 09-04 17:06 465次阅读

    嵌入式学习-常用编辑器之GCC编译器

    、GCC编译过程GCC编译器的编译过程要经过预处理,编译,汇编,链接等4步才能够生成可执行文件。预处理:主要实现将头文件展开,宏定义替换以及解析条件编译到文件
    发表于 08-27 10:17

    国产芯上运行TinyMaxi轻量级的神经网络推理库-米尔基于芯驰D9国产商显板

    cmake生成构建系统 使用make构建可执行文件然后运行 可以看到输出信息 MNIST 示例默认未使用任何指令加速,运行了一张 28×28 的手写数字模拟图像,共消耗了 0.114 毫秒 MBNET示例
    发表于 08-09 18:26

    430单片机代码debug后无法生成可执行文件

    软件是用许可证注册过的,代码是正确的,但是点完右上角那个build键后,消息框说生成不了可执行文件,如图
    发表于 07-15 09:28

    鸿蒙OpenHarmony【小型系统 实战应用】(基于Hi3516开发板)

    系统启动成功后,取源码out目录下的helloworld可执行文件放入系统的bin目录,通过以下步骤运行“Hello World”。
    的头像 发表于 04-28 17:35 416次阅读
    鸿蒙OpenHarmony【小型系统 实战应用】(基于Hi3516开发板)

    用keil mdk编译出的可执行文件.axf,如何设置keil才能让.axf包含.debug.str?

    用keil mdk编译出的可执行文件.axf,用readelf -S查看.axf文件信息,发现没有.debug.str,请问如何设置keil才能让.axf包含.debug.str C
    发表于 04-01 07:28

    fpga编程单片机编程的区别

    FPGA编程单片机编程的主要区别体现在以下几个方面。
    的头像 发表于 03-14 17:16 910次阅读

    单片机编程和plc编程有什么区别

    单片机编程和PLC编程是两种不同的嵌入式系统开发领域。在这篇文章,我们将详细探讨这两种编程方式的区别。首先,我们将简要介绍
    的头像 发表于 02-22 10:23 2458次阅读

    单片机编程实例介绍

    单片机(Microcontroller)是指内部集成了处理器核心、存储器、输入输出接口和外围设备接口等功能模块的集成电路芯片。它具有体积小、功耗低、性能高等优点,被广泛应用于嵌入式系统单片机
    的头像 发表于 01-16 09:37 2541次阅读

    labview生成exe后报表不能用

    LabVIEW是一款流程化的编程语言和开发环境,广泛应用于工业自动化、实验室研究、仪器仪表等领域。通过LabVIEW开发的程序可以生成可执行文件(.exe),方便用户在没有安装LabVIEW开发环境
    的头像 发表于 01-04 15:59 1997次阅读

    labview生成exe文件如何配置文件

    LabVIEW是一种用于实时测试、控制和数据采集的编程环境。在开发过程,您可以使用LabVIEW软件生成可执行文件(.exe),以便在没有LabVIEW开发环境的计算机上运行您的应用程序。生成
    的头像 发表于 12-27 16:28 2007次阅读

    keil如何生成bin文件

    Keil是一种集成开发环境(IDE),专为ARM架构的嵌入式系统开发而设计。在Keil中生成bin文件是将代码编译并转换为可执行文件的过程。本文将详细介绍Keil生成bin文件的步骤和相关内容,包括
    的头像 发表于 12-15 13:43 1.1w次阅读

    LabVIEW在不同操作系统上使VI、可执行文件或安装程序

    功能的更多信息,请参阅LabVIEW帮助的“在平台之间移动VI”主题。该帮助主题还包括在可能的情况下的解决方法的信息。 可执行文件和安装程序 可执行文件(独立应用程序)和安装程序是平台相关
    发表于 12-02 21:47