以Keil为例。注意两个引入的符号:SystemInit和__main。SystemInit毫无疑问是C代码中提供的,而__main却在代码中找不到。代码中写的是main。 
这种写法就是依赖Keil编译器提供的load代码来搬运。代码流程: 
__main --> __scatterload ....... 
           --> main 
 
Reset_Handler    PROC 
                 EXPORT  Reset_Handler             [WEAK] 
        IMPORT  SystemInit 
        IMPORT  __main 
 
                 LDR     R0, =SystemInit 
                 BLX     R0 
                 LDR     R0, =__main 
                 BX      R0 
                 ENDP 
 
实际上,也可以自己写代码做搬运动作。 
写法: 
                 LDR     R0, =SystemInit 
                 BLX     R0 
                 ;Write your own load code here 
                 LDR     R0, =main 
                 BX      R0 
                 ENDP 
 
 
这时就需要了解,在编译完成的Image中,Load View和Execute View的概念。 
链接器在链接的时候会生成每个section的符号:Base,Length,Limit之类。load代码需要根据这些符号确定搬运的源地址、目的地址,以及长度。 
具体可以查阅Keil帮助的Linker及Scatter file章节。 
3.3 Load View and Execution View of an Image 
6.4 Image$$ execution region symbols 
6.5 Load$$LR$$ load region symbols
 |