在这里插入图片描述

链接脚本的语法


SECTIONS {

...

secname start BLOCK(align) (NOLOAD) : AT ( ldadr )

  { contents } >region :phdr =fill

...

}


解释:


 secname  :段名

 start  :起始地址:运行时的地址(runtime addr);重定位地址(relocate addr)

 AT ( ldadr ) :可有可无(load addr:加载地址) 不写时LoadAddr = runtime addr

 { contents } 的内容: 

 start.o //内容为start.o文件

 *(.text)所有的代码段文件

 start.o *(.text)文件


elf文件格式


1 链接得到elf文件,含有地址信息(load addr)


2 使用加载器


:: 2.1 对于裸板是JTAG调试工具


:: 2.2 对于APP,加载器也是APP 把elf文件解析读入内存的加载地址


3 运行程序


4 如果loadaddr != runtimeaddr程序本身要重定位


核心程序运行时应该位于 runtimeaddr(reloate addr)或者链接地址


bin文件


1 elf生成bin文件 


2 硬件机制启动


3 如果bin文件所在位置 不等于runtimeaddr ,程序本身实现重定位

在这里插入图片描述

bin文件/elf文件都不保存bss段 这些都是初始值为0 或者没有初始化的全局变量


程序运行时把bss段对应的空间清零


做个实验,把全局变量g_A以16进制打印出来


/* 0xABCDEF12 */

void printHex(unsigned int val)

{

    int i;

    unsigned char arr[8];


    /* 先取出每一位的值 */

    for (i = 0; i < 8; i++)

    {

        arr[i] = val & 0xf;

        val >>= 4;   /* arr[0] = 2, arr[1] = 1, arr[2] = 0xF */

    }


    /* 打印 */

    puts("0x");

    for (i = 7; i >=0; i--)

    {

        if (arr[i] >= 0 && arr[i] <= 9)

            putchar(arr[i] + '0');

        else if(arr[i] >= 0xA && arr[i] <= 0xF)

            putchar(arr[i] - 0xA + 'A');

    }

}


//打印初始值为0的变量

int g_A = 0;

int g_B;


int main(void)

