Могу ли я смешать arm-eabi с arm-elf?
У меня есть продукт, который загрузчик и приложение компилируются с помощью компилятора (gnuarm GCC 4.1.1), который генерирует "arm-elf".
Загрузчик и приложение разделены в разных областях флэш-памяти в сценарии компоновщика.
Приложение имеет функцию, которая позволяет ему вызывать загрузчик (как простая c-функция с 2 параметрами).
Мне нужно иметь возможность обновлять существующие продукты по всему миру, и я могу смело делать это, используя всегда один и тот же компилятор.
Теперь я хотел бы иметь возможность скомпилировать это приложение, используя новую версию GCC, которая выводит arm-eabi.
Все будет хорошо для новых продуктов, где и приложение, и загрузчик компилируются с использованием одного и того же набора инструментов, но что происходит с существующими продуктами? Если я прошью новое приложение, скомпилированное с помощью GCC 4.6.x и arm-none-eabi, сможет ли мое приложение по-прежнему вызывать функцию загрузчика из старого загрузчика arm-elf?
Кроме того, не имеет прямого отношения к вышеуказанному вопросу, могу ли я смешивать объектные файлы, скомпилированные с помощью arm-elf, в двоичный файл, скомпилированный с помощью arm-eabi?
РЕДАКТИРОВАТЬ:
Я думаю, это хорошо, чтобы дать понять, что я строю для чистого металла ARM7, если это имеет какое-то значение...
3 ответа
Нет. ABI - это магия, которая делает двоичные файлы совместимыми. Двоичный интерфейс приложения определяет различные соглашения о том, как взаимодействовать с другими библиотеками / приложениями. Например, ABI будет определять соглашение о вызовах, которое делает неявные предположения о вещах, таких как, какие регистры используются для передачи аргументов функциям C, и как обращаться с избыточными аргументами.
Я не знаю точных различий между EABI и ABI, но некоторые из них можно найти, ознакомившись с EABI. На странице Debian упоминается, что соглашение о системных вызовах отличается, наряду с некоторыми изменениями выравнивания.
Учитывая вышеизложенное, вы, конечно, не можете смешивать объекты "рука-эльф" и "рука-эаби".
Приведенный выше ответ дается в предположении, что вы говорите с кодом загрузчика в вашем основном приложении. Учитывая, что интерфейс может быть очень простым (просто вызов функции с двумя параметрами), возможно, он будет работать. Это был бы интересный эксперимент, чтобы попробовать. Тем не менее, ** не гарантировано ** для работы.
Пожалуйста, имейте в виду, что вам не нужно использовать EABI. Вы можете создать набор инструментов arm-elf с помощью gcc 4.6 так же, как и в старых версиях. Поскольку вы используете бинарный набор инструментов для Windows, у вас могут возникнуть дополнительные проблемы. Я бы посоветовал исследовать http://crosstool-ng.org/, который хорошо работает в Linux и может нормально работать на cygwin для создания соответствующего набора инструментов.
Всегда есть возможность сделать вызов загрузчику во встроенной сборке, и в этом случае вы можете придерживаться любого стандарта вызова, который вам нужен:).
Однако, помимо проблемы переносимости, которую он представляет, этот подход также сделает два предположения о вашем загрузчике и приложении:
- вы можете обнаружить в своем приложении, что на конкретном устройстве имеется загрузчик, созданный с помощью вашей не-EABI цепочки инструментов, так как вы можете вызывать только старый тип загрузчика, используя код сборки.
- два упомянутых вами параметра используются вашим загрузчиком в качестве примитивных данных. Если загрузчик использует их, например, как указатели на структуры, вы можете столкнуться с проблемами с неправильным выравниванием, заполнением и так далее.
Я думаю, что это будет хорошо. Я сам перенес что-то подобное, из того, что я помню, я столкнулся только с проблемой, связанной с обработкой деления.
Это лучшая информация, которую я могу найти о различиях, это говорит о том, что, если у вас нет проблем со структурным выравниванием, вы можете быть в порядке.