历史上的今天
返回首页

历史上的今天

今天是:2024年09月09日(星期一)

正在发生

2021年09月09日 | S3c2440代码重定位详解3---链接脚本的解析

2021-09-09 来源:eefocus

在这里插入图片描述

链接脚本的语法


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,通过几行代码,就可以少几十个甚至上千个全局变量的存储空间。

推荐阅读

史海拾趣

Dfx公司的发展小趣事

随着汽车电子化程度的不断提高,某汽车制造商面临着如何在极端环境下保证汽车电子产品稳定性的挑战。通过DFX的设计理念,该公司对汽车电子产品的设计进行了全面优化,包括选用耐高温、抗腐蚀的材料、优化电路布局和散热设计等。这些改进措施显著提高了汽车电子产品的可靠性和耐久性,确保了汽车在恶劣环境下的正常运行。

Blue Giga公司的发展小趣事

随着技术的不断进步,Blue Giga在无线网络连接领域取得了重要突破。其研发的超低功耗Bluetooth Smart和Bluetooth Classic模块,以及Wi-Fi模块,受到了市场的广泛欢迎。同时,公司还推出了配套的软件栈、开发工具和SDK,进一步丰富了产品线,满足了不同领域的需求。

Davicom公司的发展小趣事

在竞争激烈的电子行业中,Davicom始终坚持自主研发,不断突破核心技术。公司投入大量研发资金,建立了一支高素质的研发团队,并申请了多项专利。通过多年的努力,Davicom在DSP IC及系统应用技术方面取得了重大突破,成功开发出多款具有竞争力的产品。

Elprotronic Inc.公司的发展小趣事

品质管理一直是Elprotronic Inc.非常重视的一项工作。公司建立了一套完善的品质管理体系,从原材料采购到产品生产、检测、包装等各个环节都进行严格把关。同时,公司还引入了先进的生产设备和技术手段,提高了产品的生产效率和质量水平。此外,公司还定期组织员工进行品质管理培训和学习交流活动,不断提升员工的品质意识和技能水平。这些措施的实施使得Elprotronic Inc.的产品质量得到了进一步提升和保障。

辰颐电子公司的发展小趣事

随着公司业务的不断发展,辰颐电子开始积极拓展市场。他们通过参加各种行业展会、举办产品发布会等方式,加强与客户的沟通和交流,提升品牌知名度和影响力。同时,公司还注重线上线下的渠道建设,通过电商平台、实体店等多种方式,将产品推向更广阔的市场。这些努力使辰颐电子在市场中树立了良好的品牌形象和口碑。

Deltron公司的发展小趣事

在追求经济效益的同时,Deltron公司始终关注环境保护和可持续发展。公司大力推行绿色生产理念,引进环保设备和技术,减少生产过程中的污染物排放。同时,公司还积极参与环保公益活动,提高员工和公众的环保意识。这些举措不仅提升了Deltron的品牌形象,也为公司的长期发展奠定了坚实基础。

问答坊 | AI 解惑

mp3播放器在wince下播放歌曲时,暂停后无法继续播放

   mp3的播放器采用标准的wince api函数来编写的,在wince环境下,能够正常播放、暂停和停止播放,但是在暂停后无法继续播放。具体原因是在暂停后,无法获取暂停时MP3播放的位置。在IMediaSeeking类中,GetCurrentPosition函数获取的播放 ...…

查看全部问答>

一个很邪门的问题

我帮别人做个读IO口,然后通过串口发出去的程序,用PC调试正常,怎么试怎么好,但是将单片机接到终端设备上去,终端收到的数据出错,但是如果将这个数据发给一台pc,单片机将数据发给pc,然后pc用相同的串口设置将收到数据发给设备,则设备接收数据 ...…

查看全部问答>

mov eax,cr0

我在DOS下怎么一: MOV EAX,CR0 OR EAX,1 MOV CR0,EAX 就重启呢?…

查看全部问答>

2530 + 2591的硬件设计

TI的参考设计中2591的三个电源端都有TLIN inductor,这个TLIN inductor可以不要的吗?还有就是这个TLIN不知道什么意思。…

查看全部问答>

430循迹程序

#include #define TR_1_H        P1IN|=BIT1      //P1.1 #define TR_1_L        P1IN&=~BIT1     //P1.1 #define TR_2_H   & ...…

查看全部问答>

2路温度设定-2路输出-1路超温报警

2路温度设定-2路输出-1路超温报警 [ 本帖最后由 用心思考 于 2012-10-7 08:45 编辑 ]…

查看全部问答>

TIVA C Launchpad第六周的心得---LM Flash programmer

程序内容:如何烧录编译好的bin文件。TI 提供了一个可以支持多种方式烧录的程序 LM Flash Programmer。 首先在CCS项目文件中编译源程序产生一个bin文件,具体设置如下: 我使用的CCS V5.5版本,选择相应的Project并右键选择Properties打开,如图 ...…

查看全部问答>

用TI官方的ccdebuger能调试CC430单片机吗

在官网上看到这个 但SmartRF里有cc430 …

查看全部问答>

请高手给解释下驱动及自锁电路的工作原理 

请高手给解释下驱动及自锁电路的工作原理 \0\0\0eeworldpostqq…

查看全部问答>