链接脚本和可执行文件

news2024/11/28 4:37:53

几个重要的概念

摘取自知乎内容:

链接器与链接脚本 - 知乎

linker 链接器

链接器(linker) 是一个程序,这个程序主要的作用就是将目标文件(包括用到的标准库函数目标文件)的代码段、数据段以及符号表等内容搜集起来并按照 ELF或者EXE 等格式组合成一个可执行的二进制文件的过程。

链接脚本

链接器在链接过程中需要使用链接脚本。如果没有通过 “-T” 参数指定链接脚本时,链接器会使用内置的链接脚本。链接脚本的作用: 将输入文件的段按照指定的地址空间布局合并到输出文件的段中。输出的文件具有可执行性。

可执行程序

任何一个可执行程序,不论是exe还是elf,都是由代码段,数据段,未初始化的数据段等组成。

section

 

一个输出段有两个地址 - 虚拟地址(Virtual Memory Address,VMA):运行时段所在的地址,即运行地址 - 加载地址(Load Memory Address,LMA): 加载时段所在的地址

有个地方需要注意的是,如果没有通过 “AT” 来指定LMA,那么 LMA=VMA,即加载地址等于运行地址。

一般嵌入式系统中,经常遇到加载地址和运行地址不一致的情况。比如image 存放在Flash中,运行时复制到RAM中。


分析s32k144的工程

分析S32K1xx_flash_debug.ld

1,memory map ,非常重要的一个概念,一个处理器的存储布局,存储器地址空间,cpu指令集直接可以寻址的外存空间。对应于地址空间的实体可以是flash,nandflash,sram,ddr等,如norflash,emmc等使用spi或者mdio控制器才能访问的存储器,则不在这个地址空间内。

/* Specify the memory areas */

MEMORY

{

  /* Flash */

  m_interrupts          (RX)  : ORIGIN = 0x00000000, LENGTH = 0x00000400

  m_flash_config        (RX)  : ORIGIN = 0x00000400, LENGTH = 0x00000010

  m_text                (RX)  : ORIGIN = 0x00000410, LENGTH = 0x0007FBF0

  /* SRAM_L */

  m_data                (RW)  : ORIGIN = 0x1FFF8000, LENGTH = 0x00008000

  /* SRAM_U */

  m_data_2              (RW)  : ORIGIN = 0x20000000, LENGTH = 0x00007000

}

2,目标可执行文件是由输入文件的各个段填充过来的,具体填充规则,以及虚拟地址和加载地址的定义均在链接文件中定义。

中断向量,os的异常向量表表存储在m_interrupts中,m_interrupts段定义在地址空间的RIGIN = 0x00000000, LENGTH = 0x00000400。

.interrupts :

  {

    __VECTOR_TABLE = .;

    . = ALIGN(4);

    "*(.isr_vector)"

    "*(Os_ExceptionVectors)" /* Startup code */

    . = ALIGN(4);

  } > m_interrupts

代码段(.code)虚拟地址(运行)在m_text (RX) : ORIGIN = 0x00000410, LENGTH = 0x0007FBF0,数据段虚拟地址(运行)在m_data,bss段虚拟地址(运行)在m_data_2中。注意段的虚拟地址和存储地址是两回事。下面会解释。

3,需要注意链接脚本的地址信息是会被程序引用的,也就是说连接脚本也属于程序的一部分,可以理解为既是程序的一个头文件,又是链接器的脚本程序。

__etext = .;    /* Define a global symbol at end of code. */

  __DATA_ROM = .; /* Symbol is used by startup for data initialization. */

  .data : AT(__DATA_ROM)

  {

    . = ALIGN(4);

    __DATA_RAM = .;

    __data_start__ = .;      /* Create a global symbol at data start. */

    "*(.data)"               /* .data sections */

    "*(.data*)"              /* .data* sections */

    "*(.os_data)"

    "*(.mcal_data)"

    "*(.jcr*)"

    . = ALIGN(4);

    __data_end__ = .;        /* Define a global symbol at data end. */

  } > m_data

虚拟地址是程序运行的地址,加载地址是程序存储的地址,或者是程序从哪里加载的地方。

数据段一开始定义了两个宏地址,这两个宏就是会被用到c代码中的。

__DATA_ROM就是近接着代码段之后的一个地址,AT(__DATA_ROM)表示将.data段加载地址设置为__DATA_ROM。

在startup_init_bss.c引用了这个地址:

