2011-03-08 111 views
4

當我在一個ARM9處理器的基本C程序中定義全局變量時,我有問題。我使用的是EABI GNU編譯器,而從12KB精靈生成的二進制文件是4GB!我認爲這個問題與我的分散文件有關,但我無法繞開它。巨大的二進制文件與objcopy

我ROM的256KB(基地址0xFFFF0000地址)和RAM 32KBs(基本爲0x01000000)

SECTIONS { 
    . = 0xFFFF0000; 
    .text : { 
    * (vectors); 
    * (.text); 
    } 
    .rodata : { *(.rodata) } 
    . = 0x01000000; 
    sbss = .; 
    .data : { *(.data) } 
    .bss : { *(.bss) } 
    ebss = .; 
    bssSize = ebss - sbss; 
} 

而且我的程序如下:

int a=10; 
int main() { 
    int b=5; 
    b = (a>b)? a : b; 
    return b; 
}; 

如果我宣佈一個作爲一個局部變量,即沒有.data節,那麼一切正常。 好。任何幫助不勝感激。

--16th三月2011--
任何人都可以在這方面幫助,即時得到無處已經閱讀手冊,論壇等...
我的靴子,編譯命令和命令objcopy把粘貼下面

 .section "vectors" 
reset: b start 
undef: b undef 
swi: b swi 
pabt: b pabt 
dabt: b dabt 
    nop 
irq: b irq 
fiq: b fiq 
.text 
start: 
     ldr sp, =0x01006000 
     bl main 

stop: b  stop 

臂-NONE-EABI-GCC -mcpu = ARM926EJ-S -Wall -nostartfiles -Wall main.c中boot.s -o main.elf -T \ scatter_f ile
arm-none-eabi-objcopy ./main.elf --output-target = binary ./main.bin
arm-none-eabi-objdump ./main.elf --disassemble-all> ./main .dis

+0

和如果刪除行'文件有多大'。 = 0x01000000;' ? – fazo 2011-03-08 16:16:01

+0

它的364字節,如果我刪除RAM地址(0x01000000) – Damn 2011-03-16 15:03:18

回答

2

我發現了這個問題。 objcopy命令將嘗試創建鏈接描述文件中描述的整個地址空間,從最低地址到最高地址(包括其間的所有內容)。你可以告訴它只是生成ROM代碼如下:

objcopy把./main.elf -j ROM --output目標=二進制./main.bin

我也改了鏈接腳本略

MEMORY { 
    ram(WXAIL) : ORIGIN = 0x01000000, LENGTH = 32K  
    rom(RX) : ORIGIN = 0xFFFF0000, LENGTH = 32K      
} 

SECTIONS { 
    ROM : { 
    *(vectors); 
    *(.text); 
    *(.rodata); 
    } > rom 

    RAM : { 
    *(.data); 
    *(.bss); 
    } > ram 
} 
+0

但不是。數據段還挺重要的呢?我不能把它扔掉,如果你只是複製ROM部分,那裏的初始化數據就會丟失。 – user1273684 2014-11-21 21:42:41

+0

對@ user1273684有何評論? – ransh 2017-06-06 19:43:06

2

您正在創建一個文件,該文件將從地址0x01000000開始,並且至少包含地址0xFFFF0000。難怪它接近4GB。你喜歡什麼?如果您不需要它們,請嘗試使用選項-R刪除數據段(因爲如果準備ROM初始化文件可能是這種情況)。

+0

我不明白。我以爲鏈接器腳本是從0xFFFF0000開始的,它包含文本,向量和只讀數據(即ROM),所以從ffff0000到所有這些的大小。然後在地址0x01000000處爲數據和bss定義另一個段。這些部分之間的內容沒有定義,爲什麼它填滿了?如果我有一個全局變量,它只會填充它。我試圖使用-R,但我如何刪除未定義的內存部分? – Damn 2011-03-12 00:25:12

+0

elf文件似乎沒問題,只是二進制文件不正確。[link](readelf -l main。ELF) 精靈文件類型是EXEC(可執行文件) 入口點爲0xffff0000 有2個節目標題,開始在偏移52個 程序標題: 型膠印VirtAddr PhysAddr FileSiz MemSiz FLG對齊 LOAD 0x008000爲0x01000000爲0x01000000 0x00004 0x00004 RW爲0x8000 LOAD 0x010000 0xFFFF0000地址爲0xffff0000 0x00148 0x00148 RE爲0x8000 科段映射: 段部分... 00。數據 01的.text [\代碼] – Damn 2011-03-12 00:42:15