ARM链接器(一):链接的一般概念

链接器ld与lld的区别 VMA 是执行输出文件时 section 所在的地址,而 LMA 是加载输出文件时 section 所在的地址。一般而言,某 section 的 VMA == LMA. 但在嵌入式系统中,经常存在加载地址和执行地址不同的情况:比如将输出文件加载到开发板的 flash 中(由 LMA 指定), 而在运行时将位于 flash 中的输出文件复制到 SDRAM 中(由 VMA 指定)。您所要做的就是构建对象文件 和命令行参数,就像调用 外部链接器,然后从代码中调用链接器的 main 函数。 阅读详情

ARM链接器可以把编译(或汇编)生成的多个目标文件和所需要的多个库文件链接在一起,生成可执行的ELF格式的输出文件。

在链接过程中,如果在链接器的输入文件中同时包含ARM代码和Thumb代码,链接器可以自动为实现不同代码之间的链接生成一个veneer文件。该文件用来帮助目标处理器实现两种不同状态之间的转换,并可以实现长跳转。链接器还可以为指令代码段和或数据段指定在目标存储器中的位置。

1  链接的一般概念

1.1  链接器的输入和输出

1、目标文件和映像文件

链接器的输入就是编译器的输出。编译器编译后生成的文件称为目标文件,是ELF(Executable Linkable Format)格式。ELF格式目标文件是一个非文本文件,一般包含指令代码和编译信息两部分,提供给链接器使用。

目标文件经过链接器链接生成的文件称为映像文件,仍然是ELF格式。之所以称为映像文件,是因为文件中程序之间的位置关系与实际存储时的地址关系是对应的,程序代码是实际储存后的代码的一个“映像”。一般情况下,存储到程序存储区的程序都是从地址0x0000开始的,但映像文件的开始地址可以不是从0x0000开始,在ADS系统总默认是0x8000。

目标文件和映像文件都是ELF格式的,它们之间最主要的区别在于:目标文件中代码和符号的地址是不确定的,而映像文件中代码和符号的位置必须是确定的。

2、文件和段

文件是计算机操作的基本单位,而段则是链接器操作的基本单位。一个文件中可以包含一个或多个段。对于链接器来说,它不关心有多少个输入文件,而只关心有多少个输入段。

链接器的输入段其来源可以有两种:一种是来自源文件中的段;另一种是来自库中的段。这些段有三种属性:只读(RO)段、可读写(RW)段、初始化为零(PI)段。

链接器的输出是一个可执行的映像文件,包含一个或多个段。这些在镜像文件中的段叫输出段,也有三种属性:只读(RO)段、可读写(RW)段、初始化为零(PI)段。

3、映像文件的结构

(1) 映像文件由一个或多个域组成

映像文件中的域,就是存放映像文件的一个存储区。一个映像文件占用几个存储区,主要看映像文件的结构和目标存储器的组成。如果映像文件不大,一般情况下自用一个存储区;如果系统比较复杂,而文件又很大,一般把只读属性的代码和可读/写属性的数据分开存储。

(2) 每个域包含一个或多个输出段

每个域可以包含一个、两个或三个输出段,主要看域的存放位置和对输出段的要求,也和存储器的特性有关。

(3)每个输出段包含一个或多个输入段

链接器把属性相同的输入段按照一定的顺序组织在一起,形成输出段。属性相同的输入段,它们在系统中的作用相近,这样组成的输出段便于存储和管理。

(4)每个输入段都都可以包含代码和数据

输入段可以包含代码和数据,如在一个代码段后面定义一个数据缓冲区。但是这样的代码和数据只能有相同的属性,一般定义为只读属性。所以,如果数据需要可读/写,就不能和代码处于同一段内。

1.2  映像文件的加载和执行

1、加载域和执行域

映像文件可以有两种地址:加载地址和执行地址。加载地址就是文件在存储器中的存储地址,执行地址就是文件在运行时的地址。文件加载的存储区叫加载域,文件运行的存储区叫执行域。例如,为了提高速度,要把执行的程序从ROM存储区移到高速缓冲区之后再执行,此时,加载地址就不再是执行地址了。

2、位置无关

3、映像文件的入口点

映像文件有两种入口点:初始入口点和普通入口点。

l 映像文件的初始入口点存储在ELF格式的文件头中。每个映像文件只能有一个初始入口点。它必须满足两个基本条件:必须总是位于映像文件的可执行地址范围内;这个地址范围不能被覆盖,且加载地址和执行地址总是同一个地址。初始入口点可以是普通入口点。

l 在汇编语言源程序中,由ENTRY伪指令定义的入口点是普通入口点,并可以定义多个入口点。这些入口点可以作为中断处理程序的入口。

1.3  输入段在映像文件中的排列顺序

1、为输入段指定地址的方法

l 在命令行和图形方式中使用和地址有关的选项,常用的可以影响地址分配的选项有:

-ro-base、-rw-base、-split、-ropi、-rwpi。

l 在命令行和图形方式中使用为输入段指定位置的选项,包括:

-entry location、-first section-id、-last section-id。

l 当目标系统和映像文件很复杂时,使用scatter格式文件,可以为每个输入段指定详细地址信息。

2、输入文件的排序规则

在默认情况下,链接器按照下面的顺序组织输入段:

l 只读代码段

l 只读数据段

l 可读写代码段

l 非零初始化的数据段

l 零初始化的数据段

LLD-LLVM链接器 LLD-LLVM链接器 LLD是LLVM项目中的链接器,是系统链接器的直接替代,并且运行速度比它们快得多。它还提供了对工具链开发人员有用的功能。 链接器按完整性降序支持ELF(Unix),PE / COFF(Windows),Mach-O(macOS)和WebAssembly。在内部,LLD由几个不同的链接器组成。ELF端口是本文档中将要描述的端口。PE / COFF端口已完成,包括Windows调试信息(PDB)支持。WebAssembly端口仍在开发中(请参阅WebAssembly lld port)。 阅读详情

相关推荐

ARM链接器基础概念与内存配置详解

链接器是编译工具链中的核心组件,负责将多个目标文件合并为可执行程序。其核心原理包括符号解析、地址分配和段合并,最终生成符合ELF格式的二进制文件。在ARM嵌入式开发中,链接器通过scatter file实现Flash与RAM的精确内存映射,支持RO/RW/ZI段的智能分配。工程实践中,开发者需要掌握位置无关代码(PIC)实现、调试信息优化等高级技巧,并能够分析常见链接错误如L6218E(未定义符号)和L6388E(段溢出)。这些技术对嵌入式系统开发、固件升级和动态加载等场景具有重要价值。

weixin_30562507的博客 334

Linux内核启动地址

内核编译链接过程是依靠vmlinux.lds文件,以arm为例vmlinux.lds文件位于kernel/arch/arm/vmlinux.lds,但是该文件是由vmlinux-armv.lds.in生成的,根据编译选项的不同源文件还可以是vmlinux-armo.lds.in,vmlinux-armv-xip.lds.in。vmlinux-armv.lds的生成过程在kernel/arc

Bekars涡轮增压的Blog ^_^ 3380

ARM 链接过程分析

data.o 里面只有 .data 段的数据,并且长度为 8 个字节,小端模式,的确包含了 01000000 以及 02000000 两个全局变量的数据。在链接之前并不知道数据的具体数值,也不知道调用函数的函数位置,因此事先会把不知道的信息空出来,等到链接的时候再合并。可以看到链接后的 test 文件的 .text,.data,.rodata,和 .bss 等段的 size 是多个 .o 文件的和。变量的赋值时通过如下汇编语句实现,可以看到变量的值都是 0,后期链接器会将这两个值改为真正的。

tyustli 2313

详解arm中entry的使用

介绍了entry的详细用法和原理

喝水的面包 6323

保姆级教程:用Docker一键部署vLLM大模型推理服务(附常见报错解决方案)

本文提供了一份详细的Docker化vLLM大模型推理服务部署指南,涵盖从环境准备到性能调优的全流程。通过容器化技术解决大语言模型部署中的显存利用率、吞吐量等核心问题,并附常见报错解决方案,帮助开发者快速构建高效、可扩展的AI推理服务。

weixin_29248313的博客 490

CMOS中的 latch-up 闩锁效应、添加tap解决latch-up、使用combained area绘制TAP TAP的作用 IC后端版图【VLSI】

本文详细阐述了闩锁效应latch-up问题、如何通过添加Tap来解决。详细讲述了如何通过combained area来绘制TAP

Jie_MSD的博客 1万+

ARM linux内核启动时几个关键地址

  1.       内核启动地址 1.1.   名词解释 ZTEXTADDR 解压代码运行的开始地址。没有物理地址和虚拟地址之分,因为此时MMU处于关闭状态。这个地址不一定时RAM的地址,可以是支持读写寻址的flash等存储中介。 Start address of decompressor. here's no point in talking about virtual or phy...

weixin_34402090的博客 261

PID不够用?试试给PID加上‘预言’能力:史密斯预测器(SP)在温控、液位控制中的实战配置

本文深入探讨了史密斯预测器(SP)在温控和液位控制中的应用,特别针对大滞后系统的PID控制难题。通过详细解析SP的核心组件、参数整定技巧及进阶应用FSP,结合西门子PLC的实战配置方案,帮助工程师有效提升控制精度和系统稳定性。文章还提供了S7-1200的完整实现步骤和调试技巧,为工业自动化控制提供了实用解决方案。

weixin_33686714的博客 467

arm-gcc链接器和链接脚本

arm-gcc链接器和链接脚本

u014722462的博客 4198

详解一典型的反激式开关电源方案

如图,在某系统方案上看到下图所示的单端反激式开关电源方案。

alala120的博客 1万+

DDR5中的On-Die Termination(ODT)详解:电阻值支持及其背后的秘密

DDR5支持多档ODT电阻值,范围从40Ω到480Ω,均基于240Ω标准参考电阻RZQR_{ZQ}RZQ​。不同电阻档位对应不同的信号负载和功耗需求。校准电压点关键,常用0.8×VDD进行精准调校。CA信号间ODT匹配必须严格控制,保证命令总线稳定。选择合适的ODT值是高速内存设计中不可忽视的细节。

weixin_43199439的博客 2095

c语言链接器的作用,ARM arm-ld链接器的作用

ARM arm-ld链接器的作用[复制链接]如果用过arm交叉编译器,一定看过arm-ld, arm-as, arm-gcc, arm-nm等一系列工具,它们的用途是干什么的呢?(1)arm-as 用于将 xxx.s 汇编文件编译为 xxx.o 文件eg : arm-as -o add.oadd.s复制代码(2)在写多文件工程的时候,每个汇编文件被 arm-as工具单独编译为.o文件,c文件用...

weixin_30125497的博客 728

5、高级综合技术:从调度到优化的全面解析

本文深入解析了高级综合技术,涵盖从控制/数据流图构建、调度算法、分配绑定策略到编译器优化的全流程。通过案例分析和对比,探讨了不同优化策略对性能和资源利用的影响,并总结了关键要点及未来发展趋势,为高效利用FPGA实现数字设计提供了全面指导。

night的博客 117

ARM链接器核心概念与优化实践指南

链接器是编译工具链中的关键组件,负责将多个目标文件合并为可执行程序或库。在嵌入式开发领域,特别是基于ARM架构的系统,链接器需要处理特殊的内存布局要求、符号解析和代码生成问题。ARM链接器(armlink)通过提供专有选项,使开发者能够精确控制代码和数据的位置、优化内存访问效率,并管理符号可见性。这些功能对于资源受限的嵌入式系统尤为重要,其中内存对齐访问控制(如--unaligned_access选项)和符号保留机制(如--undefined选项)是常见优化手段。通过合理配置链接器选项,开发者可以显著提升系

