2014-04-11 15 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.

Powiązane problemy