解读链接脚本ld和案例分享

这篇具有很好参考价值的文章主要介绍了解读链接脚本ld和案例分享。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

链接脚本ld

ld(Linker)是一个负责将目标文件和库文件链接成可执行文件或共享库的程序。在编译过程中,编译器将源代码编译成目标文件,然后ld将这些目标文件链接成可执行文件或共享库。

ld的主要作用是解决目标文件之间的符号引用关系,将所有目标文件中的符号引用和符号定义进行匹配,最终生成可执行文件或共享库。

在ld的工作过程中,会执行以下几个步骤:

  1. 读取输入文件:ld首先会读取所有需要链接的目标文件和库文件,这些文件包括目标文件、静态库文件和动态库文件。

  2. 符号解析:ld会对每个目标文件中的符号进行解析,将符号引用和符号定义进行匹配。

  3. 符号重定位:ld将所有符号引用和符号定义进行匹配后,会对所有未解析的符号进行重定位,将其指向正确的地址。

  4. 生成输出文件:最后,ld将所有目标文件链接成一个可执行文件或共享库,并生成输出文件。

在解读ld文件的过程中,需要了解目标文件和库文件的格式,以及符号表、重定位表等概念。同时,需要了解ld的工作流程,理解ld如何将所有目标文件链接成一个可执行文件或共享库。

ld文件的几部分

ld文件的语法是基于脚本语言的,主要包括以下几个部分:

  1. 指令(Directives):指令是ld文件的基本语法单元,用于控制链接器的行为。指令以“.”开头,例如“.text”、“.data”等。

  2. 命令(Commands):命令是指令的具体实现,用于指示链接器如何处理目标文件和库文件。命令包括输入命令、输出命令、符号命令、重定位命令等。

  3. 表达式(Expressions):表达式用于计算地址和大小等数值,可以包括常量、符号、运算符等。

  4. 段(Sections):段是目标文件中的一段内存区域,包括代码段、数据段、BSS段等。段可以包含多个节(Section),每个节包含一组相同类型的数据。

  5. 符号(Symbols):符号是目标文件中的标识符,包括函数名、变量名、常量等。符号可以被定义和引用,链接器会根据符号的定义和引用关系进行符号解析和重定位。

  6. 段地址(Address):段地址是指目标文件中的段在内存中的起始地址。

  7. 镜像(Image):镜像是指可执行文件或共享库在内存中的映像,包括代码段、数据段等。

下面是一个示例ld文件,用于将多个目标文件和库文件链接成一个可执行文件:

ENTRY(_start)

SECTIONS {
    .text  : { *(.text) }
    .data  : { *(.data) }
    .bss   : { *(.bss) }
}

INPUT(-lc -lm)
OUTPUT(main)

该ld文件包含了一个入口点(ENTRY)、三个节(SECTIONS)、一个输入命令(INPUT)和一个输出命令(OUTPUT)。在每个节中,使用通配符“*”匹配所有同名节中的内容。输入命令用于指定需要链接的库文件,输出命令用于指定生成的可执行文件名。

NUC980连接脚本

以下是一个NUC980的ld文件示例:

ENTRY(_start)

MEMORY {
    rom (rx)  : ORIGIN = 0x00000000, LENGTH = 0x100000
    ram (rwx) : ORIGIN = 0x20000000, LENGTH = 0x100000
}

SECTIONS {
    .text : {
        *(.text)
    } > rom

    .rodata : {
        *(.rodata)
    } > rom

    .data : {
        *(.data)
    } > ram AT > rom

    .bss : {
        *(.bss)
    } > ram

    .stack : {
        . = ALIGN(4);
        _estack = .;
        . = . + 0x1000;
        . = ALIGN(4);
    } > ram

    /DISCARD/ : {
        *(.note.*)
        *(.comment)
    }
}

该ld文件定义了两个内存区域:rom和ram。rom区域用于存放只读数据和代码,ram区域用于存放可读写数据。其中,rom区域的起始地址为0x00000000,长度为0x100000,ram区域的起始地址为0x20000000,长度为0x100000。

该ld文件将目标文件中的代码和只读数据放置在rom区域,可读写数据放置在ram区域。其中,代码段和只读数据段使用了“.text”和“.rodata”节,可读写数据段使用了“.data”节,BSS段使用了“.bss”节。在链接时,代码段和只读数据段被放置在rom区域,可读写数据段被放置在ram区域,BSS段被放置在ram区域。

该ld文件还定义了一个栈区(.stack),用于存放程序的运行时栈。栈区的起始地址为ram区域的末尾,大小为0x1000字节。

最后,该ld文件使用“/DISCARD/”命令将目标文件中的“.note.*”和“.comment”节丢弃,这些节通常包含调试信息,不需要放置在最终的可执行文件中。

【最后一个bug】多平台都有更新和发布,大家可以一键三连,关注+星标,不错过精彩内容~
ld文件语法,主流单片机开发(MCU),arm开发,嵌入式硬件,系统架构,算法,信息与通信文章来源地址https://www.toymoban.com/news/detail-628646.html

