單片機
返回首頁

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,通過幾行代碼,就可以少幾十個甚至上千個全局變量的存儲空間。

進入單片機查看更多內容>>
相關視頻
  • TI 新一代 C2000? 微控制器:全方位助力伺服及馬達驅動應用

  • MSP430電容觸摸技術 - 防水Demo演示

  • 直播回放: Microchip Timberwolf? 音頻處理器在線研討會

  • 新唐 8051單片機教程

  • 基于靈動MM32W0系列MCU的指夾血氧儀控制及OTA升級應用方案分享

  • 基于靈動MM32SPIN系列MCU的無感FOC便攜冰箱應用方案分享

    相關電子頭條文章
萝卜大香蕉