2015-09-25 46 views
1

我试图生成一个映像,其中有一小部分代码用于初始化电路板(树莓派2B),将剩余的内容复制到高端内存中并开始运行其余代码那里。链接描述文件有什么问题

这个想法是,首先将整个图像加载到0x8000处,然后将“函数”复制到高端内存并启动,然后放弃0x8000中的内容。

它不起作用。我得到的错误从LD:

... 
/bin/ld: address 0x124ac of loader.elf section `.text2' is not within region `EXEC' 
... 
/bin/ld: address 0x1ff18 of loader.elf section `.bss' is not within region `EXEC' 
... 
/bin/ld: address 0x124ac of loader.elf section `.text2' is not within region `EXEC' 
... 
/bin/ld: address 0x1ff18 of loader.elf section `.bss' is not within region `EXEC' 
... 
/bin/ld: address 0x124ac of loader.elf section `.text2' is not within region `EXEC' 
... 
/bin/ld: address 0x1ff18 of loader.elf section `.bss' is not within region `EXEC' 
... 
/bin/ld: region `EXEC' overflowed by -520487144 bytes 
collect2: error: ld returned 1 exit status 
make: *** [loader.elf] Error 1 
make: Target `all' not remade because of errors. 

我的链接脚本:

ENTRY(_start) 

MEMORY 
{ 
    LOAD (rwx) : ORIGIN = 0x00008000, LENGTH = 512k /* initial */ 
    EXEC (rwx) : ORIGIN = 0x1f000000, LENGTH = 512k /* runtime */ 
} 

SECTIONS 
{ 
    /* Starts at LOADER_ADDR. */ 
    . = 0x8000; 
    __text_start = .; 
    .text : 
    { 
     *(.init) 
     *start1.o(.text) 
     *start1.o(.data) 
     *start1.o(.bss) 
     *(.text.startup) 
    } >LOAD 

    .text2 ALIGN(0x1000): 
    { 
     __code_begin = .; 
     *loader.o(.text) 
     *rpi2.o(.text) 
     *serial.o(.text) 
     *util.o(EXCLUDE_FILE(*instr_util.o).text) 
     *gdb.o(.text) 
     *(.text) 
    } >EXEC AT>LOAD 
    __text_end = .; 


    __data_start = .; 
    .data : 
    { 
     *(.data) 
    } >EXEC AT>LOAD 
    __data_end = .; 


    __bss_start = .; 
    .bss ALIGN(0x8): 
    { 
     bss = .; 
     *(.bss) 
     stacks = .; 
     . = . + 512; /* fiq stack size */ 
     __fiq_stack = .; 
     . = . + 1024; /* usr & sys stack size (common) */ 
     __usrsys_stack = .; 
     . = . + 16384; /* svc stack size (start-up) */ 
     __svc_stack = .; 
     . = . + 4096; /* irq stack size (serial) */ 
     __irq_stack = .; 
     . = . + 512; /* mon stack size */ 
     __mon_stack = .; 
     . = . + 512; /* hyp stack size */ 
     __hyp_stack = .; 
     . = . + 512; /* und stack size */ 
     __und_stack = .; 
     . = . + 16384; /* abrt stack size (gdb-stub) */ 
     __abrt_stack = .; 
    } >EXEC AT>LOAD 
    __bss_end = .; 

    __new_org = 0x1f000000; 


    /* gcc-generated crap */ 
    .note : 
    { 
     *(.note.*) 
    } >LOAD 

    .debug : 
    { 
     *(.debug*) 
    } >LOAD 

    __end = .; 
} 

它正常工作,当我只用> LOAD无处不(都在较低的内存)。 程序并不大:

 0x0001ff18    __bss_end = . 
     0x00032098    __end = . 

忘了提:这是一个裸机程序。

[编辑] 滑稽,这个工作(但我宁愿 '链状' ...)

.text2 0x1e000000: 
{ 
    __code_begin = .; 
    *loader.o(.text) 
    *rpi2.o(.text) 
    *serial.o(.text) 
    *util.o(EXCLUDE_FILE(*instr_util.o).text) 
    *gdb.o(.text) 
    *(.text) 
} AT>LOAD 

[/编辑]

回答

0

颇有些试验之后:“> EXEC AT >加载“工作。 它只是不喜欢'竞争定义':ALIGN(0x1000)。