void init_data_bss(void)

data_rom        = (uint8_t *)__DATA_ROM;

/* Copy initialized data from ROM to RAM */

    while (data_rom_end != data_rom)

    {

        *data_ram = *data_rom;

        data_ram++;

        data_rom++;

    }

startup.s中使用init_data_bss,.data从加载地址拷贝到运行地址(实际上是从flash拷贝到sram中,不拷贝其实也能执行,只要cpu可以寻址就行,flash和sram都在地址空间内)

; Init .data and .bss sections

    LDR     R0,=init_data_bss

    BLX     R0

    ;cpsie   i               ; Unmask interrupts

    BL      main

从规格书上找一下memorymap

 

 

总结:

1,可执行程序都是由数据段,代码段,bss段等组成。

2,每个段对应有两个地址:虚拟地址(运行地址),加载地址(存储地址),这个地址都是cpu可以寻址的地址空间。

3,链接脚本中的地址信息会被C代码引用,链接脚本可以是程序一部分(类似头文件)。

4,CPU的memory map 对应的存储器可以是flash 也可以是sarm,ddr等,如果加载地址和运行地址不一样,那么程序在运行的时候(startup.s)需要把加载地址放到对应运行的地址中。加载地址和运行地址,是程序员自定义的,受到存储器的特点进行调整。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/3778.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C++学习】string的使用

🐱作者:一只大喵咪1201 🐱专栏:《C学习》 🔥格言:你只管努力,剩下的交给时间! string的使用🙀模板😹函数模板😹类模板🙀string模板简…

【菜鸡读论文】Former-DFER: Dynamic Facial Expression Recognition Transformer

Former-DFER: Dynamic Facial Expression Recognition Transformer 哈喽,大家好呀!本菜鸡又来读论文啦!先来个酷炫小叮当作为我们的开场! 粉红爱心泡泡有没有击中你的少女心!看到这么可爱的小叮当陪我们一起读论文&am…

有了PySnooper,不用print、不用debug轻松查找问题所在!

PySnooper是一个非常方便的调试器,它是通过python注解的方式来对函数的执行过程进行监督的。 应用起来比较简单,不用一步一步的去走debug来查找问题所在,并且将运行过程中函数的变量值打印出来结果一目了然,相当于替代了print函数…

Boundary Loss 原理与代码解析

paper:Boundary loss for highly unbalanced segmentation Introduction 在医学图像分割中任务中通常存在严重的类别不平衡问题,目标前景区域的大小常常比背景区域小几个数量级,比如下图中前景区域比背景区域小500倍以上。 分割通常采用的交…

SpringBoot实践(三十三):Maven使用及POM详解

文章目录maven是什么maven怎么装settings.xml本地仓库地址:localRepository远程镜像:mirrorsJDK 版本:profile私服配置POM.xml中的常用标签projectmodelVersiongroupIdartifactIdversionpropertiesdependenciesbuild和pluginsresourcesdepend…

【学生管理系统】用户登录三种验证方式—图片验证、短信验证、邮件验证

目录 一、页面需求展示 二、验证方式—按钮组件 三、手机短信验证 四、邮件验证 五、图片验证邮件验证 &#x1f49f; 创作不易&#xff0c;不妨点赞&#x1f49a;评论❤️收藏&#x1f499;一下 一、页面需求展示 二、验证方式—按钮组件 2.1前端 <el-form-item labe…

【Linux】第十章 进程间通信(管道+system V共享内存)

&#x1f3c6;个人主页&#xff1a;企鹅不叫的博客 ​ &#x1f308;专栏 C语言初阶和进阶C项目Leetcode刷题初阶数据结构与算法C初阶和进阶《深入理解计算机操作系统》《高质量C/C编程》Linux ⭐️ 博主码云gitee链接&#xff1a;代码仓库地址 ⚡若有帮助可以【关注点赞收藏】…

工作流的例子

工作流的例子目录概述需求&#xff1a;设计思路实现思路分析1.配置bean2.examples3.no bean4.activiti-api-basic-process-example5.taskspringweb参考资料和推荐阅读Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c…

C++ 多态类型

多态 C在面向对象中&#xff0c;多态就是不同对象收到相同消息&#xff0c;执行不同的操作。在程序设计中&#xff0c;多态性是名字相同的函数&#xff0c;这些函数执行不同或相似的操作&#xff0c;这样就可以用同一个函数名调用不同内容的函数。简而言之“一个接口&#xff…

