GCC, ARMboot - Создание автономного приложения без какой-либо библиотеки и любой ОС - PullRequest
8 голосов
/ 08 января 2010

У меня есть встроенная аппаратная система, которая содержит загрузчик на основе ARMboot (что очень похоже на Uboot и PPCboot).

Этот загрузчик обычно служит для загрузки образа uClinux из флэш-памяти. Однако сейчас я пытаюсь использовать этот загрузчик для запуска автономного приложения helloworld, которое не требует какой-либо связанной библиотеки. На самом деле, он содержит только код while(1){} в основной функции.

Моя проблема в том, что я не могу узнать, какие настройки GCC мне следует использовать для создания отдельного правильно отформатированного двоичного файла.

Я использую следующую команду сборки:

cr16-elf-gcc -o helloworld helloworld.c -nostdlib

, который выдает предупреждение:
предупреждение: не удается найти символ ввода _start; по умолчанию 00000004

После этого в загрузчике я загружаю произведенное приложение и запускаю его по некоторому адресу:

tftpboot 0xa00000 helloworld
go 0xa00004

Но это не работает :( Система перезагружается.

Обычно он должен просто зависать (из-за while(1)).

Ответы [ 4 ]

5 голосов
/ 08 января 2010

Я не знаю этого загрузчика, но я думаю, что вы должны использовать objcopy, как этот, чтобы записать ваши исполняемые данные в необработанный двоичный файл. Не переходите на заголовки эльфов, люди:)

objcopy -O binary ./a.out o.bin

Также попробуйте скомпилировать независимый от позиции код и прочитать руководства ld и gcc.

4 голосов
/ 08 января 2010

Компоновщик жалуется на отсутствие кода запуска.

Вам необходимо указать две вещи: код запуска и командный файл компоновщика, который определяет карту адресов вашего целевого процессора.

В вашем случае код запуска имеет вид «bl main», но обычно код запуска инициализирует указатель стека по крайней мере перед переходом к main.

Если вы знаете, что загружаете свой пример в ОЗУ, вы можете напрямую запустить программу. Вам нужно определить адрес main (), который будет использоваться для вашей команды "go".

1 голос
/ 08 января 2010

Я работаю на ARM non-os non-lib каждый день каждый день. Это мои текущие параметры gcc:

arm-what-gcc -Wall -O2 -nostdlib -nostartfiles -ffreestanding -c hello.c -o hello.o

тогда я использую компоновщик, чтобы объединить код C с таблицами векторов и т. Д., Даже если это не изображение, которому нужна таблица векторов, с использованием таблицы векторов легко установить точку входа в первую инструкцию. 1005 *

0 голосов
/ 08 января 2010

По какой причине вы не можете статически связать хотя бы стандартные библиотеки? Вы должны иметь работающую программу и преимущества стандартных библиотек без внешних зависимостей.

Кроме того, обеспечивает ли ваша цепочка инструментов / IDE различие между "автономным приложением" и "приложением linux"? IDE для AVR32 имеет такое различие и может генерировать либо программу, которая работает во встроенной среде Linux, либо отдельную программу, которая в основном становится ОС.

...