将功能链接到特定地址

时间:2016-05-31 17:53:44

标签: linker

我对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段中的适当位置结束。

有些人可以解释一下这种情况究竟发生了什么吗?

1 个答案:

答案 0 :(得分:1)

ENTRY()设置执行时的PC起点,STARTUP()设置.text

中的第一个链接对象

BTW,对于基本皮层ARM gnu-arm-none-eabiENTRY()通常设置为 Reset_Handler 向量,.text必须以中断向量表开始。

我总是看到它手动设置。但可能会使用STARTUP()