У меня есть встроенная аппаратная система, которая содержит загрузчик на основе 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)
).
Я не знаю, что погрузчик, но я думаю, что вы должны использовать objcopy, как это, чтобы выбросить свои исполняемые данные в необработанный двоичный файл. Не прыгайте на заголовки эльфа, люди :)
objcopy -O binary ./a.out o.bin
также пытаются компилировать независимый код позиции и читать руководства LD и GCC.
Связной человек жалуется на отсутствие кода запуска.
Нужно указать две вещи: код запуска и командный файл компоновщика, который определяет адресную карту целевого процессора.
В вашем случае код запуска как "bl main", но обычно код запуска инициализирует указатель стека, по крайней мере, перед ветвлением в main.
Если вы знаете, что загружаете свой пример в оперативную память, то можете запустить программу непосредственно в main. Вам нужно будет определить адрес, который ел main(), используя его для команды "go".
Я работаю на ARM нон-нон-либе весь день каждый день. Это мои текущие опции gcc:
arm-weverever-Gcc -Wall -O2 -nostdlib -nostartfiles -ffreestanding -c hello.c -o hello.o
тогда я использую компоновщик для объединения C-кода с векторными таблицами, и даже если это не изображение, которому нужна векторная таблица, используя векторную таблицу, легко поставить точку входа на первую инструкцию.
Любая причина, по которой вы не можете статистически связать хотя бы стандартные библиотеки? У вас должна быть рабочая программа и преимущества стандартных библиотек без внешних зависимостей.
Также ваша насадка / IDE обеспечивает дифференцировать «Автономное приложение» и «Приложение Linux»? IDE для AVR32 имеет это различие и способна генерировать либо программу, которая работает в пределах встроенной среды Linux или в стандартной программе, которая в основном становится ОС.