weixin_30645617的博客 500

【AI智能体】Spring AI Tool 从使用到实战详解

Spring AI Tool

congge 5864

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Mold链接器终极指南:为什么你需要这个比ld快10倍的现代链接器

想要大幅提升C/C++项目的编译速度吗?Mold(现代链接器)就是你的答案!作为一款专为速度而生的高性能链接器,Mold能在保持完全兼容性的同时,将链接时间缩短数倍甚至数十倍。无论是大型项目还是日常开发,Mold都能显著提升你的工作效率,让等待编译成为过去式。 ## 🔥 为什么选择Mold而不是传统链接器? ### 惊人的性能提升 传统的GNU ld和gold链接器在处理大型项目时常常成为

gitblog_00349的博客 990

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

链接器介绍和链接脚本的编写

随着从单片机到嵌入式,程序越来越复杂,通常由多个源文件组成。在编译的过程中会对这些源文件进行汇编或者编译然后生成目标文件。这些目标文件一般都包含代码段、数据段、符号表等等内容。...

闪耀大叔的博客 2278

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

ARM编程工具篇——链接器脚本

一、概述 每一个链接过程都由链接脚本(linker script,一般以lds作为文件的后缀名)控制。链接器脚本主要用于规定如何把输入文件内的section放入输出文件内,并控制输出文件内各部分在程序地址空间内的布局。 二、脚本构成 2.1基本构成:段 一个可执行程序通常是由:代码段(text),数据段(data),bss段构成的。同样,在用于链接这个程序的链接器脚本

廖旭 廊坊师范学院信息技术提高班第十一期 2130

链接脚本文件与链接器

链接脚本(Linker Script)和链接器(Linker)是嵌入式开发中非常重要的概念,尤其是在像 Keil 这样的集成开发环境(IDE)中,它们帮助决定程序在目标设备内存中的布局。

ting 996

链接器与加载器

链接加载随记

嵌入式学习记录站点 1547

ARM 链接器优化功能介绍

ARM 链接器优化功能介绍

Miao8miao的博客 1641

ARM64基础10:GNU LD链接器介绍

连接器Linker:是一个程序,将一个或多个编译器或汇编生成的目标文件,及依赖库,连接为一个可执行文件。 GNU Linker采用AT&T链接脚本语言; 链接脚本文件:包含ld程序链接的规则,其决定输出可执行文件的内存布局; LD命令:arm64版本的连接器是aarch64-linux-gnu-ld 查看命令参数: aarch64-linux-gnu-ld --help LD命令的参数有很多,常用的如下: $(ARMGNU)-ld -T $(SRC_DIR)/linker.ld -Map xxx.

科学边界 2426

链接器lds文件简介

lds后缀的文件是一个linker script,是一个链接器脚本文件。它用来描述链接器要如何链接生成一个目标执行文件,一般我们在编译C语言程序时,都不会创建lds文件,那是因为libc中已经暗含了链接文件。如果我们编译一个汇编文件,那么没有加入libc库,那么就需要创建一个lds文件并且传递给ld链接器来生成可执行elf文件。 OUTPUT_FORMAT("elf32­littlearm", "...

程序猿Ricky的日常干货 7897

使用gnu arm toolchain 编译stm32固件时,链接脚本与链接器之间的交互细节

本文介绍了ARM Cortex-M3微控制器的开发编译和链接过程,主要包括三个关键步骤: 1.C源码编译阶段 2.汇编文件处理阶段 3.最终链接阶段

qq_46635513的博客 1124
上一篇: BootLoader中PLL的初始化代码分析
下一篇: IIC总线
formerman
博客等级 码龄20年 58粉丝 49原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值