огромные двоичные файлы с objcopy - PullRequest
4 голосов
/ 08 марта 2011

У меня проблемы с определением глобальных переменных в базовой программе на Си для процессора ARM9. Я использую EABI GNU компилятор, и двоичный файл, сгенерированный из эльфа 12 КБ, составляет 4 ГБ! Я предполагаю, что проблема связана с моим разбросанным файлом, но у меня возникают проблемы с его обработкой.

У меня 256 КБ ПЗУ (базовый адрес 0xFFFF0000) и 32 КБ ОЗУ (база 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;
};

Если я объявлю a как локальную переменную, то есть раздела .data нет, тогда все будет работать. хорошо. Любая помощь с благодарностью.

- 16 марта 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

arm-none-eabi-gcc -mcpu = arm926ej-s -Wall -nostartfiles -Wall main.c boot.s -o main.elf -T \ scatter_file
arm-none-eabi-objcopy ./main.elf --output-target = binary ./main.bin
arm-none-eabi-objdump ./main.elf --disassemble-all> ./main.dis

Ответы [ 2 ]

2 голосов
/ 17 марта 2011

Я нашел проблему.Команда objcopy попытается создать все адресное пространство, описанное в сценарии компоновщика, от самого низкого адреса до самого высокого, включая все промежуточные.Вы можете указать ему просто сгенерировать код ПЗУ следующим образом:

objcopy ./main.elf -j ROM --output-target = binary ./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 
}
2 голосов
/ 08 марта 2011

Вы создаете файл, который начинается с адреса 0x01000000 и будет содержать как минимум до адреса 0xFFFF0000.Не удивительно, что это почти 4 ГБ.Что бы вы хотели?Попробуйте с опциями -R удалить сегменты данных, если они вам не нужны (как, вероятно, имеет место при подготовке файла инициализации ПЗУ).

...