{

    uart0_init();


    puts("nrg_A = ");

    printHex(g_A);

    puts("nr");


上述代码,没有清理bss段 g_A等于莫名奇妙的值 并不等于0 所以需要清理bss段


修改lds链接文件


SECTIONS {

   .text   0  : { *(.text) }

   .rodata  : { *(.rodata) }

   .data 0x30000000 : AT(0x700) 

   { 

      data_load_addr = LOADADDR(.data);

      data_start = . ;

      *(.data) 

      data_end = . ;

   }


   bss_start = .; //bss开始地址是当前位置

   .bss  : { *(.bss) *(.COMMON) }

   bss_end = .; //bss结束地址也是当前位置

}


修改start.s,清除bss段


/* 清除BSS段 */

ldr r1, =bss_start

ldr r2, =bss_end

mov r3, #0

clean:

    strb r3, [r1]

    add r1, r1, #1

    cmp r1, r2

    bne clean


    bl main

halt:


现在的代码全局变量就是为0,通过几行代码,就可以少几十个甚至上千个全局变量的存储空间。

关键字:S3c2440  代码重定位  链接脚本 引用地址:S3c2440代码重定位详解3---链接脚本的解析

上一篇:S3c2440代码重定位详解2---链接脚本的引入与简单测试
下一篇:S3c2440代码重定位详解4---拷贝代码和链接脚本的改进

推荐阅读

9月9日消息 特斯拉的电动汽车上配备了宛如平板电脑的大号显示屏,带来了丰富的功能。但是对于驾驶中的司机来说,上面的信息太多反而会带来干扰。不过特斯拉将会在即将到来的V9固件更新中处理这一问题。据Electrek消息,在推特上和互动的时候,有网友向特斯拉CEO马斯克提问,是否可以让车辆在行驶的过程中关闭屏幕,只显示速度之类的消息。马斯克回应称,...
最近网络上不少网友反馈称,在OPPO、华为、苹果、小米等智能手机上使用自带计算器计算“10%+10%”的时候,得出的结果是0.11,而不是0.2。这一眼看起来是Bug,但最终结果是计算器处理运算符号的逻辑导致的。  人计算时,会优先考虑加减乘法的优先级,先做除法再做加法,结果就是(10%)+(10%)=0.2。如果是非科学计算器的计算逻辑则是认为连续...
  本文介绍了有源标签的设计理念出发,针对煤矿井下一般小范围空间RFID定位的需求,根据低功耗、高效率的原则进行RFID标签的设计。系统在硬件上采用了单片机和nRF24L01射频芯片的低功耗组合;软件上则结合了RFID定位的特点,介绍了有别于一般以识别为主要目的的标签的设计方法,并分析了其软件设计流程以及简单的防冲突能力。通过良好匹配的天线,本设计...
  为推进抽水蓄能快速发展,适应新型电力系统建设和大规模高比例新能源发展需要,助力实现碳达峰、碳中和目标,近日,国家能源局发布《抽水蓄能中长期发展规划(2021-2035年)》(以下简称《规划》)。 《规划》指出,当前我国正处于能源绿色低碳转型发展的关键时期,风电、光伏发电等新能源大规模高比例发展,对调节电源的需求更加迫切,构建以新能...

史海拾趣

问答坊 | AI 解惑

TI C54xx DSP 十天速成讲义 &lt;一&gt;

[实验一 新手上路] 初学者编写的第一个程序通常是控制XF引脚的变化,然后用示波器测量XF脚波形或观察与相接的LED。这个程序也常常用来测度一下DSP能否正常工作。实验1.1 最简单的程序:控制XF引脚周期性变化实验目的:通过简单的程序了解DSP程序的 ...…

查看全部问答∨

大家找工作都通过什么渠道?

失业了,想听听大家的方法学习下。…

查看全部问答∨

30岁面霸IT男30次面试失败经历

背景:硕士,IT行业工作3年,男,28岁,离职后,待业了一段时间(想创业)后,几个月的时间内面试了30几家公司均无功而返。 概要描述:   一个“离职”(离职和在职找工作是不同的,离职状态别人会压你的价格,所以,下文是离职的条件)优秀男 ...…

查看全部问答∨

郁闷了好几天了,请教uc/os问题

uc/os在开中断和关中断时有没有修个OSTCBCur和OSPrioCur值啊,我把uc/os扩展成支持时间片轮转时,为什么开中断和关中断时会出现OSTCBCur和OSPrioCur值被修改的情况呢,而且奇怪的是在低优先级任务里面创建高优先级任务时出现这种问题,不知道那里问 ...…

查看全部问答∨

两片计数器连接,进行扩展,消除毛刺的问题,求助!!

我用两个十进制的74160连接成60进制的,采用整体置数方式,计数到59的时候,置为零。不是很复杂。但是,要将置零信号进一步作为时钟信号输入到另一个计数器中,有毛刺的问题,老是不正确。 请问,如何消除毛刺,使其在上升沿触发时,发出一个信号 ...…

查看全部问答∨

随笔

其实,有时也会感觉无聊……工作快一年了,有时公司的事情真的让人很无语!有时让人想马上辞职走人,有时又有长期干下去的冲动,工作的那点事情,有时会感觉很累,有时却又干的不亦乐乎。搞技术的都是这样,有时真的不是在乎钱,不会太在乎工资的多 ...…

查看全部问答∨

求高手帮解个题,占空比问题!

高手们,帮解个题:MSP430G2231 的MCLK=SMCLK=TACLK=8Mhz,Pin13 (TA0.1)配置成TimerA输出,TimerA工作在continuous模式,TACCR1=30000,TACCTL1=OUT_MOD2, 请问Pin13输出的波形频率是多少,占空比是多少? A 122Hz, ...…

查看全部问答∨

有谁知道传感器芯片型号?

大家好,这是一款起亚轿车上的凸轮轴位置传感器上的芯片,我拆开传感器后只发现这点信息,有谁知道这个芯片是什么信号,请赐教,谢谢!…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved