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

У меня есть встроенная аппаратная система, которая содержит загрузчик на основе 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)).

8
задан Claudio 14 May 2013 в 18:36
поделиться

4 ответа

-

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

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

также пытаются компилировать независимый код позиции и читать руководства LD и GCC.

5
ответ дан 5 December 2019 в 17:38
поделиться

Связной человек жалуется на отсутствие кода запуска.

Нужно указать две вещи: код запуска и командный файл компоновщика, который определяет адресную карту целевого процессора.

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

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

4
ответ дан 5 December 2019 в 17:38
поделиться

Я работаю на ARM нон-нон-либе весь день каждый день. Это мои текущие опции gcc:

arm-weverever-Gcc -Wall -O2 -nostdlib -nostartfiles -ffreestanding -c hello.c -o hello.o

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

1
ответ дан 5 December 2019 в 17:38
поделиться

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

Также ваша насадка / IDE обеспечивает дифференцировать «Автономное приложение» и «Приложение Linux»? IDE для AVR32 имеет это различие и способна генерировать либо программу, которая работает в пределах встроенной среды Linux или в стандартной программе, которая в основном становится ОС.

0
ответ дан 5 December 2019 в 17:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: