源碼:
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)
}