我对GCC链接器脚本中的ENTRY和STARTUP命令感到困惑。
如上所述:http://wiki.osdev.org/Linker_Scripts
ENTRY()使任何符号作为.text部分中的第一项链接。 另一方面,STARTUP()使整个编译文件作为.text部分中的第一项。
在我的项目中,它表现得很奇怪。
我正在使用gnu-arm-none-eabi工具链,在我的链接器脚本命令ENTRY(asm_start)中没有任何效果。链接脚本:
ENTRY(asm_start)
MEMORY
{
RAM : ORIGIN = 0x10000, LENGTH = 0x1000000
PIC_BUFF : ORIGIN = 0x10000 + LENGTH(RAM), LENGTH = 200M
}
SECTIONS
{
.text : {*(.text)} > RAM
.data : {*(.data)} > PIC_BUFF
// etc.
汇编功能:
.text
.global asm_start
.global exc_stack
.global supervisor_sp
asm_start:
# initialize Stack pointer for exception modes
mrs r4, cpsr
bic r4, r4, #0x1f
#FIQ Mode
orr r3, r4, #0x11
msr cpsr_c, r3
ldr sp, =exc_stack
#IRQ Mode
orr r3, r4, #0x12
msr cpsr_c, r3
// etc.
和asm_start在内存中的某个随机位置结束。
另一方面,STARTUP()函数工作正常,所需文件在.text段中的适当位置结束。
有些人可以解释一下这种情况究竟发生了什么吗?
答案 0 :(得分:1)
ENTRY()
设置执行时的PC起点,STARTUP()
设置.text
BTW,对于基本皮层ARM gnu-arm-none-eabi
,ENTRY()
通常设置为 Reset_Handler 向量,.text
必须以中断向量表开始。
我总是看到它手动设置。但可能会使用STARTUP()
。