2014-04-11 35 views
6

Załóżmy, że masz łańcuch narzędzi do kompilacji krzyżowej, który tworzy pliki binarne dla architektury ARM.Jakie są różnice między kompilacją C/C++ bare-metal a kompilacją dla określonego systemu operacyjnego (Linux)?

Twój narzędzie łańcuch jest tak (uruchomiony na komputerze z systemem Linux x86_64):

  • arm-linux-gnueabi-gcc.exe: do cross-kompilacji dla Linux działa na ARM.
  • arm-gcc.exe: w przypadku kierowania na krzyżyk w systemie ARM.

... i mnóstwo innych narzędzi do kompilacji krzyżowej na ARM.

Punkty że jestem zainteresowany to:

  • różnice (E) ABI między plików binarnych (jeśli występują)
  • ograniczenia w przypadku gołego metalu (jak alokacji pamięci dynamicznej, korzystanie z konstruktorów statycznych w przypadku C++, modelowania wątków itp.)
  • różnice poziomu binarnego między 2 przypadkami pod względem informacji specyficznych dla każdego z nich (np. obsługa informacji debugowania itp.);
+0

To brzmi jak "różnica między moim małym programem a moim systemem operacyjnym" ... – deviantfan

+0

@deviantfan: Brzmi bardziej jak "Czy mogę używać wszystkich" normalnych "funkcji C/C++, do których jestem przyzwyczajony do oprogramowania (bare-metal) rozwoju? " Po przeczytaniu tego artykułu tutaj: http://www.state-machine.com/arm/Building_bare-metal_ARM_with_GNU.pdf Zauważyłem pewne ograniczenia bare-metalu C/C++. Czy są jeszcze jakieś (i różnice)? :) – Liviu

+1

Dla * prawdziwego gołego metalu *, musisz napisać warstwę przenośności dla * newlib *. W systemie Gnu Linux: * eglibc * lub [* glibc *] (http: //en.wikipedia.org/wiki/GNU_C_Library). Zasadniczo, twoje pytanie brzmi, jaka jest różnica. Istnieje 1000s. Czy chcesz użyć 'mmap()'? Itd. Różnice binarne/kompilatora nie mają znaczenia (głównie). To biblioteki "C" są zupełnie inne. Plik we/wy? –

Odpowiedz

3
  • różnice ABI jest do sposobu powoływania kompilator np GCC ma -mabi i że może być jednym z 'APC-gnu', 'atpcs', 'aapcs', 'aapcs-linux' i "iwmmxt".
  • Ograniczenia typu "bare-metal" dla różnych funkcji środowiska wykonawczego istnieją, ponieważ ktoś ich nie podał. Bądź inicjatorem zero przydzielonych obszarów lub zapewnienie funkcji C++. Jeśli możesz je dostarczyć, będą działać.
  • Różnice poziomów binarnych zależą również od sposobu wywoływania kompilatora.

Możesz sprawdzić GCC ARM options online.

1

Niedawno rozpocząłem mały projekt, aby korzystać ze standardowej biblioteki C w Linuksie w środowisku bare-metal. Opisuję to na moim blogu: http://ellcc.org/blog/?page_id=289 Zasadniczo zrobiłem sposób na obsługę wywołań systemowych Linuksa, aby poprzez implementację uproszczonych wersji niektórych wywołań systemowych mogłem korzystać z funkcji ze standardowej biblioteki. Na przykład obecny stan ARM implementuje uproszczone wersje read(), readv(), write(), writev() i brk(). To pozwala mi na niezmienione używanie printf(), fgets() i malloc().

Jestem w moim przypadku, używam tego samego kompilatora do kierowania na Linuksa i bare-metalu. Ponieważ jest oparty na clang/LLVM, mogę również użyć tego samego kompilatora do kierowania na inne procesory. Pracuję teraz nad prostym przykładem Mipsa.

Sądzę więc, że odpowiedź brzmi, że nie musi to być żadna różnica.