2016-05-31 24 views
0

我在GCC鏈接腳本條目,並啓動命令有點困惑。鏈接功能,具體地址

如這裏指出:http://wiki.osdev.org/Linker_Scripts

ENTRY()使要被鏈接作爲.text段的第一項的任何符號。 另一方面,STARTUP()使整個編譯文件作爲第一項放置在.text節中。

在我的項目但是它的表現很奇怪。

我使用GNU-臂無 - EABI工具鏈,在我的鏈接腳本命令輸入(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

我對此不是100%肯定,但看起來像ENTRY()set是執行時的PC起點,而STARTUP()是.text – xvan

+0

中的第一個鏈接對象哦,這是真的。 「是加載程序的第一個字節(或ELF和PE二進制文件中.text部分的第一個字節)。」但我的程序既不是ELF也不是PE二進制文件。非常感謝。把它作爲答案,我會接受它。 – DawidPi

回答

1

ENTRY()設定PC起點上的執行,和STARTUP()在.text第一鏈接對象

順便說一句,對於baremental皮質ARM gnu-arm-none-eabiENTRY()通常被設置到Reset_Handler矢量和.text必須開始與中斷向量表一起使用。

我一直看到了手動設置。但也可以使用STARTUP()