鏈接器腳本構成

源碼:

SECTIONS {
        . = 0x30008000;

        . = ALIGN(4);
        .text :
        {
        led.o (.text)
        *(.text)
        }

        . = ALIGN(4);
        .rodata : {*(.rodata)}

        . = ALIGN(4);
        .data : {*(.data)}

        . = ALIGN(4);
        bss_start = .;
        .bss : {*(.bss) *(COMMON)}
        bss_end = .;
}

基本構成:段

一個可執行程序通常是由:代碼段,數據段,bss段構成的。同樣,在用於鏈接這個程序的鏈接器腳本中,就會反應出這幾個段的信息。

  • 代碼段:

          .text :
          {
          led.o(.text)
          *(.text)
          }
    
  • 數據段:

          .data : {*(.data)}
    
  • BSS段:

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

起始鏈接地址

對照源碼起始地址爲0x30008000

[root@localhost lesson4]# ls
led.lds  led.S  Makefile
[root@localhost lesson4]# make
arm-linux-gcc -g -o led.o -c led.S
arm-linux-ld -Tled.lds -o led.elf led.o
arm-linux-objcopy -O binary led.elf led.bin
[root@localhost lesson4]# arm-linux-objdump -D -S led.elf >dump
[root@localhost lesson4]# ls
dump  led.bin  led.elf  led.lds  led.o  led.S  Makefile
[root@localhost lesson4]# vi dump
led.elf:     file format elf32-littlearm

Disassembly of section .text:

30008000 <_start>:

.text
.global _start
_start:
@建立中斷向量表
                b       reset                                           @復位
30008000:       ea00000d        b       3000803c <reset>
                ldr     pc, _undefined_instruction      @未定義指令向量
30008004:       e59ff014        ldr     pc, [pc, #20]   ; 30008020 <_undefined_instruction>
                ldr     pc, _software_interrupt         @軟件中斷向量
30008008:       e59ff014        ldr     pc, [pc, #20]   ; 30008024 <_software_interrupt>
                ldr     pc, _prefetch_abort                     @預取指令異常向量
3000800c:       e59ff014        ldr     pc, [pc, #20]   ; 30008028 <_prefetch_abort>
                ldr     pc, _data_abort                         @數據操作異常向量
30008010:       e59ff014        ldr     pc, [pc, #20]   ; 3000802c <_data_abort>
                ldr     pc, _not_used                           @未使用
30008014:       e59ff014        ldr     pc, [pc, #20]   ; 30008030 <_not_used>

對齊

調整當前地址滿足4字節對齊

		 . = ALIGN(4);

變量

bss起始地址:bss_start
bss結束地址:bss_end

	    bss_start = .;
	    .bss : {*(.bss) *(COMMON)}
	    bss_end = .;

代碼段首文件

代碼段首文件:led.o(.text)

	    .text :
	    {
	    led.o(.text)
	    *(.text)
	    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章