2015-05-28 5 views
15

Napisałem kod źródłowy .cc (w ecllipse), który używa biblioteki libcap do pobierania informacji związanych z ruchem sieciowym. Teraz utworzyłem wykonywalny plik binarny za pomocą ndk-build w ecllipse. Pchnąłem utworzony plik binarny w folderze libs/armeabi do/data/local/folderu mojego Androida (rooted nexus 5, Lollypop) i spróbowałem wykonać plik binarny. ale android rzuca ten błądNiezależne pliki wykonywalne pozycji i system Android Lollipop

Error: only position independent executables (PIE) are supported

ja nie wiem nic o PIE, proszę mi powiedzieć, jak utworzyć pozycję niezależnego wykonywalnego.

+0

rozwiązany, wystarczy dodać te dwie linie w Android.mk złożyć –

+1

LOCAL_CFLAGS + = -fPIE LOCAL_LDFLAGS + = -fPIE -pie –

Odpowiedz

17

I don't know anything about PIE, Please tell me how to create a position independent executable.

stanowisko Samodzielnej wykonywalnych lub PIE umożliwia program zostać przeniesiona, podobnie jak wspólna obiektu. Przy każdym uruchomieniu programu program można załadować pod różnymi adresami, aby utrudnić osobie atakującej odgadnięcie określonego stanu programu.

Możesz skompilować i połączyć plik PIE na jeden z dwóch sposobów. Najpierw skompiluj wszystko za pomocą -fPIE i połącz z -pie. Drugim jest skompilowanie wszystkiego za pomocą -fPIC i połączenie z -pie.

Jeśli budujesz zarówno obiekt wspólny, jak i program, skompiluj wszystko za pomocą -fPIC. Połącz udostępniony obiekt z -shared i połącz program z -pie.

Nie można tego zrobić inaczej. Oznacza to, że nie można skompilować wszystkiego za pomocą -fPIE i zbudować zarówno obiektu wspólnego, jak i programu. Aby uzyskać szczegółowe informacje, patrz Code Generation Options w podręczniku GCC.


Jedno zwrócić uwagę na Androida: budynek z PIE przed 4.1 spowoduje błąd segmentacji w /system/bin/linker. PIE został dodany w systemie Android 4.1 i powoduje zawieszenie mniejszych wersji.

Ktoś powiedział mi, żebym dostarczył niestandardowe łącze/moduł ładujący, aby uniknąć problemu, ale nie mogę znaleźć w tej chwili referencji.

Zobacz także Security Enhancements in Android 1.5 through 4.1.


Error: only position independent executables (PIE) are supported

Tak, to jest cecha Lollipop. Zobacz Security Enhancements in Android 5.0.


Można sprawdzić, czy program jest zbudowany z użyciem readelf PIE:

$ readelf -l my-prog | grep -i "file type" 
Elf filetype is DYN (shared object file) 

Ważną częścią jest readelf donosi DYN, a nie zgłoszenie EXE. EXE oznacza, że ​​brakuje w nim PIE, a to powinno wywołać usterkę związaną z bezpieczeństwem.


pokrewne, zobacz Is PIE (Position-independent executable) for main executables supported in Android 4.0 (ICS)?

+0

Dzięki @jww za szczegółową odpowiedź –

+0

@jww miałem skompilowany łącznika bez tortu. Możesz go pobrać stąd http://lifepluslinux.blogspot.com/2015/01/installing-python-on-android-50.html – leet

4

Wiem, że to stary temat, ale to hacky sposób można zaoszczędzić trochę Ludowej czas
z Hex-Editor znaleźć 17 bajt, zmień wartość 02 do 03 , i to wszystko!

+0

To nie zadziałało. TY –