2012-02-17 16 views
32

Chcę zbudować statyczny świat powitalny z C używając arm-linux-gnueabi-gcc, w przeciwieństwie do używania autonomicznego toolbaina NDK lub Codesourcery w tym zakresie .Kompilowanie statycznego świata hello C na Androida przy użyciu arm-linux-gnueabi-gcc

W Ubuntu ...

Zrobiłem następujące:

sudo apt-get install gcc-arm-linux-gnueabi 

stworzyłem hi.c takiego:

#include <stdio.h> 

int main(int argc, char** argv) { 
    printf("hello world\n"); 
    return 0; 
} 

mam skompilowane to tak:

arm-linux-gnueabi-gcc -static hi.c -o hi 

I r to na emulatorze tak:

adb push hi /data/hi 
adb shell /data/hi 

Ale, mam to:

[1] Illegal instruction  /data/hi 

Co krok nie zapomniałem? Opierając się na wcześniejszych doświadczeniach, to "powinno" zadziałało, ale oczywiście to zepsułem.

+0

Btw .. Robiąc to na Ubuntu Oneiric Ocelot. Ponadto, arm-linux-gnueabi-gcc jest linkiem do wersji 4.6 gnueabi-gcc. – corbin

+0

Jaka jest twoja wersja Ubuntu? Jaka jest wersja pakietu SDK lub inne szczegóły emulatora? –

Odpowiedz

3

Jeśli zrobię to na maszynie Debiana (VM w moim przypadku), wszystko wydaje się dobrze. Nie jestem pewien, co jest złego w robieniu czegoś podobnego na ubuntu. Mogło być tak, jak sugerował Leo, ale nie mogę tego potwierdzić. To powinno jednak działać dla ciebie.

http://www.cnx-software.com/2012/01/16/installing-emdebian-arm-cross-toolchain-in-debian/

Ktoś dodał ten link, ale nie korzysta z toolchain wspomniałem w opisie. Pozostawienie go na wypadek, gdyby ktoś był zainteresowany.

http://tariqzubairy.wordpress.com/2012/03/09/arm-binaries-static-library-for-android/

1

Z tego co wiem, nie można uruchamiać aplikacji użytkownika do systemu Android, które nie są skompilowane z jakąś formą gcc-arm-linux-androideabi.

+0

Dokonano tego za pomocą tego samego toolchain, kodu źródłowego i innych. Po prostu szukam brakującego kroku. – corbin

+1

Niepoprawnie. Działa na przykład z armv5tel-redhat-linux-gnueabi-gcc. Dopóki kompilujesz statyczne pliki binarne, a architektura jest odpowiednia, działa. – thejh

14

Spróbuj podać architekturę/procesor. Wygląda na to, że kompilator tworzy kod o wyższej wersji architektury, niż może sobie z tym poradzić emulator.

Może to działa:

arm-linux-gnueabi-gcc -static -march=armv5 hi.c -o hi 
+0

Dzięki za odpowiedź. Natychmiastowy wynik (wykopię więcej), otrzymasz ostrzeżenie: docelowy procesor nie obsługuje instrukcji THUMB [domyślnie włączone]. Ale nadal generuje wynik. Następnie, jeśli popchnę to do urządzenia, otrzymam tę samą Nielegalną instrukcję. – corbin

+1

Jeśli użyłem -march = armv5te, nie otrzymam ostrzeżenia, ale nadal otrzymuję komunikat o nieprawidłowej instrukcji. Podobne, jeśli użyję -march = armv5te -mthumb. – corbin

+2

Możliwe, że standardowe biblioteki dla arm-linux-gnueabi-gcc używają architektury wyższej niż emulator (brzmi to dziwnie). Ten sam błąd wystąpił podczas kompilacji przy użyciu CodeSourcery dla urządzenia z procesorem ARMv4. Apparantly biblioteki CodeSourcery były wszystkie ARMv5. – Leo

-2

Czy sprawdzić uprawnienia folderu danych? Spróbuj użyć lokalnego zamiast tego! Możesz po prostu użyć powłoki adb, a następnie cd w folderze, w którym plik wykonywalny został naciśnięty, i wypróbować ./hi. Domyślam się, że to tylko kwestia uprawnień

+2

Czy nie powinien więc narzekać na odmowę zgody, a nie na nielegalne instrukcje? Nie sądzę, bym kiedykolwiek dostał "Nielegalne instrukcje", chyba że naprawdę był jakiś problem z binarną. – Leo

+0

(Tak, ta odpowiedź jest oczywiście błędna). –

9

on pracował dla mnie z CodeBench kompilatora na Ubuntu pulpicie. https://sourcery.mentor.com/sgpp/lite/arm/portal/release2029

Wystarczy utworzyć statyczną binarnych z tym poleceniem:

arm-none-linux-gnueabi-gcc -o cześć -static hello.c

wtedy, adb Push hello/dane

przejdź do, adb shell $ ./data/hello To wydrukuje Hello World na terminalu. To samo można zrobić także z telefonu.Użyj emulatora terminalu lub powłoki basha SL4A, aby wykonać.

+1

To powinna być zaakceptowana odpowiedź, chociaż wyjaśnij jej polecenia i parametry. –

0

Twój kod faktycznie działa dla mnie.

Skompilowałem go na Ubuntu i przesunąć go do/data/local/tmp

A potem chmod 777 hi

Wreszcie to działa dobrze.

+0

Odkryłem (nie jestem pewien, czy to wciąż jest prawdą), że kompilator cross, który pobierał ubuntu, domyślnie obsługiwał tylko hard float, a moje urządzenie było starsze, które z nim nie działało. – corbin

Powiązane problemy