链接脚本
每一个链接的过程都叫链接脚本,,一般是以lds作为后缀名,链接脚本规定把输入文件放到输出文件中,主要是用于空间布局的,我们这里就是利用链接脚本来清空bss段
注:编译器有默认的链接脚本,用ld-verbose查看,同时使用-T来指定自己的链接脚本
源代码
OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm",
"elf32-littlearm") //选择大端序或者小端絮
OUTPUT_ARCH(arm) //arm架构
ENTRY(_start) //从标号_start开始
SECTIONS
{
. =0x50000000; //将地址定位到50000000
.text :{
head.o(.text) //指定代码段开始为head.o
*(.text) //所有的.text段在后面
}
. =ALIGN(4);//四字节对齐
.data :{ //紧挨着上面text段
*(.data) //所有data段
}
. = ALIGN(4);
start_bss = .; //定义一个类似于标号值,来记录bss段的开始
.bss :{
*(.bss) //所有bss段
}
. = ALIGN(4);
end_bss = .; //bss段的结束
}
在汇编中定义
start_bss_: //定义连接脚本的标号
.word start_bss
end_bss_://定义连接脚本的标号
.word end_bss
clr_bss:
stmfd sp!, {r0-r12,lr}
mov r2,#0
ldr r0,start_bss_
ldr r1,end_bss_
clr_loop: //bss清空
cmp r0,r1
bge clrover
str r2,[r0],#4
b clr_loop
clrover:
ldmfd sp!, {r0-r12,pc}