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

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

    关注

    6001

    文章

    43973

    浏览量

    620811
  • 计算机
    +关注

    关注

    19

    文章

    6649

    浏览量

    84497
  • 编程
    +关注

    关注

    88

    文章

    3440

    浏览量

    92382

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

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

收藏 人收藏

    评论

    相关推荐

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

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

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

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

    keil如何生成bin文件

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

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

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

    K510跑python的opencv可行吗?打包为linux可执行文件能跑吗?

    想了解一下K510跑python的opencv可行吗?打包为linux可执行文件能跑吗?
    发表于 09-14 09:01

    计算机中的ELF文件解析

    关于计算机的文件有很多种,今天分享一种用于二进制文件可执行文件、目标代码、共享库和核心转储格式文件
    发表于 09-13 10:12 510次阅读
    计算机中的ELF<b class='flag-5'>文件</b>解析

    330集(60.3.#100)-o 与.bin 文件,谁是可执行文件

    单片机嵌入式
    于振南的单片机世界
    发布于 :2023年09月03日 13:08:22

    windows下NucleiStdio编译不成功,不能生成可执行文件(.elf, .verilog等)怎么解决?

    windows 下 NucleiStdio编译不成功,不能生成可执行文件(.elf, .verilog等)具体见下图所示:
    发表于 08-12 06:25

    Spring官方再出手,这个工具杀疯了!

    上面提到了原生镜像,简单来说原生镜像是一种将Java代码提前编译为独立可执行文件(称为本机映像)的技术。可执行文件包括应用程序类,以及其依赖项的类,运行时库类以及JDK中的静态链接本机代码。
    的头像 发表于 08-01 16:25 348次阅读
    Spring官方再出手,这个工具杀疯了!

    Openwrt开发指南 第26章 编写应用程序交叉编译

    首先说一下什么是交叉编译:我们在 ubuntu 中写了一个程序,比如 main.c,然后使用 ubuntu 的编译器进行编译,生成的可执行文件自然可以在 ubuntu 中运行。但是生成的可执行文件
    的头像 发表于 07-15 16:06 1494次阅读
    Openwrt开发指南 第26章 编写应用程序交叉编译

    Qt软件开发-QSettings管理用户环境变量(修改、输出)

    在软件开发中可能有需求修改用户环境变量,添加新的值进行。比如:添加某些可执行文件、某些动态库的路径到系统环境PATH中,能够让可执行文件运行过程中可以找到对应的dll。
    的头像 发表于 07-14 13:46 1565次阅读
    Qt软件开发-QSettings管理用户环境变量(修改、输出)

    用一条命令来隐藏反向Shell

    执行命令query可以查看服务器的一些状态,实际上是执行此项值中的可执行文件
    的头像 发表于 07-05 09:32 286次阅读
    用一条命令来隐藏反向Shell

    LabVIEW可执行文件的远程前面板控制方法

    在实际项目中,开发工程师交付的软件往往是由源代码打包而成的可执行文件(.exe),用户在实际的使用中也是直接运行exe文件,基本不会直接运行源代码。这样做可以避免用户因不熟悉代码而在程序中胡乱修改
    的头像 发表于 05-29 15:19 2499次阅读
    LabVIEW<b class='flag-5'>可执行文件</b>的远程前面板控制方法

    单独下载可执行文件到MM32F5微控制器

    使用Keil MDK或者IAR等使用图形界面的开发环境,可以在图形界面环境下编译源码工程,并下载编译生成的可执行文件到目标微控制器中。
    的头像 发表于 05-24 17:24 1163次阅读
    单独下载<b class='flag-5'>可执行文件</b>到MM32F5微控制器

    S32G如何在linux下将c编程可执行文件放入开发板?

    核头文件找不到打开或关闭函数。 我在网上搜索,它告诉我 SCP 命令可以做到,但我不想使用以太网。 有人可以告诉我将可执行文件放入板的步骤吗?或者它有一些方法可以将它构建到图像
    发表于 05-19 07:00