2022 国赛postgresql

安装postgresql配置postgresql [root@linux3 ~]# postgresql-setup --initdb //初始化数据库Initializing database in ‘/var/lib/pgsql/data’Initialized, logs are in /var/lib/pgsql/initdb_postgresql.log[root@linux3 ~]# systemctl enable postgresql.service Created …

澳洲最热门职业,护士排第一,医生竟然不如程序员?

2022澳洲最新的职业紧缺名单出炉了&#xff0c;令人惊讶的是护士竟然排行第一名&#xff0c;可见澳洲的医疗人力资源紧缺的问题。 既然人力资源紧缺&#xff0c;那么首当其冲的医生作为高学历且同属医疗行业的代表理应收到重视&#xff0c;然而令人意外的是&#xff0c;通过榜单…

Linux一篇入门(以Ubuntu为例)

一、Linux与Windows区别 Linux&#xff1a;无盘符&#xff0c;只有一个根目录&#xff08;/&#xff09; Windows&#xff1a;有盘符 二、目录相关常见命令 Linux命令格式&#xff1a; cmd -option parameter cdm命令&#xff0c;就是一个操作 parameter一般是要做的对象…

韩国程序员面试考什么?

大家好&#xff0c;我是老三&#xff0c;在G站闲逛的时候&#xff0c;从每日热门上&#xff0c;看到一个韩国的技术面试项目&#xff0c;感觉有点好奇&#xff0c;忍不住点进去看看。 韩国的面试都考什么&#xff1f;有没有国内的卷呢&#xff1f; 可以看到&#xff0c;有8.…

抽象类和接口

文章目录 前言 一、今日回顾 1.《高等数学》 2.阅读&#xff1a; 3.英语&#xff1a; 二、编程的那些事 1.引入库 2.读入数据 总结 前言 一、今日回顾 1.《高等数学》 2.阅读&#xff1a; 3.英语&#xff1a; 二、编程的那些事 1.抽象类的描述 在java中&#xff0…

一次函数与二次函数的联系

首先&#xff0c;无论是一次函数还是二次函数&#xff0c;都是函数&#xff0c;所以便可以从表达式&#xff0c;图像&#xff0c;函数的四个性质&#xff08;即有界性&#xff0c;单调性&#xff0c;奇偶性&#xff0c;周期性&#xff09;去看他们之间的联系 一次函数与二次函…

2022第8届中国大学生程序设计竞赛CCPC桂林站, 签到题4题

文章目录A. LilyM.Youth FinaleC.Array ConcatenationE.Draw a triangleA. Lily A. Lily time limit per test1 second memory limit per test512 megabytes inputstandard input outputstandard output They serve the purpose of changing hydrogen into breathable oxygen,…

MySQL数据库 -- 库和表的操作

关于数据库方面&#xff0c;还是需要多多练习的&#xff0c;否则很多指令不容易记住&#xff0c;所以大家也要在自己的电脑上多写写&#xff0c;熟悉熟悉~ 目录 库的操作 创建数据库 操纵数据库 查看数据库 显示创建语句 修改数据库 数据库的删除 数据库备份和恢复 …

重学数据库基础

幸福找到我&#xff0c;幸福说&#xff1a;“瞧这个诗人&#xff0c;他比我本人还要幸福” 一、数据库相关概念 数据库 存储数据的仓库&#xff0c;数据是有组织的进行存储英文&#xff1a;DataBase&#xff0c;简称 DB 数据库管理系统 管理数据库的大型软件英文&#xff1a;Da…

CSI室内指纹定位——相关通信名词解释

目录 1、无线信道 2、时域与频域 3、信道频率响应&#xff08;Channel Frequency Response,CFR&#xff09; 4、信道冲激响应&#xff08;Channel Impulse Response, CIR&#xff09; 5、信道带宽 6、带宽 7、子载波 9、波长 10、频率 11、振幅 12、相位 13、相位差…

高数值孔径(NA)物镜的聚焦分析

1. 摘要 高NA物镜广泛用于光刻&#xff0c;显微等技术。因此&#xff0c;聚焦仿真中考虑光的矢量性质至关重要。VirtualLab可以非常便捷地对此类镜头进行光线追迹和场追迹分析。通过场追迹&#xff0c;可以清楚地观察由于矢量效应引起的聚焦光斑失对称现象。利用相机探测器和电…