到了这里,关于解读链接脚本ld和案例分享的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Linux上x86_64架构的动态链接器 ld-linux-x86-64.so.2

    /lib64/ld-linux-x86-64.so.2 是Linux操作系统上x86_64架构的动态链接器(也称为动态链接编辑器)。它负责加载和链接在运行时(即程序启动时或之后)被引用的动态库。现在,我们来深入了解其作用和重要性: 动态链接器的作用 : 当运行一个可执行程序时,该程序可能依赖于多个动

    2024年02月02日
    浏览(53)
  • 深度解读当前主流公链的竞争格局

    综合公链和生态来看:Sol  Avalanche  Near Bsc  Polygon  Ftm 本次仅从架构上做比较,加入了 ETH / Cosmos / Dot,观点和上次基本一致 从架构上,把目前主流公链分为三大类:多链、单链、特殊 Eth:L1 L2 优点:智能合约平台鼻祖;最安全的链;最多的创新和真实用户,目前排名第

    2023年04月13日
    浏览(40)
  • 编写Bash脚本程序从记录文件中提取history命令的优化,再介绍linux bash语法和结构

    目        录 一、引言 二、脚本代码实现 三、bash语法和结构 (一)基本语法 1、脚本开始与结束 2、注释 3、变量 4、数据类型 5、控制结构 6、循环控制 7、函数 8、算术运算 9、算术操作符和逻辑操作符 (二)命令相关 1、命令执行 2、命令的执行顺序 3、命令的执行优先级

    2024年01月25日
    浏览(55)
  • Curl【实例 01】curl下载使用及cmd实例脚本分享(通过请求下载文件)

    Curl 官方下载地址 可下载不同平台不同版本的安装包,本次使用的是Windows解压版本 curl-8.0.1_9-win32-mingw.zip 。 1.1 curl curl是一个开源的命令行工具和库,用于在终端和脚本中进行网络数据传输。它支持多种协议,如HTTP、HTTPS、FTP、SMTP等,可以通过URL进行数据传输和通信。 curl的

    2024年02月07日
    浏览(56)
  • 【云原生 | 36】Docker快速部署主流脚本语言JavaScript

    🍁 博主简介 :         🏅云计算领域优质创作者         🏅新星计划第三季python赛道第一名         🏅阿里云ACE认证高级工程师         🏅阿里云开发者社区专家博主 ✒️ 博主微信 :15575411187 💊 交流社区 :小鹏linux(个人社区)欢迎您的加入! 目录

    2024年02月02日
    浏览(48)
  • 常用的 55 个 Linux Shell 脚本(包括基础案例、文件操作、实用工具、图形化、sed、gawk)

    1、第一个案例:helloworld 2、打印运行的python进程 3、获取并打印参数 4、用脚本写for循环 5、使用C语言风格的for命令 6、while循环案例 7、使用break跳出外部循环 8、使用continue命令 9、case案例 10、判断两个数是否相等 11、使用双圆括号 12、使用双方括号 13、反引号的使用 14、字

    2024年02月07日
    浏览(50)
  • 第八篇【传奇开心果系列】Python自动化办公库技术点案例示例:深度解读使用Python库清洗处理从PDF文件提取的文本

    在使用pyPDF4或任何其他Python的PDF解析库提取PDF文件的文本后,进行清洗处理是非常重要的。这是因为PDF文件通常包含了各种格式化元素,如页眉、页脚、页码、图表、图片等,这些元素可能会干扰到你提取的文本内容。清洗处理的目标是去除这些干扰元素,仅提取出你真正需

    2024年03月22日
    浏览(66)
  • Go开源世界主流成熟ORM框架gorm实践分享

    @ 目录 概述 定义 核心功能 声明模型与约定 gorm.Model 字段级权限 时间惯例 嵌入结构 字段标签 使用 安装 数据库链接 连接池 CRUD 接口 创建 查询 高级查询 修改 删除 原始SQL 事务 转换 分片 序列化 GORM 官网地址 https://gorm.io/ 最新版本v1.25.1 GORM 官网文档地址 https://gorm.io/docs/ G

    2024年02月05日
    浏览(45)
  • STM32 GCC编译器 .ld & .s文件详细解析

    1.定义程序入口地址 2.定义Flash、RAM中代码和数据的存放位置 /* Highest address of the user mode stack / / end of stack 堆栈末尾 = RAM起始地址 + RAM空间大小 / _estack = ORIGIN(RAM) + LENGTH(RAM); / end of “RAM” Ram type memory */ /* 程序所必须的堆、栈空间大小定义 / _Min_Heap_Size = 0x200 ; / required amount o

    2024年02月15日
    浏览(35)
  • 精彩解读:短链接应用全方位探究

    1. 短链接的定义和原理 短链接是一种将长网址转换为短网址的服务,通过简化网址长度,方便用户分享和传播链接。短链接服务通过将长网址映射到短标识符的方式,实现对原始网址的压缩和简化。用户在访问短链接时,系统会将短链接还原为原始长网址,实现跳转到目标网

    2024年04月08日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包