Каковы различия между C / C ++ голой металлической компиляцией и компиляцией для конкретной ОС (Linux)?

Предположим, у вас есть цепочка инструментов кросс-компиляции, которая создает двоичные файлы для архитектуры ARM.

Ваша цепочка инструментов выглядит следующим образом (работает на компьютере X86_64 с Linux):

  • arm-linux-gnueabi-gcc.exe: для кросс-компиляции для Linux, работающей на ARM.
  • arm-gcc.exe: для кросс-компиляции с голым металлом для ARM.

… и множество других инструментов для кросс-компиляции на ARM.

Вопросы, которые меня интересуют:

  • (E) ABI различия между двоичными файлами (если есть)
  • ограничения в случае «голого металла» (например, динамическое выделение памяти, использование статических конструкторов в случае C ++, модели потоков и т. д.)
  • различия двоичного уровня между двумя случаями с точки зрения информации, специфичной для каждого из них (например, поддержка отладочной информации и т. д.);

6

Решение

  • Различия ABI в том, как вы вызываете компилятор, например, GCC имеет -mabi и это могут быть «apcs-gnu», «atpcs», «aapcs», «aapcs-linux» и «iwmmxt».
  • На голом железе существуют ограничения для различных функций времени выполнения, потому что кто-то их не предоставил. Будь то инициализация нулевых выделенных областей или предоставление функций C ++. Если вы можете предоставить их, они будут работать.
  • Различия в двоичном уровне также зависят от того, как вы вызываете компилятор.

Ты можешь проверить Опции GCC ARM онлайн.

3

Другие решения

Недавно я начал небольшой проект по использованию стандартной библиотеки C Linux в среде с минимальным набором ресурсов. Я описывал это в своем блоге: http://ellcc.org/blog/?page_id=289
По сути, я настроил способ обработки системных вызовов Linux, чтобы путем реализации упрощенных версий определенных системных вызовов я мог использовать функции из стандартной библиотеки. Например, текущее состояние для ARM реализует упрощенные версии read (), readv (), write (), writev () и brk (). Это позволяет мне использовать printf (), fgets () и malloc () без изменений.

В моем случае я использую один и тот же компилятор для таргетинга на Linux и голый металл. Поскольку он основан на clang / LLVM, я также могу использовать тот же компилятор для работы с другими процессорами. Я сейчас работаю над голым металлическим примером для Mips.

Поэтому я думаю, что ответ заключается в том, что не должно быть никакой разницы.

1